Java2 ME:keyPressed()在GameCanvas中无法正常工作

时间:2011-12-12 12:13:33

标签: java java-me lcdui gamecanvas

我知道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()方法,我能做些什么呢?非常感谢。


不知道我哪里出错......但是经过一点点的调整后,它开始工作得非常好。非常感谢! :)

2 个答案:

答案 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();
 }