java – 用于j2me“回合制”游戏的Gameloop

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

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

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

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

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

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

所以我想我的问题是:

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

解决方法

我会避免线程化游戏逻辑,因为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

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量