Gameloop for j2me“回合制”游戏

时间:2009-02-26 04:45:33

标签: java java-me midp lcdui

编辑:这对我来说更有意义,因为我已经离开了代码,感谢您的帮助。

前几天通过Coding Horror发现堆栈溢出,它看起来很棒。我想向社区询问我目前正在尝试解决的问题。

我正在使用j2me为midp 2.0手机开发一款roguelike游戏。该项目仍然处于开发的基本阶段,因为我弄清楚它是如何运作的。我目前坚持的部分与线程有关。

游戏有一个自定义HaxCanvas类,它扩展了GameCanvas和Implements runnable。它的run方法调用repaint()然后休眠50 ms,导致帧速率为20 FPS。这使我可以编写游戏的其余部分而无需在任何地方放置重绘,并且应该使动画和效果更容易在以后进行。 (至少在理论上)。

游戏的流程由GameManager类控制,该类循环遍历地图上的所有NPC,轮流,直到玩家轮到。此时我需要输入以允许玩家四处移动和/或攻击事物。我最初在gameManager.runUntilHeroTurn()的{​​{1}}方法中调用了keyPressed。然而,在阅读了j2me系统线程之后,我意识到在回调中放置一个可能会运行一段时间的方法是一个坏主意。但是我必须使用keyPressed进行输入操作,因为我需要访问数字键,HaxCanvas不支持此功能。

Sofar我尝试将我的游戏循环放入其自己的线程中导致了灾难。游戏运行几圈后,会出现一个没有堆栈跟踪的奇怪的“未捕获的ArrayIndexOutOfBoundsException”。

所以我想我的问题是:

对于j2me中的“回合制”游戏,实现游戏循环的最佳方法是什么,只有当玩家轮到你时才允许输入游戏?

2 个答案:

答案 0 :(得分:5)

虽然不是j2me具体你应该捕获用户输入,但一般的策略是将输入排队,直到处理输入为止。

input ---> queue <---> Manager(loop)

通过这种方式,您甚至可以编写输入脚本以进行调试。

所以你不需要新线程。每次用户按下键时,都会将它们存储在缓冲区中,然后在必要时处理缓冲区的内容。如果玩家缓冲区没有输入,管理员应该跳过所有游戏,做动画然后重新开始(因为游戏不是动作游戏)。

答案 1 :(得分:3)

我会避免线程化游戏逻辑,因为J2ME线程,当然,取决于制造商,在共享有限资源方面做得不好。当线程执行繁重的处理时,您经常会看到暂停。我只推荐用于加载或网络连接功能的线程,因为在这种情况下,您只需向用户提供基本的“加载...”反馈。

为了解决这个问题,我不会有子循环来更新一帧中的每个AI。我会在run函数中执行以下操作:

public void run() {
    while(true) {
        // Update the Game
        if(gameManager.isUsersTurn()) {
            // Collect User Input
            // Process User Input
            // Update User's State
        }
        else {
            // Update the active NPC based on their current state
            gameManager.updateCurrentNPC();
        }

        // Do your drawing
    }
}

您希望避免在一帧中更新所有内容,因为1)更新可能会很慢,导致用户无法立即获得视觉反馈2)您无法为每个NPC制作动作时制作动画。通过此设置,您可以拥有NPC状态NPC_DECIDE_MOVE和NPC_ANIMATING,这将允许您进一步控制NPC正在执行的操作。 NPC_ANIMATING基本上将游戏置于动画发生的等待状态,避免任何进一步处理直到动画完成。然后它可以转到下一个NPC。

另外,我只需要一个gameManager.update()和gameManager.paint(g)(将从paint中调用paint)来处理所有内容并保持run方法的精简。

最后,您是否看过flushGraphics()?使用GameCanvas,您通常会创建一个Graphics对象,将所有内容绘制到该对象,然后调用flushGraphics(),然后等待。你提到的方法是为Canvas类处理它的方法。我想我会提到这个并发布一个链接: Game Canvas Basics