我正在制作一款小游戏,在特定事件中绘制"游戏结束",我希望玩家在发生这种情况时失去对角色的控制。我在不同的类中使用键适配器,并将其添加到构造函数中,如下所示:
addKeyListener(new GetKeyStroke(this));
我的游戏over代码是这样的(它在paint方法中):
if (gameOver) {
g.setFont(pauseFont);
g.setColor(Color.WHITE);
g.drawString("Game Over!", screenSize.width / 2 - 110, screenSize.height / 5);
}
我试过使用
removeKeyListener(new GetKeyStroke(this));
但据我所知,这创建了一个新对象,这就是为什么它不起作用。
任何帮助都非常感谢
您需要为您添加的GetKeyStroke
添加某种引用变量。
private GetKeyStroke keyListener = new GetKeyStroke(this);
...
addKeyListener(keyListener);
如果你想从另一个类访问它,你可能还想为它设置一个getter
,比如
public class One {
private GetKeyStroke keyListener;
public One() {
keyListener = new GetKeyStroke(this);
addKeyListener(keyListener);
}
public GetKeyStroke getKeyListener(){
return keyListener;
}
}
然后您可以将One
作为引用传递给Two
,并使用getKeyListener
方法获得对同一实例GetKeyStoke
的引用
public class Two {
private One one;
private GetKeyStroke keyListener;
public Two( final One one ) {
this.one = one;
keyListener = one.getKeyListener();
}
public someMehod() {
one.removeKeyListener(keyListener);
}
}
也许更合适的设计是使用interface
。在这里可以看到一个例子,也许你将来会对MVC设计的更高级的主题感兴趣。
注:
- 正如我在你的原始帖子的评论中所指出的:考虑使用Swing应用程序的键绑定。通常你会面对
KeyListener
的焦点问题。键绑定实际上是Oracle推荐的,而不是使用KeyListener
来进行特定的键反应。
你可以创建一个对象作为keylistener
Object a = new GetKeyStroke();
,然后你可以添加和删除它。
button.addKeyListener((KeyListener) a);
button.removeKeyListener((KeyListener) a);
注意我不是专家,我知道使用Object不是很好,但我就是不知道我应该用什么