2017-03-10 83 views
0

在過去的幾個小時裏,我一直在調試我的LibGdx遊戲,試圖找出爲什麼有些精靈在四處移動,有些則不在。我基本上有一個LittleMan類的玩家類,當我移動我的玩家時,精靈會沿着漂亮的方向移動。然後我有另一班班樂隊代表子彈,但我射擊的子彈無法正確渲染。我嘗試從玩家的位置開始繪製它們,但它總是從地圖上的另一個固定點繪製它們。 (首發球員的位置)LibGdx爲什麼sprite draw()方法會改變我的X和Y

現在,這裏是怪異的一部分;我調試了我的應用程序,試圖瞭解玩家的移動來自哪裏,奇怪的是,每次我調用super.draw(batch)時,X和Y座標都會改變。我不明白如何或爲什麼會發生這種情況。它的罰款,因爲它的作品,但我想知道它是如何工作的,所以我可以用它爲我的子彈。

下面是一些代碼澄清:

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:

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

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

使用該代碼創建的子彈對象

的Littl林二汶類是由一個同學做,但他可以給我它是如何工作沒有解釋任何所以我試圖複製它盡我所能,但我真的無法弄清楚如何:

  1. 爲了讓子彈渲染正確的地方

  2. 爲什麼地球上的draw()方法改變x和y COORDS

誰能幫我解釋一下是怎麼回事或者什麼,我做錯了什麼?

所有幫助非常感謝!

+0

什麼這些類是否延伸?setPosition是做什麼的? – Sebastian

+0

哦,是的,我很抱歉,完全忘了補充一點。它們都擴展了Sprite並且setPosition來自Sprite。 –

回答

0
  1. 爲了讓子彈從正確的地方

什麼是 「正確的位置」 呈現?你明確地將其設置爲littleman的位置:

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

我試着畫出他們從球員的位置開始,但它始終 吸引他們從地圖上的其他固定點。 (開始 玩家的位置)

你想要他們在球員的位置,但他們在球員的位置呈現?

  • 爲什麼地球上的draw()方法改變x和y COORDS
  • 在你的更新方法,你設置的位置,以世界上的地位。要回答這個問題,你必須檢查你的對象的世界座標是否改變。我猜想會發生以下情況:你在同一個地方創建兩個物體(子彈和小人物),它們在世界中相撞並被分開。正因爲如此,他們才慢慢相互離開。

    也許解決辦法是用collisionBits或collisionGroups過濾掉你的小人物和他的子彈之間的碰撞。

    +0

    所以對於第一個問題:正確的地方將從玩家位置開始。當我開始遊戲並且玩家尚未移動時,他們只出現在正確的位置。一旦玩家移動,玩家精靈將四處移動,但子彈不斷出現在同一位置(起始位置)。他們沒有跟隨玩家。這也會打破你對第二個問題的解釋,因爲他們不在同一個位置。我真的不知道爲什麼draw()會改變座標。這是一個問題的gif:https://gyazo.com/908a9def3992343cc05e28396c42ea1f謝謝! –

    0

    我覺得有問題的轉換(像素米)

    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); 
    } 
    
    相關問題