[LIBGDX学习]LibGDX代码详解(二十三)Box2D 传送带

package com.mygdx.game.box2d;

import com.badlogic.gdx.Input;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.CircleShape;
import com.badlogic.gdx.physics.box2d.Contact;
import com.badlogic.gdx.physics.box2d.ContactImpulse;
import com.badlogic.gdx.physics.box2d.ContactListener;
import com.badlogic.gdx.physics.box2d.EdgeShape;
import com.badlogic.gdx.physics.box2d.Fixture;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.Manifold;
import com.badlogic.gdx.physics.box2d.PolygonShape;
import com.badlogic.gdx.physics.box2d.World;

public class ConveyorBelt extends Box2DTest implements ContactListener {
	Fixture m_platform;

	@Override
	protected void createWorld (World world) {
		world.setContactListener(this);

		// Ground
		{
			BodyDef bodyDef = new BodyDef();
			groundBody = world.createBody(bodyDef);

			EdgeShape shape = new EdgeShape();
			shape.set(new Vector2(-20.0f, 0.0f), new Vector2(20.0f, 0.0f));
			groundBody.createFixture(shape, 0.0f);
		}

		// Platform
		{
			BodyDef bd = new BodyDef();
			bd.position.set(-5.0f, 5.0f);
			Body body = world.createBody(bd);

			PolygonShape shape = new PolygonShape();
			shape.setAsBox(10.0f, 0.5f);

			FixtureDef fd = new FixtureDef();
			fd.shape = shape;
			fd.friction = 0.8f;
			m_platform = body.createFixture(fd);
		}

		// Boxes
		for (int i = 0; i < 5; ++i) {
			BodyDef bd = new BodyDef();
			bd.type = BodyType.DynamicBody;
			bd.position.set(-10.0f + 2.0f * i, 7.0f);
			Body body = world.createBody(bd);

			PolygonShape shape = new PolygonShape();
			shape.setAsBox(0.5f, 0.5f);
			body.createFixture(shape, 20.0f);
		}
	}

    /**
     * Pre-Solve Event
     * This is called after collision detection, but before collision resolution.
     * This gives you a chance to disable
     * the contact based on the current configuration.
     *
     * Contact Manifolds
     * Box2D has functions to compute contact points for overlapping shapes.
     * If we consider circle-circle or
     circle-polygon, we can only get one contact point and normal.
     In the case of polygon-polygon we can get
     two points. These points share the same normal vector so Box2D groups them
     into a manifold structure.
     The contact solver takes advantage of this to improve stacking stability.

     * @param contact
     * @param oldManifold
     */
	public void preSolve (Contact contact, Manifold oldManifold) {
/*		Fixture fixtureA = contact.getFixtureA();
		Fixture fixtureB = contact.getFixtureB();

		if (fixtureA == m_platform || fixtureB == m_platform) {// 为啥要定义两个相同fixture?
			//contact.setTangentSpeed(5.0f);
            contact.setTangentSpeed(-2.0f);// 意思是一接触就开始传送带。
		}*/
	}

	@Override
	public boolean keyDown (int keyCode) {
		if (keyCode == Input.Keys.SPACE) {
			world.dispose();
			world= new World(new Vector2(0, -10), true);
			createWorld(world);
		}

		return false;
	}

	@Override
	public void beginContact (Contact contact) {

	}

	@Override
	public void endContact (Contact contact) {
	}

	@Override
	public void postSolve (Contact contact, ContactImpulse impulse) {// 之前那个碰撞前这个接触后触发
        Fixture fixtureA = contact.getFixtureA();
        Fixture fixtureB = contact.getFixtureB();

        if (fixtureA == m_platform || fixtureB == m_platform) {// 为啥要定义两个相同fixture?
            //contact.setTangentSpeed(5.0f);
            contact.setTangentSpeed(5.0f);// 意思是一接触就开始传送带。
        }
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值