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 был сделан другим студентом, но он не может объяснить мне, как он работает, поэтому я попытался скопировать его как можно лучше, но я действительно не могу понять, как:
Чтобы пули рендерились из правильного места
Почему метод 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);
}
- Чтобы пули рендерились из правильного места
Что такое "правильное место"? Вы явно устанавливаете это в положение маленького человека:
float x = littleMan.b2body.getPosition().x;
float y = littleMan.b2body.getPosition().y;
Я пытаюсь нарисовать их, начиная с позиции игрока, но он всегда рисует их из другой фиксированной точки на карте. (стартовая позиция игрока)
Вы хотите, чтобы они были на позиции игроков, но они отображаются на позиции игроков?
- Почему метод draw() изменяет координаты x и y?
В вашем методе обновления вы устанавливаете позицию в мировую позицию. Чтобы ответить на этот вопрос, вы должны проверить, меняются ли мировые координаты вашего объекта. Я предполагаю, что происходит следующее: вы создаете два объекта в одном месте (пуля и маленький человечек), они сталкиваются в мире и разрываются. Из-за этого они медленно отдаляются друг от друга.
Возможно, решением было бы отфильтровать столкновения между вашим маленьким человечком и его пулями, используя collisionBits или collisionGroups.