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

GameCanvasのMIDPドキュメントの抜粋(...)

開発者がgetKeyStatesメソッドを使用してキーステータスを照会するだけでよい場合、このGameCanvasが表示されている間、ゲームキーの通常のキーイベントメカニズムを抑制できます。アプリケーションで必要とされない場合、キーイベントの抑制は、keyPressed、keyRepeated、およびkeyReleasedメソッドへの不要なシステムコールを排除することにより、パフォーマンスを向上させる可能性があります。

キーイベントは、定義されたゲームキー(UP、DOWN、FIREなど)に対してのみ抑制できることに注意してください。キーイベントは、他のすべてのキーに対して常に生成されます。

したがって、のキーイベントリスナーメソッドsuper(false)を抑制します。その場合でも、で使用する主要なイベントを登録する場合は、を以下に示します。CanvasGameCanvasgetKeyEvents(...)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 に答える
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 に答える