我正在創建一個使用箭頭鍵移動精靈的遊戲。我爲箭頭鍵和字母n添加了鍵綁定,但箭頭鍵不起作用。這是我的代碼:使用帶箭頭鍵的按鍵綁定
public class MyPanel extends JPanel {
Sprite sprite = new Sprite();
Timer gameClock = new Timer(DELAY, new ActionListener(){
public void actionPerformed(ActionEvent e){
sprite.move();
// omit other methods
}
});
// omit other member variables
public MyPanel(){
Abstract Action newGameAction = new AbstractAction("new game") {
public void actionPerformed(ActionEvent e){
doNewGame();
}
}
setFocusable(true);
addKeyBinding(new Pair<String, Action>("N", newGameAction));
ArrayList<Pair<String, Action>> pairs = sprite.findKeyBindingPairs();
for (Pair<String, Action> p : pairs)
addKeyBindings(p);
gameClock.start();
// omit other panel init
}
private void addKeyBindings(Pair<String, Action> pair) {
String key = pair.getFirstElement();
Action action = pair.getSecondElement();
String desc = action.getValue(AbstractAction.NAME).toString();
getInputMap().put(KeyStroke.getKeyStroke(key), desc);
getActionMap().put(desc, action);
}
// omit other methods
}
public class Sprite {
private class ChangeDirAction extends AbstractAction {
int dx, dy;
ChangeDirAction(String name, int dx, int dy){
super(name);
this.dx = dx;
this.dy = dy;
}
public void actionPerformed(ActionEvent e){
setVelocity(dx, dy);
}
}
private int dx_, dy_;
Point pos;
// omit other instance variables
public void move(){
// With printlns dx_ and dy_ are both 0 here. Why?
Point newPos = new Point(pos);
newPos.translate(dx_, dy_);
// omit code to test whether newPos is valid
if (isWall(newPos) || isOutsidePanel(newPos))
setVelocity(0, 0);
else
pos = newPos;
}
private void setVelocity(int dx, int dy){
dx_ = dx;
dy_ = dy;
// With printlns dx_ and dy_ change when arrow keys are pressed
}
public ArrayList<Pair<String, Action>> findKeyBindingPairs(){
Pair<String, Action> leftPair = new Pair<String, Action>("LEFT", new ChangeDirAction("left", -1, 0));
Pair<String, Action> rightPair = new Pair<String, Action>("RIGHT", new ChangeDirAction("right", 1, 0));
Pair<String, Action> upPair = new Pair<String, Action>("UP", new ChangeDirAction("up", 0, -1));
Pair<String, Action> downPair = new Pair<String, Action>("DOWN", new ChangeDirAction("down", 0, 1));
ArrayList<Pair<String, Action>> result = new ArrayList<Pair<String, Action>>();
result.add(leftPair);
result.add(rightPair);
result.add(upPair);
result.add(downPair);
return result;
}
// omit other methods
}
我在試圖做SSCCE時想通了。當我開始一個新的遊戲時,我創建了一個新的Sprite對象,而沒有舊的鍵綁定,所以我的鍵綁定數據丟失了。我將我的代碼移到了doNewGame()方法的鍵綁定中,並且它現在可以工作。 – Eva
這是SSCCE如此高度推薦的原因之一:-)順便說一句,你可以自己添加一個答案,並接受它。 – kleopatra