2016-01-03 3 views
0

Я делаю приложение, и у меня есть раздражающая ошибка/ошибка: когда я хочу, чтобы мое изображение двигалось постепенно вверх, оно ничего не делает. Вот некоторые из моего кода:LibGdx moveTo действие не выполнено

public void checkButtons(){ 
     MoveToAction moveUp = new MoveToAction(); 
     moveUp.setDuration(actionDuration); 
     moveUp.setPosition(0, Gdx.graphics.getHeight()); 

     MoveToAction moveDown = new MoveToAction(); 
     moveDown.setDuration(actionDuration); 
     moveDown.setPosition(0, Gdx.graphics.getHeight() - Gdx.graphics.getHeight() * 2); 

     MoveToAction moveLeft = new MoveToAction(); 
     moveLeft.setDuration(actionDuration); 
     moveLeft.setPosition(Gdx.graphics.getWidth() - Gdx.graphics.getWidth() * 2, 0); 

     MoveToAction moveRight = new MoveToAction(); 
     moveRight.setDuration(actionDuration); 
     moveRight.setPosition(Gdx.graphics.getWidth(), 0); 
     if (goingUp == true){ 
      red_dot.addAction(moveUp); 
      if (goingUp == false){ 
       red_dot.removeAction(moveUp); 
      } 
     } 
     if (goingDown == true){ 
      red_dot.addAction(moveDown); 
      if (goingDown == false){ 
       red_dot.removeAction(moveDown); 
      } 
     } 
     if (goingLeft == true){ 
      red_dot.addAction(moveLeft); 
      if (goingLeft == false){ 
       red_dot.removeAction(moveLeft); 
      } 
     } 
     if (goingRight == true){ 
      red_dot.addAction(moveRight); 
      if (goingRight == false){ 
       red_dot.removeAction(moveRight); 
      } 
     } 

red_dot изображение, а остальные переменные довольно просто. Спасибо заранее.

ответ

2

Несколько вещей, чтобы проверить:

  • Вы звоните stage.act()?
  • Является ли ваш actionDuration отличным от нуля?
  • Вы уверены, что эти координаты? Большинство из них выглядят так, будто они будут вне экрана, если вы используете ScreenViewport. И если вы этого не сделаете, почему размер экрана имеет какое-либо отношение к тому, где вы хотите переместить свой объект?

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

if (someCriterion == true) {; 
    doSomething(); 
    if (someCriterion == false) { 
     //Code in here will never be called unless `doSomething()` immediately causes 
     //someCriterion to become false as a side effect (which addAction() will not do). 
    } 
} 

Я предполагаю, что вы думаете, что либо код под addAction будет вызвана после завершения действия, или что она будет называться неоднократно , Но это не так. Если вы хотите остановить действия раньше, вы должны удалить их в месте вашего кода, где вы меняете переменные, такие как goingUp на false.

Но если вы просто пытаетесь удалить завершенные действия, это не нужно, потому что это происходит автоматически.

Кроме того, вы не должны создавать все эти дополнительные действия, которые вы не можете использовать. Вы создаете много мусора, который может вызвать заикание. Создавайте только те действия, которые вы определенно собираетесь использовать. И вместо того, чтобы использовать new MoveToAction(), используйте Actions.moveTo(), чтобы получить необходимое действие из пула. Тогда он не будет запускать сборку мусора, когда она будет завершена, потому что Stage знает, как отправить объединенные действия обратно в пул для утилизации.

+0

Когда я вызываю этот метод из другого класса, и я вызываю stage.act(), это хорошо? –

+0

Пока этот актер находится в стадии и stage.act вызывается каждый кадр, это правильно. – Tenfour04

+0

Когда я вызываю Gdx.graphics.getHeight, он возвращает значение float? –