2016-10-19 89 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

我試過這個,只有當我點擊按鈕時它纔會移動射手,並在點擊按鈕之間移動。我想我必須有兩個EventHandler,因爲我需要能夠在屏幕上以及按鈕上點擊。 – theAnon

+0

是的,在這種情況下,您將需要兩個單獨的事件處理程序 - 一個用於按鈕,一個用於場景。已經爲你更新了代碼。 – MojoJojo