繁体   English   中英

box2d:相机和身体未同步

[英]box2d : camera and body not synced

我正在尝试使用Box2D和libgdx制作一个程序,使角色跳到静态物体上(这里是一个圆圈)。 但是,即使我的角色按预期停留在圆圈的顶部,我的摄像头(跟随动态物体(播放器)的镜头)仍会下降。 因此,我的问题是:1)为什么应该跟随静止在机身上方的“ playerBody”,我的相机为何不断摔倒? 2)为什么当我按Z键而不是播放器机身时相机会反弹?

提前致谢。 您可以尝试在eclipse中运行它,以更好地理解我的意思,这是我在Activity类中输入的内容:

(我完全没有错误/警告。)

//private SpriteBatch batch;
//private Texture texture;
//private Sprite sprite;
//public Body body;
World world;
Body playerBody;
Body planetBody;
CircleShape planetCircle;
PolygonShape playerBox;
OrthographicCamera camera;
Box2DDebugRenderer debugRenderer;  
static final float BOX_STEP=1/60f;  
static final int BOX_VELOCITY_ITERATIONS=6;  
static final int BOX_POSITION_ITERATIONS=2;  
static final float WORLD_TO_BOX=0.01f;  
static final float BOX_WORLD_TO=100f;
boolean jump = false;
long lastGroundTime = 0;

@Override
public void create() {

    world = new World(new Vector2(0, -50), true);
    debugRenderer = new Box2DDebugRenderer();
    camera = new OrthographicCamera();  
    camera.viewportHeight = 320;  
    camera.viewportWidth = 480;  
    camera.position.set(camera.viewportWidth * .5f, camera.viewportHeight * .5f, 0f); 
    camera.update();
    //Ground body

    /*BodyDef groundBodyDef =new BodyDef();  
    groundBodyDef.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2 - 100 + 125);  
    Body groundBody = world.createBody(groundBodyDef);  
    PolygonShape groundBox = new PolygonShape();  
    groundBox.setAsBox((camera.viewportWidth) * 2, 10.0f);  
    groundBody.createFixture(groundBox, 0.0f);
    */

    //Planet

    BodyDef planetDef = new BodyDef();
    planetDef.type = BodyType.StaticBody;
    planetDef.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2 - 100);
    Body planetBody = world.createBody(planetDef);
    CircleShape planetCircle = new CircleShape();
    planetCircle.setRadius(125f);
    FixtureDef planetFixtureDef = new FixtureDef();
    planetFixtureDef.shape = planetCircle;
    planetFixtureDef.density = 1.0f;
    //planetFixtureDef.friction = 0.0f;
    //planetFixtureDef.restitution = 0;
    planetBody.createFixture(planetFixtureDef);

    //Player

    BodyDef playerBodyDef = new BodyDef();
    playerBodyDef.type = BodyType.DynamicBody;
    playerBodyDef.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2 - 100 + 125 + 50);
    playerBody = world.createBody(playerBodyDef);
    PolygonShape playerBox = new PolygonShape();
    playerBox.setAsBox(5.0f, 15.0f);
    FixtureDef playerFixtureDef = new FixtureDef();
    playerFixtureDef.shape = playerBox;
    playerFixtureDef.density = 1.0f;
    //playerFixtureDef.friction = 1.0f;
    //playerFixtureDef.restitution = 1;
    playerBody.createFixture(playerFixtureDef);
    playerBody = world.createBody(playerBodyDef);

    //Dynamic Body  
    /*BodyDef bodyDef = new BodyDef();  
    bodyDef.type = BodyType.DynamicBody;  
    bodyDef.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2);  
    Body body = world.createBody(bodyDef);  
    CircleShape dynamicCircle = new CircleShape();  
    dynamicCircle.setRadius(5f);  
    FixtureDef fixtureDef = new FixtureDef();  
    fixtureDef.shape = dynamicCircle;  
    fixtureDef.density = 1.0f;  
    fixtureDef.friction = 0.0f;  
    fixtureDef.restitution = 1;  
    body.createFixture(fixtureDef); */

    Gdx.input.setInputProcessor(this);
}

@Override
public void dispose() {
    /*batch.dispose();
    texture.dispose();*/
    /*dynamicCircle.dispose();
    groundBox.dispose();*/
    playerBox.dispose();
    planetCircle.dispose();
}

@Override
public void render() {
    //Gdx.gl.glClearColor(1, 1, 1, 1);
    update();
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    /*batch.setProjectionMatrix(camera.combined);
    batch.begin();
    //sprite.draw(batch);
    batch.end();*/
    camera.position.set(playerBody.getPosition().x, playerBody.getPosition().y, 0);
    camera.update();
    //camera.apply(Gdx.gl10);   
    debugRenderer.render(world, camera.combined);
    world.step(BOX_STEP, BOX_VELOCITY_ITERATIONS, BOX_POSITION_ITERATIONS);
    //playerBody.setAwake(true);
}

@Override
public void resize(int width, int height) {
}

@Override
public void pause() {
}

public void update()
{
    if(jump == true /*Gdx.input.isKeyPressed(Gdx.input.)*/ && grounded() == true)
    {
        playerBody.setLinearVelocity(0, 0);
        playerBody.applyLinearImpulse(new Vector2(0,150), new Vector2(playerBody.getPosition().x, playerBody.getPosition().y));
        jump = false;
    }
    //playerBody.setTransform(new Vector2(camera.viewportWidth / 2, playerBody.getPosition().y), playerBody.getAngle());
    //planetBody.setTransform(new Vector2(camera.viewportWidth / 2, camera.viewportHeight / 2), 0);
}
@Override
public void resume() {
}

@Override
public boolean keyDown(int keycode) {
//if(keycode == Keys.S) 
return false;
}

@Override
public boolean keyUp(int keycode) {
if(keycode == Keys.Z)
    jump = true;
return false;
}

public boolean grounded()
{
    if(playerBody.getPosition().y <= ((camera.viewportHeight / 2) - 100 + 125))
    {
        return true;
    }
    else
    {
        return false;
    }

}

您正在世界上创建两个playerBody 第二个已分配但没有固定装置。 这是您在代码中要处理的内容,而您的相机也在跟踪该内容。 删除第二个playerBody = world.createBody(playerBodyDef); 而且应该可以(更好)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM