0
我想用box2d的摩擦接頭做一個簡單的例子。我創建了一個可以用鼠標或箭頭鍵控制的圓圈。還有一個盒子是用來圈選的。問題是,當我推箱子時,它一直在運動。我添加了一個輔助靜態盒子,這樣我就可以用摩擦接頭將兩個盒子連接起來,以模擬自上而下的摩擦。但它不起作用。這是代碼。libgdx box2d摩擦接頭不能正常工作
public class MyGdxGame extends ApplicationAdapter {
Camera camera;
int windowWidth, windowHeight;
World physicsWorld;
Box2DDebugRenderer debugRenderer;
Body frictionerBox;
Body boxBody;
Body circleBody;
@Override
public void create() {
camera = new OrthographicCamera(2, 2);
Box2D.init();
physicsWorld = new World(new Vector2(0, 0), true);
debugRenderer = new Box2DDebugRenderer();
// frictioner box
BodyDef bDef = new BodyDef();
bDef.type = BodyDef.BodyType.StaticBody;
bDef.position.set(0, 0);
frictionerBox = physicsWorld.createBody(bDef);
PolygonShape fShape = new PolygonShape();
fShape.setAsBox(10, 10);
FixtureDef fixDef = new FixtureDef();
fixDef.shape = fShape;
fixDef.density = 1.f;
fixDef.friction = 1.f;
//Fixture fix =
frictionerBox.createFixture(fixDef);
// box
bDef = new BodyDef();
bDef.type = BodyDef.BodyType.DynamicBody;
bDef.position.set(0, 50);
boxBody = physicsWorld.createBody(bDef);
PolygonShape bShape = new PolygonShape();
bShape.setAsBox(25, 25);
fixDef = new FixtureDef();
fixDef.shape = bShape;
fixDef.density = 1.f;
fixDef.friction = 1.f;
boxBody.createFixture(fixDef);
// circle
BodyDef cDef = new BodyDef();
cDef.type = BodyDef.BodyType.DynamicBody;
cDef.position.set(20, 20);
circleBody = physicsWorld.createBody(cDef);
CircleShape cShape = new CircleShape();
cShape.setRadius(12);
fixDef = new FixtureDef();
fixDef.shape = cShape;
fixDef.density = 1.f;
circleBody.createFixture(fixDef);
FrictionJointDef frictionJointDef = new FrictionJointDef();
frictionJointDef.maxForce = 10;
frictionJointDef.maxTorque = 10;
frictionJointDef.initialize(frictionerBox, boxBody, new Vector2(0, 0));
physicsWorld.createJoint(frictionJointDef);
bShape.dispose();
cShape.dispose();
fShape.dispose();
}
@Override
public void render() {
handleInput();
physicsWorld.step(Gdx.graphics.getDeltaTime(), 6, 2);
Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
debugRenderer.render(physicsWorld, camera.combined);
}
@Override
public void resize(int width, int height)
{
camera.viewportWidth = width;
camera.viewportHeight = height;
camera.update();
windowWidth = width;
windowHeight = height;
System.out.println("resized");
}
private void handleInput()
{
final float ARROW_SPEED = 60.0f;
final float MAX_SPEED = 200.f;
final float MIN_SPEED = 20.f;
float vx, vy;
if(Gdx.input.isTouched() || Gdx.input.isButtonPressed(Input.Buttons.LEFT))
{
int tx = (Gdx.input.getX() - windowWidth/2);
int ty = -Gdx.input.getY() + windowHeight/2;
float cx = camera.position.x;
float cy = camera.position.y;
float px = circleBody.getPosition().x;
float py = circleBody.getPosition().y;
px = px - cx;
py = py - cy;
vx = tx - px;
vy = ty - py;
float speed = (float) Math.sqrt(vx*vx + vy*vy);
if(speed > MAX_SPEED)
{
vx = (vx/speed) * MAX_SPEED;
vy = (vy/speed) * MAX_SPEED;
}
if(speed > 0 && speed < MIN_SPEED)
{
vx = (vx/speed) * MIN_SPEED;
vy = (vy/speed) * MIN_SPEED;
}
}
else
{
vx = vy = 0;
if(Gdx.input.isKeyPressed(Input.Keys.W))
{
vy += 1;
}
if(Gdx.input.isKeyPressed(Input.Keys.S))
{
vy -= 1;
}
if(Gdx.input.isKeyPressed(Input.Keys.A))
{
vx -= 1;
}
if(Gdx.input.isKeyPressed(Input.Keys.D))
{
vx += 1;
}
float speed = (float) Math.sqrt(vx*vx + vy*vy);
if(speed > 0.f)
{
vx = (vx/speed) * ARROW_SPEED;
vy = (vy/speed) * ARROW_SPEED;
}
}
circleBody.setLinearVelocity(vx, vy);
}
}
我在做什麼錯?
這可能會給你一些幫助http://stackoverflow.com/questions/11182997/in-libgdx-how-do-i-add-friction-to-a-box2d-body-object – Tauqir
感謝。我認爲在發佈我之前我已經看到了這個問題。但它不一樣。另一個問題是關於兩個物體接觸時的摩擦。在我的問題中,我指的是即使身體不接觸也應有效的摩擦接頭。不管怎樣,謝謝你 ! – user1754322