Box2d机构没有响应输入

时间:2015-10-27 15:15:32

标签: java libgdx box2d gravity

我使用libgdx和box2d,我想让我的玩家身体跳跃。当我尝试使用某些方法时,即使它只是用于移动,也没有任何反应。

//gravity Vector2
Vector2 Gravity = new Vector2(0,-9.8);
//Box2d World
World world = New World(gravity);

//then I created my player body
public void createPlayer(){
    BodyDef def = new BodyDef();
    def.type = BodyDef.BodyType.DynamicBody;
    def.fixedRotation = true;
    def.position.set(80, 200);
    player = world.createBody(def);

    PolygonShape shape = new PolygonShape();
    shape.setAsBox(20, 20);
    player.createFixture(shape, 1f);
    shape.dispose();
}

//this is the jump method
public void jump(){
    if(Gdx.input.justTouched() == true) {
        player.applyForceToCenter(0, 900, false);
        System.out.println("touched");//to make sure the touch is working`
    }
}

没有任何事情发生,玩家的身体直到碰到一个静止的身体才会下降,每当我触摸屏幕时,它只会打印出“触摸”的状态。字符串。

更新

不确定这是否是它无法正常工作的原因,我有两个类用于渲染,一个用于更新。在更新类中,我设置了world.step(),而不是直接设置到我的身体所在的类。

//class for updating

public void update(float deltaTime){
    physics.world.step(1 / 60f, 6, 2);
    physics.jump(); //calling jump method from Physics class
}

对于渲染类,Box2dDebugRenderer与我的身体

分开

更新

我解决了这个问题,我连接到Update和Render类的Physics类引用了主类的create方法,我不明白,因为那是我为我其他课程的构造函数。

public void create(){
    physics = new Physics(); //object for the Physics constructor.
}

2 个答案:

答案 0 :(得分:1)

问题是您正在使用以米为单位的box2d比例 所以你的盒子你的创造是(20米x 20米),所以#34; 300"提升它是不够的 要使用box2d,您需要转换您的值

将所有box2d值除以" WOLRD_TO_BOX"价值尺度

这篇文章可能有用

Libgdx Box2D pixel to meter conversion?

祝你好运

更新:

尝试更改

Gdx.input.justTouched() 

Gdx.input.isTouched()

因为JustTouched()方法只调用一次(不是以连续方式)

答案 1 :(得分:1)

您的jump()World.step(...)debugRender.render(...)函数应该采用render()方法,而createPlayer() on应该采用create()方法

 @Override
 public void create() {
        createPlayer()

 }

 @Override
 public void render() {
    //OpenGL settings
     Gdx.gl.glClearColor(0, 0, 0, 1);
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

     world.step(TIME_STEP, VELOCITY_ITERATIONS, POSITION_ITERATIONS);
     jump();
     debugRendrer.render(world, camera.combined);
}