Мобильные платформы
GameDev.ru / Мобильные платформы / Форум / box2d (libGDX) тело почему-то не меняет своего положения

box2d (libGDX) тело почему-то не меняет своего положения

Поделиться
stu5002Постоялецwww16 авг. 201212:47#0
Есть такой код
package com.me.mygdxgame;
import com.badlogic.gdx.*;
import com.badlogic.gdx.physics.box2d.*;
import com.badlogic.gdx.math.*;
import com.badlogic.gdx.graphics.*;

public class PhysicsLayer
{
  World world;
  BodyDef groundBodyDef;
  Body groundBody;
  PolygonShape groundBox;
  
  float timeStep = 1 / 40;
  int velocityIterations = 6;
  int positionIterations = 2;
  
  BodyDef bodyDef;
  Body body;
  PolygonShape dinamicBox;
  FixtureDef fixtureDef;
  
  
  
  public PhysicsLayer()
  {
    world = new World(new Vector2(0, -100), true);
    groundBodyDef = new BodyDef();
    groundBodyDef.position.set(0, -10);
    groundBody = world.createBody(groundBodyDef);
    groundBox = new PolygonShape();
    groundBox.setAsBox(50, 10);
    groundBody.createFixture(groundBox, 0);
    
    bodyDef = new BodyDef();
    bodyDef.type = BodyDef.BodyType.DynamicBody;
    bodyDef.position.set(240, 160);
    body = world.createBody(bodyDef);
    body.setType(BodyDef.BodyType.DynamicBody);
    dinamicBox = new PolygonShape();
    dinamicBox.setAsBox(1, 1);
    fixtureDef = new FixtureDef();
    fixtureDef.shape = dinamicBox;
    fixtureDef.density = 1;
    fixtureDef.friction = 0.3f;
    body.createFixture(fixtureDef);
    body.resetMassData();
  }
  
  public String getWorld()
  {
    String out = "";
    for(int i = 0; i < 40; i++)
    {
      world.step(timeStep, velocityIterations, positionIterations);
    }
    out = String.valueOf(body.getPosition().x) + " " + String.valueOf(body.getPosition().y) + " " + String.valueOf(body.getAngle());
    return out;
  }
}

Метод getWorld() вызывается потом в рендере ApplicationListener'а  и всегда выдает стартовое положение динамического тела. Что я натворил не того? Помогите, прошу.

YukoПостоялецwww16 авг. 201213:13#1
А ты потом данные физики берешь для рендера?

public String getWorld()
  {
    String out = "";
    for(int i = 0; i < 40; i++)
    {
      world.step(timeStep, velocityIterations, positionIterations);
    }
    out = String.valueOf(body.getPosition().x) + " " + String.valueOf(body.getPosition().y) + " " + String.valueOf(body.getAngle());
    return out;
  }

Oh shit!

stu5002Постоялецwww16 авг. 201213:39#2
Что ты имеешь ввиду, когда спрашиваешь "...для рендера"? Не суть для чего я их использую, просто факт, что на выходе координаты не меняются.
В чем шит? В цикле? Это было в примере, который я использовал.
YukoПостоялецwww16 авг. 201214:08#3
>Что ты имеешь ввиду, когда спрашиваешь "...для рендера"?
После симуляции физики нужно взять позицию тела и задать объекту который выводится на экран.
>В чем шит?
1) В том что у тебя ф-я зовется getWorld()!!!, которая возвращает, непонятно кому нужною, строку
2) Проводит симуляцию физики, причем еще в цикле
stu5002Постоялецwww16 авг. 201214:26#4
Вот я не пойму, зачем писать все эти замечания? Мне от них толку ноль, вот честно. Помог бы лучше сначала решить проблему.
Про цикл я уже написал.
В рендере нет, не использую.
Строка нужна для вывода на экран, так как это сейчас наиболее удобный способ получать информацию о координатах в реальном времени.
Надеюсь, что эта информация поможет решить проблему.
YukoПостоялецwww16 авг. 201216:45#5
>В чем шит? В цикле?
>Вот я не пойму, зачем писать все эти замечания?
Противоречивые высказывания)

У тебя в примере только код, который относится к физике, и ничего нету как ты выводишь на экран.

andrey.mesheryakovПостоялецwww16 авг. 201218:39#6
Yuko
> У тебя в примере только код, который относится к физике, и ничего нету как ты
> выводишь на экран.

Если я все правильно понял, то человек столкнулся с проблемой, что позиция тела не обновляется.
Уважая других людей он локализовал проблемы и минимизировал код, который ее показывает.

По-моему вполне достаточно того, что строка с одними и теми же значениями.
Зачем тебе надо, что бы он показал еще свою отрисовку? Ведь и по строке понятно меняется позиция в физике или лет.

SemtikoПостоялецwww16 авг. 201218:55#7
Вообще нужно использовать PPM константу (пикселей на метр), потому что это неправильно - задавать размеры и координаты напрямую.
Ладно, чуть подкорректировал, надеюсь прикрутить не составит труда.

+ Показать

stu5002Постоялецwww17 авг. 20121:41#8
Уууу, заработало!!!
Долго и упорно искал причину почему код Semtiko работает, а мой нет, хотя практически все аналогично.
Оказалось, что после этого "float timeStep = 1 / 40;" в переменной timeStep окажется ноль, так что если исправить на "float timeStep = (float) 1 / 40;", то коробочка станет падать.
Но, конечно теперь буду использовать deltaTime / subSteps =)
А про перевод пикселей в метры и обратно - да, я знаю, что надо. Но это вроде бы уже при выводе изображения, а я то пока так, еще ничего не вывожу)
Вобщем спасибо всем, и особенно Semtiko, снова выручил)

/ Форум / Мобильные платформы / Общее

Тема в архиве.

2001—2017 © GameDev.ru — Разработка игр