LibGdx Почему метод sprite draw() меняет мои X и Y

Последние пару часов я отлаживал свою игру на LibGdx, пытаясь понять, почему некоторые спрайты перемещаются, а некоторые нет. У меня в основном есть класс LittleMan, который является классом игрока, и спрайт движется хорошо, когда я двигаю своего игрока. Тогда у меня есть другой класс Bullet, который представляет пули, но пули, которые я стреляю, не отрисовываются правильно. Я пытаюсь нарисовать их, начиная с позиции игрока, но он всегда рисует их из другой фиксированной точки на карте. (стартовая позиция игрока)

Теперь вот идет странная часть; я отладил свое приложение, чтобы попытаться понять, откуда исходит движение игрока, и странным образом координаты X и Y меняются каждый раз, когда я вызываю super.draw(batch). Я не понимаю, как или почему это происходит. Это хорошо, потому что это работает, но я хочу знать, как это работает, чтобы я мог использовать его для своих пуль.

Вот код для пояснения:

LittleMan.java:

private Texture littleMan;
private TextureRegion stand;
public LittleMan(Texture littleMan, World world) {
    super(new Sprite(littleMan));
    speed = 1;
    pv=50;
    stamina = 100;
    power = 1;
    defense = 1;
    this.world = world;
    defineMario();

    this.littleMan = littleMan;
    stand = new TextureRegion(getTexture(), 39, 21);
    setBounds(0,0,39,21);
    setRegion(stand);
}

public void update(float dt){

    setPosition(b2body.getPosition().x - getWidth()/2, b2body.getPosition().y - getHeight()/2);
}

public void defineMario() {
    BodyDef bdef = new BodyDef();
    bdef.position.set(32/ FacultyWars.PPM, 32/ FacultyWars.PPM);
    bdef.type = BodyDef.BodyType.DynamicBody;
    b2body = world.createBody(bdef);

    FixtureDef fdef = new FixtureDef();
    CircleShape shape = new CircleShape();
    shape.setRadius(30/ FacultyWars.PPM);

    fdef.shape = shape;
    b2body.createFixture(fdef);
}


@Override
public void draw(Batch batch){
    update(Gdx.graphics.getDeltaTime());
    super.draw(batch); //this is the line the coords change, tested with debugger and getY() and getX()

}

Bullet.java:

 private int bulletSpd;//speed
private int bulletRng;//range
private int dmg;//damage
//texture est déja dans sprite
private float rotation;
public World world;
public Body b2body;


public Bullet(Sprite sprite, int speed,int range, int dmg,float x, float y ,float rotation, World world){
    super(sprite);
    bulletRng=range;
    bulletSpd=speed;
    this.dmg=dmg;
    this.rotation=rotation;
    this.world = world;
    defineBullet(x,y);

}

public void defineBullet(float x, float y) {
    BodyDef bdef = new BodyDef();
    bdef.position.set(x/ FacultyWars.PPM, y/ FacultyWars.PPM);
    bdef.type = BodyDef.BodyType.DynamicBody;
    b2body = world.createBody(bdef);

    FixtureDef fdef = new FixtureDef();
    CircleShape shape = new CircleShape();
    shape.setRadius(30/ FacultyWars.PPM);

    fdef.shape = shape;
    b2body.createFixture(fdef);
}

@Override
public void draw(Batch batch){
    update(Gdx.graphics.getDeltaTime());
    super.draw(batch);
}

public void update(float dt){
    setPosition(b2body.getPosition().x - getWidth()/2, b2body.getPosition().y - getHeight()/2);
}

Объект Bullet создается с использованием этого кода:

    float rotation = littleMan.getRotation();
    float x =littleMan.b2body.getPosition().x;
    float y =littleMan.b2body.getPosition().y;
    Bullet bullet = new Bullet(new Sprite(new Texture("bullet.png")), 30, 500, 1, x, y, rotation,world);

Класс LittleMan был сделан другим студентом, но он не может объяснить мне, как он работает, поэтому я попытался скопировать его как можно лучше, но я действительно не могу понять, как:

  1. Чтобы пули рендерились из правильного места

  2. Почему метод draw() изменяет координаты x и y?

Кто-нибудь может мне помочь и объяснить, что происходит или что я делаю не так?

Вся помощь очень ценится!

2 ответа

Я думаю, что есть проблема в преобразовании (пиксель в метр)

float x = littleMan.b2body.getPosition().x*FacultyWars.PPM;
float y = littleMan.b2body.getPosition().y*FacultyWars.PPM;

Bullet bullet = new Bullet(new Sprite(new Texture("bullet.png")), 30, 500, 1, x, y, rotation,world);

А также update() Пуля должна быть

public void update(float dt){
    setPosition(b2body.getPosition().x*FacultyWars.PPM - getWidth()/2, b2body.getPosition().y*FacultyWars.PPM - getHeight()/2);
}

И аналогично update() LittleMan должен быть

public void update(float dt){

    setPosition(b2body.getPosition().x*FacultyWars.PPM - getWidth()/2, b2body.getPosition().y*FacultyWars.PPM - getHeight()/2);
}
  1. Чтобы пули рендерились из правильного места

Что такое "правильное место"? Вы явно устанавливаете это в положение маленького человека:

float x = littleMan.b2body.getPosition().x;
float y = littleMan.b2body.getPosition().y;

Я пытаюсь нарисовать их, начиная с позиции игрока, но он всегда рисует их из другой фиксированной точки на карте. (стартовая позиция игрока)

Вы хотите, чтобы они были на позиции игроков, но они отображаются на позиции игроков?

  1. Почему метод draw() изменяет координаты x и y?

В вашем методе обновления вы устанавливаете позицию в мировую позицию. Чтобы ответить на этот вопрос, вы должны проверить, меняются ли мировые координаты вашего объекта. Я предполагаю, что происходит следующее: вы создаете два объекта в одном месте (пуля и маленький человечек), они сталкиваются в мире и разрываются. Из-за этого они медленно отдаляются друг от друга.

Возможно, решением было бы отфильтровать столкновения между вашим маленьким человечком и его пулями, используя collisionBits или collisionGroups.

Другие вопросы по тегам