2016-12-06 14 views
0

Я создаю игру, в которой яблоко снимается со стрелкой. Расположение яблока - это местоположение пользователя XY, и стрелочный актер должен перейти в это место, используя код actor.moveto. Проблема заключается в том, что стрелка перемещается только один раз в направлении ввода пользователем. Я знаю, что действие moveTo актера обновляется много раз в секунду, когда я вызывал stageArrow.act в методе обновления, поэтому мне интересно, почему стрелка перемещается только один раз. Вот мой код:Актер в сцене не обновляет местоположение MoveTo XY

appleclass.java

public class AppleClass implements Screen { 

Arrow arrow; 
private final MainApp app; 
public Image ShotImage; 

public AppleClass(final MainApp app){ 
     this.app = app; 
     this.stageApple = new Stage(new StretchViewport(app.screenWidth,app.screenHeight , app.camera)); 
     this.stageArrow =new Stage(new StretchViewport(app.screenWidth,app.screenHeight , app.camera)); 

     arrow = new ArrowClass(app); 

    } 

@Override 
    public void show() { 

     InputMultiplexer inputMultiplexer = new InputMultiplexer(); 
     inputMultiplexer.addProcessor(stageApple); 
     inputMultiplexer.addProcessor(stageArrow); 
     Gdx.input.setInputProcessor(inputMultiplexer); 

     arrow(); 

    } 

    public void arrow(){ 
     arrow.isTouchable(); 
     stageArrow.addActor(arrow); 
     arrow.addAction((moveTo(Gdx.input.getX(),Gdx.input.getY(),0.3f))); //===> only executes once. 
     arrow.addListener(new InputListener(){ 
      public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor){ 


      if (Gdx.input.isTouched()){ 
         ShotImage.setVisible(true); 

          } 
         } 
        });} 

} 

@Override 
    public void render(float delta) {       

     Gdx.gl.glClearColor(0, 0, 0, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     update(delta); 
} 

public void update(float deltaTime){ 


     stageApple.draw(); 
     stageArrow.draw(); 

     stageApple.act(deltaTime); 
     stageArrow.act(deltaTime); 


    } 

ArrowClass.java

public class ArrowClass extends Actor { 
    MainApp app; 
    AppleClass appleClass; 
    public Texture arrowTexture; 

    public ArrowClass(final MainApp app){ 
     this.app = app; 
     arrowTexture = new Texture("medievalarrow.png"); 
     this.setSize(arrowWidth, arrowHeight); 
     this.setTouchable(Touchable.enabled); 
     this.setBounds(app.screenWidth*0.45f,0,arrowWidth,arrowHeight); 
     this.setOrigin(0,0); 

} 
@Override 
    public void draw(Batch batch, float parentAlpha) { 
     super.draw(batch, parentAlpha); 


     final float delta = Gdx.graphics.getDeltaTime(); 
     this.act(delta); 

     app.batch.begin(); 
     app.batch.draw(arrowTexture, getX(),getY(),getWidth(),getHeight()); 
     app.batch.end(); 

    } 
} 

Любая помощь будет высоко оценен. Благодарю.

ответ

1

Я думаю, проблема в том, что вы вызываете this.act(delta) в свой метод рисования ArrowClass '. Когда вы вызываете Stage#act(), он будет вызывать метод действия для всех его участников для вас. Поскольку вы вызываете его один раз, когда вы рисуете, и снова, когда вы обновляете сцену, он движется с удвоенной нормальной скоростью, и это может привести к преждевременному достижению цели.

Несколько других комментариев о вашем коде, если я могу:

Во-первых, вы, вероятно, не хотят два отдельных stages-, если вы не используете Scene2D.UI, то, как правило, имеют одну ступень с Эрроу и Apple, добавляется к нему как к актерам.

Во-вторых, когда вы переопределяете Actor#draw(), вы должны использовать пакет, который он передает вам для выполнения рендеринга, вместо использования приложения из приложения. Вы также не хотите называть begin() и end() внутри вашего метода рисования - это «дорогие», и вы хотите только их вызвать один раз за кадр. Однако, если вы просто используете пакет, который передается draw(), класс Stage будет обрабатывать начало и конец для вас, и вам не нужно будет вызывать их явно.

В-третьих, на самом деле вам не нужно звонить super.draw(batch, parentAlpha), потому что это пустой метод в классе Actor.

Таким образом, ваш класс может быть упрощена следующим образом:

public class ArrowClass extends Actor { 
    AppleClass appleClass; // You never set this; you may not need it 
    Texture arrowTexture; 

    public ArrowClass(MainApp app, arrowWidth, arrowHeight) { 
     arrowTexture = new Texture("medievalarrow.png"); 
     this.setSize(arrowWidth, arrowHeight); 
     this.setTouchable(Touchable.enabled); 
     this.setBounds(app.screenWidth*0.45f,0,arrowWidth,arrowHeight); 
     this.setOrigin(0,0); 

} 
@Override 
    public void draw(Batch batch, float parentAlpha) { 
     batch.draw(arrowTexture, getX(),getY(),getWidth(),getHeight()); 
    } 
} 
+0

Вы можете, пожалуйста, взгляните на мой вопрос здесь: http://gamedev.stackexchange.com/questions/135748/how-to- делают члены-оф-ан-ArrayList-INTO-ан-актер-и добавление их к стадии – JAlmazan