libgdx和Box2d碰撞优化

时间:2014-11-26 19:13:07

标签: java android libgdx box2d

我是Libgdx的新手,我对碰撞/移动的最佳方式感到有些困惑。它让我很烦心,除非我知道我的做法不是错误的,否则我似乎无法继续前进。

这是我目前正在使用的课程。

public class Play extends GameState{
    public Play(GameStateManager {
        super(gsm);
        world = new World(new Vector2(0, -9.81f), true);
        b2dr = new Box2DDebugRenderer();

        cl = new MyContactListener();
        world.setContactListener(cl);

        createPlayer();

        b2dCam = new OrthographicCamera();
        b2dCam.setToOrtho(false, Game.V_WIDTH / PPM, Game.V_HEIGHT / PPM);
    }

    public void update(float dt) {

        handleInput();

        player.update(Gdx.graphics.getDeltaTime());

        world.step(dt, 6, 2);
    }

     public void render() {
        Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);

        cam.update();

        tmr.setView(cam);
        tmr.render();

        sb.setProjectionMatrix(cam.combined);
        player.render(sb);

        b2dr.render(world, b2dCam.combined);
    }



    public void handleInput() {
        if(MyInput.isPressed(MyInput.BUTTON1)){
            if(cl.isPlayerOnGround()){
                player.getBody().applyForceToCenter(0, 150, true);
            }
        }



        if(MyInput.isDown(MyInput.BUTTON2)){
                if(cl.isPlayerOnGround())
                 player.setVelocity(new Vector2(1, player.getVelocity().y));
                else if(Math.abs(player.getVelocity().y) < .3)
                    player.getBody().applyLinearImpulse(.15f, 0, player.getPosition().x, player.getPosition().y, true);
        }else{
            if(MyInput.isDown(MyInput.BUTTON3)){
                    if(cl.isPlayerOnGround()) {
                        player.setVelocity(new Vector2(-1, player.getVelocity().y));
                    }else if(Math.abs(player.getVelocity().y) < .3){
                            player.getBody().applyLinearImpulse(-.15f, 0, player.getPosition().x, player.getPosition().y, true);
                    }
            }else{
                if(cl.isPlayerOnGround())
                    player.setVelocity(new Vector2(0, player.getVelocity().y));
            }
        }
    }
}

我的播放器类扩展了这个

public class AnimationHandler {
protected Body body;
protected Animation animation;
protected float width;
protected float height;

private float time;



public AnimationHandler(Body body){
    this.body = body;
    animation = new Animation(1/12f);
}

public void setAnimation(TextureRegion[] region, float delay){
    animation = new Animation(delay, region);
    width = region[0].getRegionWidth();
    height = region[0].getRegionHeight();
}

public void render(SpriteBatch sb){
    time += Gdx.graphics.getDeltaTime();

    sb.begin();
    sb.draw(
            animation.getKeyFrame(time, true),
            body.getPosition().x * B2DVars.PPM - width / 2,
            body.getPosition().y * B2DVars.PPM - width / 2
    );
    sb.end();
}

public Body getBody() {
    return body;
}

所以我想看看的主要内容是第一类(Play)方法handleInput()。我目前正在使用player.setVelocity()作为移动。这对我来说是它自动进行左右行走的碰撞处理。我承认,它的效果非常好。但我希望有人对此持有意见,我一直觉得我在做这件事的方式存在缺陷。我想到的一个缺陷是,如果我有一个平台游戏类型的游戏,并且想要通过平台跳起来但是当我回来时落在它上面我不确定是否可能。因为它本身就是碰撞而不是手动正在做。有什么想法吗?任何输入都会非常感激,我是游戏编程的新手,我希望以最好的方式做事。

1 个答案:

答案 0 :(得分:1)

我认为Box2D非常适合制作平台游戏(我根据自己的经验知道)。 这里描述了一个很好的起点:http://www.badlogicgames.com/wordpress/?p=2017

另外,尝试防止创建不必要的新对象以减少gc压力:    player.setVelocity(new Vector2(1,player.getVelocity()。y));

每次创建一个新的Vector2,应该避免,因为它会产生垃圾。 在这种情况下body.setLinearVelocity(vx,vy);会更好