2016-05-26 4 views
0

My KeyPressed работает, но никаких изменений в файле аватараDX от моего метода moveLeft нет. Я сделал что-то не так с moveLeft? Похоже, это должно быть просто, но я не уверен, что я сделал не так. У меня нет сообщений об ошибках.Перемещение изображения на холсте с помощью KeyPressed

Я рисую изображение на холсте с

gc.drawImage(avatar, avatarSX, avatarSY, avatarSW, avatarSH, avatarDX, avatarDY, avatarDW, avatarDH); 

Для Keypressed У меня есть

canvas.setOnKeyPressed(new EventHandler<KeyEvent>() { 
     @Override 
     public void handle(KeyEvent ke) { 
      double speed = 2; 
      switch(ke.getCode()) { 
       case A: 
        System.out.println("pressed a"); 
        moveLeft(avatarDX, speed); 
        System.out.println(avatarDX); 
        break; 
      } 
     } 
}); 

И moveLeft является

private void moveLeft(double avatarDX, double speed) { 
      while (avatarDX > 0) { 
       avatarDX -= speed; 
      } 
     } 

Я был бы признателен за любую помощь я очень новый в этом.

+0

Java - это вызов по значению (http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value). Поэтому изменение значения вашего параметра метода не изменяет ничего, кроме локальной копии этого 'double'. – fabian

+0

Вы также думаете об использовании выражения лямбда: 'camera.setOnKeyPressed (event -> {...});' – pzaenger

ответ

1

Причина (могут быть другие), программа не действует так, как вы ожидаете, это то, что вы пытаетесь обработать через цикл while для управления вашим аватаром.

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

Вместо этого вам необходимо использовать callback для обновления сцены на каждом pulse.

Я предлагаю вам использовать следующий подход:

  1. Как вы новичок в этом, попробуйте написать приложение с помощью графа сцены JavaFX, а не Canvas. Программирование графика сцены проще для многих вещей. Если на более позднем этапе вы обнаружите, что Canvas лучше подходит, тогда вы всегда можете преобразовать в Canvas в то время, когда вы лучше поймете модель программирования JavaFX.
  2. Review this sample перемещение персонажа вокруг графа сцены с помощью нажатия клавиш.
  3. Не пытайтесь петли, чтобы переместить своего персонажа. Вместо этого используйте встроенные high level JavaFX animation facilities, такие как переходы, или (если они не подходят, как это, вероятно, здесь), используйте интерфейс AnimationTimer с низким уровнем.
  4. Прочтите на game loops and JavaFX и примените знания, которые вы изучили там, к своей программе.
+0

Спасибо, что это очень полезно. Вы дали мне все, что мне нужно, чтобы узнать правильный способ сделать это. :) – Yoozernaym

Смежные вопросы