gpt4 book ai didi

java - 类型不匹配 : cannot convert from KeyCode to KeyCode

转载 作者:行者123 更新时间:2023-11-30 10:32:52 41 4
gpt4 key购买 nike

所以我遇到了一些类型不匹配的奇怪情况。总体想法是我正在创建一个游戏,玩家可以在其中定义自己的移动键绑定(bind)、按钮等。

我从一个标准的键事件监听器开始,然后将其馈送到键处理程序中

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");
}
}

我计划将键绑定(bind)存储在一个名为 GameOptions 的选项类中,该类保存我的键绑定(bind)并使用 getter 提取我需要的键信息

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;
}

但我现在不知道为什么它会导致类型不匹配,因为在我看来它们是同一类型。引导我朝着正确方向前进的指针会很好

最佳答案

注意:我确定这个答案确定了一个问题,但我完全不相信它是您确定的准确错误消息的来源,它与您收到的错误不匹配- 常量 case 标签。将更新说明,暂时将其保留在这里。

虽然错误相当隐蔽,但根本问题是 case 只接受 constant expressions and enum constant names ,方法调用和变量是 Not Acceptable 。在您当前的架构中工作,最直接的方法是简单地使用 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");
}
}

为了完整起见,如果您确实坚持在那里使用开关,则标签必须是常量,因此您唯一的选择是移动关键代码翻译其他地方,例如(选择让 Action 成为 GameOptions 的成员只是为了让这个例子简单):

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 必须知道所有 键绑定(bind),否则 keyPressHandler 会变得更加复杂。
  • 它将您的一些 UI 逻辑从您的 UI 移到 GameOptions 中,这在某些情况下在架构上很奇怪,并且在更复杂的情况下可能会出现问题。
  • if 方法相比,它并没有给您带来太多好处,它更加冗长,在这里没有任何实际好处。无论如何,您仍然需要在 getActionFromKeyCode 中实现相同的大 if,这与您的原始问题相同,只是移到了不同​​的地方。

这对您来说不是最佳选择,但想将其作为一个概念提出来考虑。我会选择 if

关于java - 类型不匹配 : cannot convert from KeyCode to KeyCode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42498416/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com