2

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


不知道我哪里出错了……但是在这里和那里进行了一些调整之后,它开始工作得很好。非常感谢你们!:)

4

2 回答 2

0

您在方法中忙于等待Game#run,这很可能导致设备忽略您的所有点击,从而使您的 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 提供了几种方法来实现这一点。

于 2011-12-12T12:51:32.230 回答
0

GameCanvas(...)的 MIDP 文档摘录

如果开发者只需要使用 getKeyStates 方法查询按键状态,则可以在显示此 GameCanvas 时为游戏按键抑制常规按键事件机制。如果应用程序不需要,抑制键事件可以通过消除对 keyPressed、keyRepeated 和 keyReleased 方法的不必要系统调用来提高性能。

请注意,按键事件只能针对已定义的游戏键(UP、DOWN、FIRE 等)被抑制;始终为所有其他键生成键事件。

所以super(false)Canvas抑制GameCanvas. 在这种情况下,如果您仍想注册getKeyEvents(...)您的 中使用的关键事件run()示例如下

 // 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();
 }
于 2011-12-12T19:45:49.203 回答