2017-02-28 49 views
2

所以我有一些奇怪的情況與類型不匹配。一般的想法是,我正在創建一個遊戲,其中玩家將能夠定義他們自己的keybinds移動,按鈕等。類型不匹配:無法從KeyCode轉換爲KeyCode

我已經開始了一個標準的關鍵事件監聽器,然後餵給一個密鑰處理器

import javafx.event.EventHandler; 
import javafx.scene.input.KeyEvent; 

// Key event single key 
    scene.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() { 
     public void handle(KeyEvent key) { 
       btnHand.keyPressHandler(key.getCode()); 
     } 
    }); 

import javafx.scene.input.KeyCode; 

public void keyPressHandler(KeyCode keyCode) { 
    switch (keyCode) { 
    case GameOptions.getMoveNorth(): //method call   break; 
    case GameOptions.getMoveSouth(): //method call   break; 
    case GameOptions.getMoveWest():  //method call   break; 
    case GameOptions.getMoveEast():  //method call   break; 


    default: System.out.println("key : " + keyCode + " was pressed, yet has no handler"); 
    } 
} 

我計劃設定的按鍵存儲其中牽着我的鍵綁定本身和使用干將拉的關鍵信息,我需要

import javafx.scene.input.KeyCode; 

public class GameOptions { 

private static KeyCode moveNorth; 
private static KeyCode moveEast; 
private static KeyCode moveSouth; 
private static KeyCode moveWest; 

public GameOptions() {} 

    public static KeyCode getMoveNorth() { 
     return moveNorth; 
    } 

期權類稱爲GameOptions但我現在感到茫然爲什麼它會導致類型與我的眼睛不匹配他們是同一類型的。指針導致我在正確的方向將是很好

+1

我建議不要在switch語句中使用方法。創建一個關鍵的動作地圖,並只與這些動作一起工作。 – kaetzacoatl

+1

在其他消息中,可以綁定到一個密鑰。 – ChiefTwoPencils

+0

您可以在這裏包含來自每個類文件頂部的全部'import'語句,以及您正在接收的* exact *編譯器錯誤嗎? –

回答

1

注:我敢肯定這個答案發現問題,但我並不相信這是你找出確切的錯誤信息,不要源非常符合您收到的針對非常量case標籤的錯誤。將澄清更新,將現在留在這裏。

雖然錯誤相當隱晦,但根本問題是case只接受constant expressions and enum constant names,方法調用和變量是不可接受的。您當前的架構中工作的最簡單的方法就是使用一個if代替,因爲沒有任何理由,你必須使用switch

public void keyPressHandler(KeyCode keyCode) { 
    if (keyCode == GameOptions.getMoveNorth()) { 
     ... 
    } else if (keyCode == GameOptions.getMoveSouth()) { 
     ... 
    } else if (keyCode == GameOptions.getMoveWest()) { 
     ... 
    } else if (keyCode == GameOptions.getMoveEast()) { 
     ... 
    } else { 
     System.out.println("key : " + keyCode + " was pressed, yet has no handler");  
    } 
} 

爲了完整起見,如果你沒有堅持使用switch在那裏,標籤必須是常量,所以你唯一的選擇就是將鍵碼轉換移到其他地方,例如(選擇做出ActionGameOptions一員,只是爲了保持這個例子簡單):

class GameOptions { 

    enum Action { 
     MOVE_NORTH, 
     MOVE_SOUTH, 
     MOVE_WEST, 
     MOVE_EAST 
    }; 

    // returns null if unmapped, or you could use an Action.NO_ACTION or something. 
    public static Action getActionFromKeyCode (KeyCode keyCode) { 
     ... 
    } 

} 

然後你的處理器變爲:

public void keyPressHandler(KeyCode keyCode) { 
    switch (GameOptions.getActionFromKeyCode(keyCode)) { 
    case GameOptions.Action.MOVE_NORTH: ...; break; 
    case GameOptions.Action.MOVE_SOUTH: ...; break; 
    case GameOptions.Action.MOVE_WEST: ...; break; 
    case GameOptions.Action.MOVE_EAST: ...; break; 
    default: ...; break; 
    } 
} 

但是,該方法有一些注意事項:

  • 這意味着GameOptions必須意識到全部鍵綁定,否則keyPressHandler變得更加複雜。
  • 它將您的用戶界面邏輯從您的用戶界面移動到GameOptions,在某些情況下這在架構上很古怪,並且在更復雜的情況下可能會出現問題。
  • 它不會爲你帶來太多的益處,它在這裏沒有真正的好處,它更加冗長。無論如何,你仍然需要在getActionFromKeyCode中執行同樣大的if,與你原來的問題一樣,只是搬到了不同的地方。

對你來說不是最好的選擇,但想把它作爲一個概念來思考。我只想去與if

+1

感謝您的幫助,我認爲與此同時,我可能會轉而採取一種方法讓事情真正起作用。不過,我也將瞭解有關inputmap/actionmaps的知識,因爲這似乎是一個更「可擴展」的解決方案,具有什麼可能是一個巨大的if語句 – Fluke

+0

@Fluke ActionMaps/InputMaps將是最合適的方法結束。 –

0

結合我之前使用的映射思想,我得出了一個很好的結論。它會做,現在我覺得,它可能會在未來崩潰......誰知道....到下一個新事物!

public void keyPressHandler(KeyCode keyCode) { 

    HashMap<KeyCode, String> kmap = new HashMap<KeyCode, String>(); 

    kmap.put(GameOptions.getMoveNorth(), "north"); 
    kmap.put(GameOptions.getMoveEast(), "east"); 
    kmap.put(GameOptions.getMoveSouth(), "south"); 
    kmap.put(GameOptions.getMoveWest(), "west"); 

    String kact = kmap.get(keyCode); 

    if (kact == null) { 
     kact = ""; 
    } 

    switch(kact) { 
    case "north": 
     northButtonHandler(); 
     break; 
    case "east": 
     eastButtonHandler(); 
     break; 
    case "south": 
     southButtonHandler(); 
     break; 
    case "west": 
     westButtonHandler(); 
     break; 
    default: 
     System.out.println("key : " + keyCode + " has been pressed, yet has no binding"); 
    } 
} 
相關問題