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);// 意思是一接触就开始传送带。
}
}
}
[LIBGDX学习]LibGDX代码详解(二十三)Box2D 传送带
最新推荐文章于 2021-10-25 01:32:51 发布