我知道J2ME已经过时了,但是我必须为分配做这件事。目前,我正在使用GameCanvas类,我的游戏是一个线程,所以我的代码看起来像这样..
class Game extends GameCanvas implements Runnable {
public GameCanvas() {
super(false);
}
public void run() {
while (true) {
draw();
flushGraphics();
}
}
protected void keyPressed(int keyCode) {
System.out.println("Hey, it actually worked.");
// other code to handle key press...
}
}
令人遗憾的是,无论我在模拟器的小键盘上发出多少垃圾邮件,keyPressed
方法都不会被调用。我知道getKeyStates()
有GameCanvas
方法,但我不想使用它,因为我不仅要捕获游戏键,还要捕获数字键1~9。
有没有人知道为什么我的代码没有进入我的keyPressed()
方法,我能做些什么呢?非常感谢。
不知道我哪里出错......但是经过一点点的调整后,它开始工作得非常好。非常感谢! :)
答案 0 :(得分:0)
Game#run
方法中有busy wait,这很可能会导致设备忽略所有匹配,从而使您的UI响应速度变慢。
对于简单测试,如果上述假设是正确的,只需在循环中插入sleep
,如下所示:
while (true) {
draw();
flushGraphics();
try { Thread.sleep(100); } // sleep for 1/10 sec
catch (InterruptedException ie) { System.out.println(ie); }
}
如果上面有助于恢复UI响应,请重新设计应用程序以避免繁忙的等待 - MIDP API提供了几种方法来实现这一点。
答案 1 :(得分:0)
MIDP文档摘录GameCanvas(...)
如果开发人员只需要使用getKeyStates方法查询键状态,那么可以在显示此GameCanvas时显示游戏键的常规键事件机制。如果应用程序不需要,通过消除对keyPressed,keyRepeated和keyReleased方法的不必要的系统调用来抑制关键事件可以提高性能。
请注意,只有定义的游戏键(UP,DOWN,FIRE等)才能抑制键事件;始终为所有其他键生成关键事件。
因此super(false)
将取消Canvas
中的GameCanvas
键事件侦听器方法。在这种情况下,如果您仍想在getKeyEvents(...)
中使用run()
注册关键事件,example就在
// Get the Graphics object for the off-screen buffer
Graphics g = getGraphics();
while (true) {
// Check user input and update positions if necessary
int keyState = getKeyStates();
if ((keyState & LEFT_PRESSED) != 0) {
sprite.move(-1, 0);
}
else if ((keyState & RIGHT_PRESSED) != 0) {
sprite.move(1, 0);
}
// Clear the background to white
g.setColor(0xFFFFFF);
g.fillRect(0,0,getWidth(), getHeight());
// Draw the Sprite
sprite.paint(g);
// Flush the off-screen buffer
flushGraphics();
}