2017-02-12 10 views
2

Если актер перемещается собственным методом actor.act(), он безупречно обновляет положение. Но если я переведу актера на group, который содержит актера, с помощью метода moveBy() или действия moveBy, актер перемещается, но его значения getX() и getY() остаются такими же, как перед движением. Есть ли способ для актера обновить свое положение, когда он не перемещается его методом act(), а скорее из внешнего метода?Актер libgdx не изменит позицию

Сниппет выглядит следующим образом:

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

ответ

4

getX() и getY() возвращение положение актера в локальной системе координат. Вы можете преобразовать это положение в координату сцены.

Актер, имеющий метод localToStageCoordinates(Vector2 localCoords), который преобразует указанную точку в координатах актера, чтобы быть в координатах стадии в

Создать переменный уровень класса для локального положения.

Vector2 localPos= new Vector2(); 

установленное значение в этом localPos и ​​

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

stagedPos.x и stagedPos.y ваше требование.

Тест

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

Выход:

Начальная позиция актера: 100,0 и 100,0
Актер Должность Перед MoveBy на группы составляет: 100,0 и 100,0
После MoveBy применяется на группы, актер Позиция составляет: 100,0 и 100,0
Положение с шлейфом. is: 150.0 и 150.0

+0

Im довольно уверен, что 'group.localToStageCoordinates (новый Vector2 (actor.getX(), actor.getY()));' не вернет правильное значение, а 'actor.localToStageCoordinates (новый Vector2 (0,0)); 'будет, я могу ошибаться, хотя я несколько раз сражаюсь с этим, на всякий случай, это не поможет вам попробовать мой пример – centenond

+0

@centenond i проверено, и он отлично работает, как я объяснил, пожалуйста, проверьте обновленные ответ – Aryan

+0

Посмотрите на это, я думаю, что я делал это неправильно все время – centenond