Gameloop for j2me"回合制"游戏

Log*_*ror 6 java midp lcdui java-me

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

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

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

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

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

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

所以我想我的问题是:

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

Rob*_*uld 5

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

input ---> queue <---> Manager(loop)
Run Code Online (Sandbox Code Playgroud)

这样,您甚至可以编写脚本输入以进行调试.

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


Fos*_*tah 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

最后,你研究过flushGraphics()吗?使用 GameCanvas,您通常创建一个 Graphics 对象,将所有内容绘制到该对象上,然后调用lushGraphics(),然后等待。您提到的方法是 Canvas 类处理它的方法。只是想我会提到这一点并发布一个链接: 游戏画布基础知识