Как заставить тело b2box и спрайт вращаться с одинаковой скоростью? - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь сделать 2D-игру, и я застрял в создании тела box2D и textureRegion, чтобы вращаться с той же скоростью. Мой tetxureRegion вращается с большей скоростью, чем тело box2D. Я думаю, что проблема может исходить от "b2body.setAngularVelocity (-1)" и "rotate (-1)". Кто-нибудь, помогите мне, пожалуйста .... спасибо

public class VanishableBLock extends Sprite {

private World world;
private GameScreen screen;
public Body b2body;
public Vector2 velocity;
private float stateTime;
private TextureRegion picture;
private Rectangle rectangle;

public VanishableBLock(GameScreen screen, Rectangle rectangle) {
    this.rectangle = rectangle;
    this.world = screen.getWorld();
    this.screen = screen;
    setPosition((rectangle.getX()+rectangle.getWidth()/2) / MavisAdventure.PPM, (rectangle.getY() +rectangle.getHeight()/2)/ MavisAdventure.PPM);
    setOrigin(rectangle.getWidth()/2/ MavisAdventure.PPM,rectangle.getHeight()/2/ MavisAdventure.PPM);
    this.rectangle.height = rectangle.getHeight();
    this.rectangle.width = rectangle.getWidth();
    createVanishableBLock();
    velocity = new Vector2(0, 0.08f);
    picture = new TextureRegion(screen.getAtlas().findRegion("big_mario"), 80, 0, 16, 32);
    stateTime = 0;
    setRegion(picture);
    setBounds(getX(), getY(), rectangle.getWidth() / MavisAdventure.PPM, rectangle.getHeight() / MavisAdventure.PPM);
}
public void createVanishableBLock()
{
    BodyDef bdef = new BodyDef();
    bdef.position.set(getX(),getY());
    bdef.type = BodyDef.BodyType.DynamicBody;
    b2body = world.createBody(bdef);
    FixtureDef fdef = new FixtureDef();
    PolygonShape shape = new PolygonShape();
    shape.setAsBox(rectangle.getWidth()/2/MavisAdventure.PPM, rectangle.getHeight()/2/MavisAdventure.PPM);
    fdef.shape = shape;
    fdef.density = 1000;
    b2body.createFixture(fdef).setUserData(this);
}

public void update(float dt)
{
    stateTime +=dt;

    b2body.setAngularVelocity(-1);
    rotate(-1);             //these 2 cannot rotate at same speed

    b2body.setLinearVelocity(velocity );
    setPosition(b2body.getPosition().x - getWidth()/2, b2body.getPosition().y - getHeight()/2);
    setRegion(picture);
}
public void draw(Batch batch)
{
        super.draw(batch);
}

} enter image description here

1 Ответ

0 голосов
/ 18 ноября 2018

Из документов для Sprite :

поворот (градусы плавания)
Устанавливает вращение спрайта в градусах относительно текущего вращения.

и из документов для b2Body :

void b2Body :: SetAngularVelocity (float32 omega)
Установите угловую скорость.
Параметры
Омега новая угловая скорость в радианах / секунду.

Таким образом, один метод ожидает радианы, а другой - градусы. Вы должны конвертировать свою ценность.

Либо радианы в градусах: b2body.setAngularVelocity(-1 * 180.f / PI);

Или градусы в радианах: rotate(-1 * PI / 180.f);

, где PI - окончательное статическое значение, содержащее значение π.

Кроме того, эти методы также делают разные вещи: один устанавливает скорость, другой устанавливает относительный угол поворота. Даже после исправления параметров, будет только удача, если вы получите тот же результат, который может произойти, только если вы называете их каждый кадр, а длительность кадра точно соответствует угловой скорости box2d (это означает, что он вращается точно на омега каждый кадр).

Я бы рекомендовал скопировать фактический угол вашего объекта b2Body в спрайт, вместо того, чтобы физический движок и движок рендеринга вычисляли вращения. Физический движок должен иметь власть над положением и вращением объекта, в то время как средство визуализации должно просто визуализировать. Вот так:

setRotation(b2body.getAngle() * 180.f / PI);
...