2017-02-28 47 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"); 
    } 
} 
相关问题