2017-02-12 2 views
2

Si un acteur est déplacé par sa propre méthode actor.act(), il met à jour la position sans erreur. Mais si je déplace l'acteur par un group, qui contient l'acteur, avec la méthode moveBy() ou une action moveBy, l'acteur se déplace, mais ses valeurs getX() et getY() restent les mêmes qu'avant le mouvement. Est-il possible pour l'acteur de mettre à jour sa position lorsqu'il n'est pas déplacé par sa méthode act(), mais plutôt par une méthode externe?L'acteur libgdx ne changera pas de position

L'extrait ressemble à ceci:

//Bounds are set in the MyActor class, which extends Actor 
MyActor myActor= new MyActor(); 
Group group = new Group(); 
group.addActor(myActor) 

//stage already created 
stage.addActor(group); 

//Doesn't update X and Y, when calling myActor.getX(), myActor.getY() 
group.moveBy(x,y); 

Répondre

4

getX() et getY() position de retour de l'acteur dans la coordination locale. Vous pouvez transformer cette position en coordonnées de scène.

Acteur ayant procédé localToStageCoordinates(Vector2 localCoords) qui transforme le point spécifié dans les coordonnées de l'acteur à être dans les coordonnées de l'étape

créer un niveau de classe de la variable de position locale.

Vector2 localPos= new Vector2(); 

valeur définie dans cette localPos et

localPos.set(myActor.getX(),myActor.getY()); 
Vector2 stagedPos=group.localToStageCoordinates(localPos); 

stagedPos.x et stagedPos.y est votre exigence.

test

public class TestGame extends Game implements InputProcessor{ 

    Stage stage; 
    Image image; 
    Group group; 
    Vector2 vector2=new Vector2(); 

    @Override 
    public void create() { 

     stage=new Stage(); 
     group=new Group(); 

     Gdx.input.setInputProcessor(this); 

     image=new Image(new Texture("image/base.png")); 
     image.setPosition(100,100); 

     group.addActor(image); 
     stage.addActor(group); 

     System.out.println("Initial Position of Actor : "+image.getX()+" And "+image.getY()); 
    } 

    @Override 
    public void render() { 
     super.render(); 

     Gdx.gl.glClearColor(1,1,1,1); 
     gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

     stage.draw(); 
     stage.act(); 
    } 

    @Override 
    public void resize(int width, int height) { 
     super.resize(width, height); 
     stage.getViewport().update(width,height); 
    } 

    @Override 
    public boolean keyDown(int keycode) { 
     return false; 
    } 

    @Override 
    public boolean keyUp(int keycode) { 
     return false; 
    } 

    @Override 
    public boolean keyTyped(char character) { 
     return false; 
    } 

    @Override 
    public boolean touchDown(int screenX, int screenY, int pointer, int button) { 

     System.out.println("Actor Position Before moveBy on Group is : "+image.getX()+" And "+image.getY()); 

     group.moveBy(50,50); 

     System.out.println("After moveBy applied on Group, Actor Position is : "+image.getX()+"And"+image.getY()); 
     vector2.set(image.getX(),image.getY()); 
     Vector2 stageCord=group.localToStageCoordinates(vector2); 
     System.out.println("Position with Stage Cord. is : "+stageCord.x+" And "+stageCord.y); 

     return false; 
    } 

    @Override 
    public boolean touchUp(int screenX, int screenY, int pointer, int button) { 
     return false; 
    } 

    @Override 
    public boolean touchDragged(int screenX, int screenY, int pointer) { 
     return false; 
    } 

    @Override 
    public boolean mouseMoved(int screenX, int screenY) { 
     return false; 
    } 

    @Override 
    public boolean scrolled(int amount) { 
     return false; 
    } 
} 

sortie est:

Position initiale Acteur: 100,0 et 100,0
Acteur Position Avant moveBy sur Groupe est: 100,0 et 100,0
Après moveBy appliqué sur le groupe, Acteur Position est: 100.0 et 100.0
Position avec cordon de phase. est: 150.0 et 150.0

+0

Im assez sûr que 'group.localToStageCoordinates (nouveau Vector2 (actor.getX(), actor.getY()));' ne retournera pas la valeur correcte, mais 'actor.localToStageCoordinates (new Vector2 (0,0)); 'sera, je pourrais avoir tort, mais j'ai bataille avec cela quelques fois, juste au cas où cela ne vous aiderait pas essayer mon exemple – centenond

+0

@centenond j'ai testé et c'est très bien comme je l'ai expliqué, s'il vous plaît vérifier mise à jour répondre – Aryan

+0

regardez ça, je suppose que je faisais le mal tout le temps – centenond