2015-10-27 3 views
3

Я использую libgdx и box2d, и я хочу, чтобы тело моего игрока прыгало. Ничего не происходит, когда я пытаюсь использовать некоторые методы, даже если это просто для перемещения.Корпус 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` 
    } 
} 

Ничто не происходит, и тело игрока просто падает, пока он не сталкивается со статическим телом, каждый раз, когда я прикасаюсь к экрану он только печатает на «прикоснулся» строку.

UPDATE

Не уверен, если это является причиной того, почему он не работает, у меня есть два класса, один для рендеринга и один для обновления. В классе обновления я устанавливаю 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

Я исправил проблему, мой физический класс, который подключен к Update и Рендер класс имел ссылка на метод создания основного класса, я не понимаю, потому что это то, что я сделал для конструктора других классов.

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

ответ

1

Проблема заключается в том, что вы работаете с Box2D шкалы, которая находится в метре Так что ваш ящик ваши создают, (20 метр х 20 метра), поэтому сила «300» не достаточно, чтобы переместить его вверх работать с box2d вам нужно конвертировать ваши ценности

делят все свои Box2D значение на «WOLRD_TO_BOX» значение масштаба

этот пост может быть полезным

Libgdx Box2D pixel to meter conversion?

Успехов

Update:

попробуйте изменить

Gdx.input.justTouched() 

к

Gdx.input.isTouched() 

, так как метод JustTouched() вызывается только один раз (а не в продолжить путь)

+0

Я попытался установить тело 5х5 метра, то усилие до 900, но то же самое случается, также вы можете установить вес тела? –

+0

вы можете поместить плотность тела в fixtureDef: попробуйте что-то вроде: fixtureDef.density = 0.1f – Netero

+0

см. Обновление моего ответа, которое вы вызываете Gdx.input.justTouched(), который вызывается только один раз – Netero

1

Ваш jump(), World.step(...), debugRender.render(...) функция должна идти по методу render() и createPlayer() на должны быть на методе 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); 
} 
+0

Да, это то, что я сделал, в моем классе рендеринга у меня есть свой собственный метод визуализации, который идет к методу рендеринга в основном классе, то же самое для моего метод обновления. –

+0

Также это значение для моего шага, physicalClass.world.step (1/60f, 6, 2); –

+0

Нет ничего плохого в том, что вы используете, просто убедитесь, что методы находятся там, где есть нужное место – Netero