2017-03-10 4 views
0

J'ai débogué mon jeu LibGdx ces dernières heures pour essayer de comprendre pourquoi certains sprites se déplaçaient et d'autres pas. J'ai en gros une classe LittleMan qui est la classe des joueurs et l'esprit se déplace bien quand je bouge mon joueur. Ensuite, j'ai une autre classe Bullet qui représente les balles mais les balles que je tire ne sont pas rendues correctement. J'essaie de les dessiner à partir de la position du joueur mais il les tire toujours d'un autre point fixe sur la carte. (position de départ du joueur)LibGdx Pourquoi la méthode sprite draw() change-t-elle mon X et Y

Maintenant, voici la partie étrange; J'ai débogué mon application pour essayer de comprendre d'où venait le mouvement du joueur et étrangement les coords X et Y changent chaque fois que j'appelle super.draw (batch). Je ne comprends pas comment ou pourquoi cela arrive. C'est bien parce que ça marche mais je veux savoir comment ça marche donc je peux l'utiliser pour mes balles.

Voici un code pour clarifier:

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

Un objet Bullet est créé en utilisant ce code:

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

Le Littl classe Eman a été faite par un autre étudiant, mais il ne peut pas me expliquer comment cela fonctionne soit donc j'essayé de copier le meilleur que je pouvais, mais je ne peux vraiment pas comprendre comment:

  1. Pour rendre les balles rendent de le bon endroit

  2. Pourquoi diable le tirage au sort() méthode change x et y coords

quelqu'un peut-il me aider et expliquer ce qui se passe ou ce que je fais mal?

Toute aide est grandement appréciée!

+0

Qu'est-ce que ces classes s'étendent-elles et que fait setPosition? – Sebastian

+0

Oh ouais je suis désolé, totalement oublié d'ajouter cela. Ils étendent tous les deux Sprite et setPosition est de Sprite. –

Répondre

0
  1. Pour rendre les balles rendent le bon endroit

Quelle est la "bonne place"? Vous définissez explicitement à la position de Littleman:

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

j'essaie de les tirer à partir de la position du joueur, mais il les tire toujours d'un autre point fixe sur la carte. (commençant position du joueur)

Vous les voulez sur la position des joueurs mais ils sont rendus sur la position des joueurs?

  1. Pourquoi diable la méthode draw() change x et y coords

Dans votre méthode de mise à jour, vous définissez la position à la position du monde . Pour répondre à cette question, vous devez vérifier si les coordonnées du monde de votre objet change. Je suppose que ce qui suit se produit: Vous créez deux objets au même endroit (balle et littleman), ils entrent en collision dans le monde et sont écartés. Pour cette raison, ils s'éloignent lentement l'un de l'autre. Peut-être que la solution serait de filtrer les collisions entre votre littleman et ses balles en utilisant collisionBits ou collisionGroups.

+0

Donc pour la première question: L'endroit correct commencerait à partir de la position du joueur. Ils apparaissent seulement à la bonne position quand je commence la partie et que le joueur n'a pas encore bougé. Une fois que le joueur a bougé, le sprite du joueur se déplace mais les balles continuent à apparaître depuis la même position (la position de départ). Ils ne suivent pas le joueur. Cela démonterait aussi votre explication pour la deuxième question parce qu'ils ne sont pas au même endroit. Je ne sais vraiment pas pourquoi draw() change de coordonnées. Voici un gif du problème: https://gyazo.com/908a9def3992343cc05e28396c42ea1f Merci !!! –

0

Je pense qu'il ya problème dans la conversion (Pixel au mètre)

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

Et update() de Bullet devrait être

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

Et de même update() de LittleMan devrait être

public void update(float dt){ 

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