[英]Java key bindings with multiple actions
因此,作為參考,我正在遵循Trystan的針對Java的roguelike教程 。
上面的教程使用了“密鑰偵聽器”,該偵聽器不適用於Mac OS X(並且似乎不鼓勵社區使用),因此我試圖將代碼更改為使用“密鑰綁定”。
這是問題。 在他的“流氓類游戲”中,游戲被划分為多個屏幕,其中每個屏幕都有針對特定鍵的單獨操作。 例如,按下回車鍵后,“開始屏幕”會將播放器發送到“播放屏幕”:
public class StartScreen implements Screen {
public void displayOutput(AsciiPanel terminal) {
terminal.write("rl tutorial", 1, 1);
terminal.writeCenter("-- press [enter] to start --", 22);
}
public Screen respondToUserInput(KeyEvent key) {
return key.getKeyCode() == KeyEvent.VK_ENTER ? new PlayScreen() : this;
}
}
在按下回車鍵的同時,“播放屏幕”將播放器發送到“獲勝屏幕”時:
public class PlayScreen implements Screen {
public void displayOutput(AsciiPanel terminal) {
terminal.write("You are having fun.", 1, 1);
terminal.writeCenter("-- press [escape] to lose or [enter] to win --", 22);
}
public Screen respondToUserInput(KeyEvent key) {
switch (key.getKeyCode()){
case KeyEvent.VK_ESCAPE: return new LoseScreen();
case KeyEvent.VK_ENTER: return new WinScreen();
}
return this;
}
}
現在,從鍵綁定示例(例如this和this)中可以看到,所有的綁定和動作似乎都“轉儲”到一個類中。 這是不令人滿意的,因為:
是否有一種方法可以使按鍵綁定使一個按鍵根據“屏幕”執行不同的操作? 我會只使用條件嗎? 是否可以將鍵綁定邏輯放在其他類(屏幕)中,然后再在主類中調用它們,就像上面的鍵偵聽器一樣?
鍵綁定不一定要轉儲到一個類中。 它們與輸入映射關聯,而輸入映射又與特定的JComponent
關聯。 如果您在代表該屏幕的JComponent
的WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
輸入映射中注冊了特定於屏幕的綁定,則當該屏幕中的任何組件都具有鍵盤焦點時(假設兩者之間的組件未使用其自身覆蓋該綁定),它們將被識別,但是當另一個屏幕中的組件具有焦點時則不會。
總體而言,該系統非常靈活。 您可以考慮閱讀有關此主題的Java教程部分,以使自己入門。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.