j2me“回合制”游戏的Gameloop

问题描述:

编辑:这让我对现在更加理解,因为我已经离开了代码一步,感谢您的帮助。j2me“回合制”游戏的Gameloop

刚刚发现堆栈溢出有一天通过编码恐怖,它看起来很棒。我会问社区关于我目前正在努力解决的一个问题。

我正在开发一款使用j2me for midp 2.0手机的roguelike sortof游戏。当我弄清楚它将如何工作时,该项目仍处于发展的基本阶段。我目前坚持的部分与线程有关。

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

游戏的流程由一个GameManager类控制,该类可以循环遍历地图上的所有NPC,轮到他们,直到轮到玩家。在这一点上,我需要获得投入,让玩家移动和/或攻击事物。我原本在HaxCanvaskeyPressed方法中调用gameManager.runUntilHeroTurn()。然而,在读完j2me系统线程后,我意识到将一个方法放在回调中运行一段时间是一个不好的主意。但是我必须使用keyPressed来完成输入操作,因为我需要访问数字键,并且getKeyStates()不支持此操作。

我试图把我的gameloop放在它自己的线程中,结果导致了灾难。一个奇怪的“未捕获的ArrayIndexOutOfBoundsException”没有堆栈跟踪显示出来后,游戏已经跑了好几个回合。

,所以我想我的问题是这样的:

对于“回合制”游戏在J2ME中,什么是执行游戏循环的最好办法,允许输入仅HANDELING当它是玩家的大转弯?

+0

顺便说一句,好问题。 +1 – Fostah 2009-02-26 14:49:18

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

为了解决这个问题,我不会有子循环来更新一个帧中的每个AI。我会做类似的运行功能如下:

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

尽管不是j2me,你应该捕获用户输入,一般策略是将输入排队,直到它处理输入为止。

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

这样你甚至可以脚本输入用于调试目的。

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