【问题标题】:Java2 ME: keyPressed() not working inside GameCanvasJava 2 ME:keyPressed() 在 Game Canvas 中不起作用
【发布时间】:2011-12-12 12:13:32
【问题描述】:

我知道 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 方法都不会被调用。我知道GameCanvasgetKeyStates()的方法,但是我不想用它,因为我不仅要捕获游戏键,还要捕获数字键1~9。

有谁知道为什么我的代码没有进入我的keyPressed() 方法,我能做些什么?非常感谢。


不知道我哪里出错了......但是在到处调整一下之后,它开始工作得很好。非常感谢你们! :)

【问题讨论】:

  • 首先你没有编码constructor!相反,您编写了 superclass 构造函数!
  • 我的错。我只是匆匆浏览了一个粗略的例子,说明我的班级是什么样子的,哈哈
  • 我不是 Java ME 专家,但您的课程不应该实现 ActionListener 或类似的东西吗?

标签: java java-me lcdui gamecanvas


【解决方案1】:

您在 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 提供了几种方法来实现这一点。

【讨论】:

  • 嗯,谢谢你的想法。我试了一下,但不幸的是,我仍然无法像在 Canvas 类上那样触发 keyPressed() ...... :( 如果有帮助,我尝试实现在 while 循环内调用的方法 input(),我尝试使用 GameCanvas 的 getKeyStates()。它也不起作用,我不知道为什么......
  • @matt 在试验时,仔细检查您在构造函数中调用 super 时是否使用 false 参数值 - 此值可以决定关键事件的成败交货,请参阅API docs for GameCanvas constructor。另外,暂时不要使用getKeyStates - 留待以后调试
  • 是的,我确实使用了 super(false),但它仍然不起作用。我不确定到底是什么问题......如果有帮助,这个类由一个线程调用,并调用其他线程,全部使用.start()
  • @matt hm 听起来很有趣。你描述它的方式对我来说看起来不错,线程和开始等等。你如何调试?你在用模拟器吗?另外,尝试更努力地推动睡眠 - 比如说,sleep(1000) - 刷新可能看起来很糟糕,但你至少要确保它不是瓶颈
  • sleep(5000) 试过了,刷新很糟糕,但还是不行。是的,我正在使用模拟器 DefaultFxPhone1,如果有帮助的话。
【解决方案2】:

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

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

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

所以super(false) 将抑制GameCanvas 中的Canvas 键事件侦听器方法。在这种情况下,如果您仍想在run() 中注册关键事件,请使用getKeyEvents(...)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();
 }

【讨论】:

    猜你喜欢
    • 2016-07-13
    • 1970-01-01
    • 2017-01-03
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 2018-09-03
    • 2020-03-02
    相关资源
    最近更新 更多