关于Java中的键绑定
这里的人一直建议我在Java2D游戏中使用密钥绑定,而不是密钥侦听器 所以我学会了它,我想知道我是否正确理解如何使用它 假设我有一个游戏,有两个游戏,每个玩家可以按5个按钮 玩家1:关于Java中的键绑定,java,awt,key-bindings,Java,Awt,Key Bindings,这里的人一直建议我在Java2D游戏中使用密钥绑定,而不是密钥侦听器 所以我学会了它,我想知道我是否正确理解如何使用它 假设我有一个游戏,有两个游戏,每个玩家可以按5个按钮 玩家1: 向上箭头-向前移动 左箭头-更改移动角度 右箭头-更改移动角度 空间键控发射导弹 L键-发射二级导弹 玩家2: W键-前进 关键点-改变运动角度 D键-改变运动角度 CAPS-LOCK钥匙-发射导弹 “Z”键发射二级导弹 如果我想让程序对每一次不同的按键做出不同的反应,那么我必须这样做:(?) 在内部创建扩
- 向上箭头-向前移动
- 左箭头-更改移动角度
- 右箭头-更改移动角度
- 空间键控发射导弹
- L键-发射二级导弹
- W键-前进
- 关键点-改变运动角度
- D键-改变运动角度
- CAPS-LOCK钥匙-发射导弹
- “Z”键发射二级导弹
从个人角度来看,当我使用keyBindings时,我会为每个动作创建一个扩展abstractAction的内部类,然后创建这个内部类的一个实例,并将它绑定到一个键,如
put(“left”,ActionLeft)例如,代码>。所以基本上我完成了你描述的两个步骤,这很有效
您也可以创建匿名类的实例,然后以同样的方式绑定这些实例。个人而言,当我使用键绑定时,我会为每个操作创建一个扩展abstractAction的内部类,然后创建这个内部类的实例,并将其绑定到一个键,如put(“left”,ActionLeft)例如,代码>。所以基本上我完成了你描述的两个步骤,这很有效
您还可以创建匿名类的实例,然后以相同的方式绑定这些实例
“这是正确的吗?只为按钮创建10个新类真的合乎逻辑吗?”
答案是肯定的。您确实需要创建10个不同的实例。这并不难。您可以创建一个helper类,也可以复制并粘贴类似的内容
Action leftAction = new AbstractAction(){
public void actionPerformed(ActionEvent e){
// do something when left button pressed;
}
};
InputMap inputMap = panel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = panel.getActionMap();
inputMap.put(KeyStroke.getKeyStroke("LEFT"), "leftAction");
actionMap.put("leftAction", leftAction); <----
Action leftAction=new AbstractAction(){
已执行的公共无效操作(操作事件e){
//当左键按下时做些什么;
}
};
InputMap InputMap=panel.getInputMap(JPanel.WHEN在聚焦窗口中);
ActionMap ActionMap=panel.getActionMap();
inputMap.put(KeyStroke.getKeyStroke(“左”),“leftAction”);
actionMap.put(“leftAction”,leftAction);
“这是正确的吗?只为按钮创建10个新类真的合乎逻辑吗?”
答案是肯定的。您确实需要创建10个不同的实例。这并不难。您可以创建一个helper类,也可以复制并粘贴类似的内容
Action leftAction = new AbstractAction(){
public void actionPerformed(ActionEvent e){
// do something when left button pressed;
}
};
InputMap inputMap = panel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = panel.getActionMap();
inputMap.put(KeyStroke.getKeyStroke("LEFT"), "leftAction");
actionMap.put("leftAction", leftAction); <----
Action leftAction=new AbstractAction(){
已执行的公共无效操作(操作事件e){
//当左键按下时做些什么;
}
};
InputMap InputMap=panel.getInputMap(JPanel.WHEN在聚焦窗口中);
ActionMap ActionMap=panel.getActionMap();
inputMap.put(KeyStroke.getKeyStroke(“左”),“leftAction”);
actionMap.put(“leftAction”,leftAction);我知道我需要创建10个不同的实例。但是我需要创建10个不同的类吗?(每个人都有一个实例?)你在上面写了什么:它做什么?它是否创建了一个名为leftAction的新类,扩展了AbstractAction?或者它创建了AbstractAction的一个新实例,然后覆盖了该特定实例的actionPerformed()?从技术上讲,使用上面的代码,您正在创建一个annonymous类。对于不同的操作,您必须重复我代码的顶部部分10次。这是一个匿名类所能做的。是,leftAction
是类的变量AbstractAction
是一个需要重写actionPerformed
的类,就像ActionListener类一样,所以要回答我在第二条评论中的问题:您上面写的等于“创建一个名为leftAction的新类,它扩展了AbstractAction”?或者它只是AbstractAction的另一个实例?我知道我需要创建10个不同的实例。但是我需要创建10个不同的类吗?(每个人都有一个实例?)你在上面写了什么:它做什么?它是否创建了一个名为leftAction的新类,扩展了AbstractAction?或者它创建了AbstractAction的一个新实例,然后覆盖了该特定实例的actionPerformed()?从技术上讲,使用上面的代码,您正在创建一个annonymous类。对于不同的操作,您必须重复我代码的顶部部分10次。这是一个匿名类所能做的。是,leftAction
是类的变量AbstractAction
是一个需要重写actionPerformed
的类,就像ActionListener类一样,所以要回答我在第二条评论中的问题:您上面写的等于“创建一个名为leftAction的新类,它扩展了AbstractAction”?或者它只是抽象行为的另一个实例?