2016-10-19 1 views
0

У меня есть игра, в которой отображается лучник, и я пытаюсь настроить ее так, чтобы при нажатии моей кнопки пользователю разрешалось щелкнуть в любом месте экрана, а затем новый лучник был бы настроен на где происходит щелчок. В настоящее время мой код позволяет мне щелкнуть по экрану и установить нового лучника независимо от того, нажата ли кнопка или нет. Может кто-нибудь объяснить, что не так, потому что я, хотя MouseEvent будет происходить на сцене после нажатия кнопки.Обработка вложенных событий

myButton.setOnMouseClicked(
        new EventHandler<MouseEvent>() 
        { 
         public void handle(MouseEvent e) 
         { 
          gc.setFill(color); 
          gc.fillRect(0,0,width,height); 
          scene.setOnMouseClicked(new EventHandler<MouseEvent>() 
          { 
           public void handle(MouseEvent e) 
           { 
            archer.setX((int)e.getSceneX()); 
            archer.setY((int)e.getSceneY()); 
            archer.drawCharStand(gc); 
           } 
          }); 
         } 
        }); 
+0

Не могли бы вы прояснить, что именно вы пытаетесь сделать? Вы хотите, чтобы лучник был помещен, когда пользователь нажимает клавишу на клавиатуре, а затем щелкает где-то на экране? Или вы хотите кликать? Первый щелчок мыши активирует действие места размещения, а второй щелчок фактически размещает лучника? – MojoJojo

+0

Пользователь должен нажать кнопку, а затем, щелкнув пятно на экране, лучник будет помещен туда, где произошел щелчок. – theAnon

+0

Как добавить переменную, отслеживающую, была ли кнопка нажата предыдущая, и объединение вышеперечисленных обработчиков в один метод? – MojoJojo

ответ

1

Вы можете использовать ToggleButton, так что вы только разместить лучника, когда выбрана кнопка переключения:

private ToggleButton myButton = new ToggleButton("Place Archer"); 

// ... 

scene.setOnMouseClicked(e -> { 
    if (myButton.isSelected()) { 
     archer.setX((int)e.getSceneX()); 
     archer.setY((int)e.getSceneY()); 
     archer.drawCharStand(gc); 
     myButton.setSelected(false); 
    } 
}); 

Последняя строка отменит выбор переключателя «автоматически» после размещения лучника. Если вы хотите, чтобы пользователь мог легко разместить нескольких лучников (и их вручную отключить), опустите эту строку.

+0

Это хорошо работает, спасибо! Я даже не знал, что такое ToggleButton, поэтому я собираюсь прочитать эту ссылку. Спасибо! – theAnon

0

Вам нужно будет немного изменить свой код. Может быть, попробовать с переменной, которая отслеживает, если кнопка была нажата:

boolean archerPlacementMode = false; 
.... 
myButton.setOnMouseClicked(new EventHandler<MouseEvent>(){ 
    public void handle(MouseEvent e) 
      { 
       if(!archerPlacementMode) { 
        archerPlacementMode = true; 
        gc.setFill(color); 
        gc.fillRect(0,0,width,height); 
        archerPlacementMode = true; 
         return; 
       } 
      } 
     }); 

scene.setOnMouseClicked(new EventHandler<MouseEvent>() { 
    public void handle(MouseEvent e) 
    { 
     if(archerPlacementMode) { 
      archer.setX((int)e.getSceneX()); 
      archer.setY((int)e.getSceneY()); 
      archer.drawCharStand(gc); 
      archerPlacementMode = false; 
     } 
    } 
}); 
+0

Я пробовал это, и он только перемещает лучника, когда я нажимаю кнопку, и он перемещается между ними, где я нажимаю кнопку. Я думаю, что у меня должно быть два EventHandlers, потому что мне нужно убирать клики на экране, а также кнопку. – theAnon

+0

Да, в этом случае вам понадобятся два отдельных обработчика событий - один для кнопки и один для сцены. Обновите код для вас. – MojoJojo