提问者:小点点

LibGdx为什么sprite draw()方法会更改我的X和Y


在过去的几个小时里,我一直在调试我的LibGdx游戏,试图弄清楚为什么有些精灵在移动,而有些则没有。我基本上有一个LittleMan类,即玩家类,当我移动我的玩家时,精灵移动得很好。然后我有另一个类Bullet,它代表子弹,但我发射的子弹渲染不正确。我试着从玩家的位置开始画,但它总是从地图上的另一个固定点画。(选手的起始位置)

现在奇怪的部分来了;我调试了我的应用程序,试图理解玩家的移动来自哪里,奇怪的是,每次我调用super.draw(batch)时,X和Y坐标都会发生变化。我不明白这是怎么发生的,为什么会发生。它很好,因为它工作,但我想知道它是如何工作的,所以我可以用它来做我的子弹。

以下是一些需要澄清的代码:

利特尔曼.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()

}

项目符号.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课程是由一位同学制作的,但他也无法向我解释它是如何工作的,所以我试着尽我所能复制它,但我真的不知道如何:

> < li>

要使项目符号从正确的位置呈现

draw()方法到底为什么会改变x坐标和y坐标

谁能帮助我解释发生了什么或我做错了什么?

非常感谢所有的帮助!


共2个答案

匿名用户

    < li >使项目符号从正确的位置呈现

什么是“正确的位置”?您明确将其设置为littleman的位置:

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

我试着从玩家的位置开始画,但是它总是从地图上的另一个固定点开始画。(玩家的起始位置)

你想让它们出现在玩家位置,但它们是在玩家位置呈现的?

在你的更新方法中,你将位置设置为世界位置。要回答这个问题,你必须检查你的对象的世界坐标是否改变。我猜会发生以下情况:你在同一个地方创建了两个对象(子弹和利特曼),它们在世界上碰撞并被推开。因此,它们慢慢地彼此远离。

也许解决方案是使用碰撞位或碰撞组过滤掉你的小个子和他的子弹之间的碰撞。

匿名用户

我认为转换有问题(像素到米)

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);
}

同样,LittleMan的update()应该是

public void update(float dt){

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