Java2 ME: keyPressed () не работает внутри GameCanvas - PullRequest
2 голосов
/ 12 декабря 2011

Я знаю, что 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 голосов
/ 12 декабря 2011

Отрывок документации MIDP для GameCanvas (...)

Если разработчику нужно только запросить состояние ключа с помощью метода getKeyStates, событие обычного ключаМеханизм может быть отключен для игровых ключей, пока этот GameCanvas отображается .Если приложение не требуется, подавление событий клавиш может повысить производительность, исключив ненужные системные вызовы методов keyPressed, keyRepeated и keyReleased.

Примечаниесобытия клавиш могут быть подавлены только для определенных игровых клавиш (ВВЕРХ, ВНИЗ, ПОЖАР и т. д.);события клавиш всегда генерируются для всех остальных ключей.

Таким образом, 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();
 }
0 голосов
/ 12 декабря 2011

У вас есть занятое ожидание в методе Game#run, которое, скорее всего, заставляет устройство игнорировать все ваши попадания, что делает ваш пользовательский интерфейс потерянным.

Для простого теста, если приведенное выше предположение верно, просто вставьте sleep в цикл, как показано ниже:

    while (true) {
        draw();
        flushGraphics();
        try { Thread.sleep(100); } // sleep for 1/10 sec
        catch (InterruptedException ie) { System.out.println(ie); }
    }

Если приведенное выше помогает восстановить отзывчивость пользовательского интерфейса, измените дизайн приложения, чтобы избежать занятых ожиданий - MIDP API предоставляет несколько способов для достижения этой цели.

...