J2ME游戏线程

时间:2014-04-24 11:42:11

标签: java java-me

我正在尝试为J2ME制作游戏,比如Zuma游戏,你需要知道的类结构如下:

-Level类,它包含一个关于一个等级的信息的信息(我称之为Point的类,球将跟随的路径),球的矢量(我称之为Ball的类)用来容纳不同的球对象,速度(球在特定水平的速度)..(有更多的领域,但你不需要担心)

-Frog类(只是你知道它存在)如果你不熟悉游戏zuma它可以作为一个可以射击球的可控炮塔。)。 (无需担心该课程中的字段)

-MyGameCanvas显然扩展了GameCanvas并实现了runnable,保存了frog的实例和一个级别(当前播放的级别)..(还有更多的字段,但你不需要担心)。如果用户按下右键,则将run方法用作用户输入的监听器,如果按下左侧旋转-X量,则按下右侧旋转青蛙(基本上是一个精灵)X,按下OK射球。除了处理输入之外,线程还调用一个渲染方法,该方法在屏幕上呈现正在进行的操作,并使用点矢量(来自级别实例)从球矢量(通过使用当前级别实例)更新球位置,现在问题是我希望每个级别都有不同的速度,速度我的意思是球会在屏幕上“滚动”(=移动)更慢,所以我只需使用Thread.sleep方法中的速度值并增加它就可以做到这一点睡眠时间,因为跑步方法是从用户那里获取输入使得青蛙运动和输入反应减慢,我想也许每个球都是一个单独的线程,但在我看来这不是很好,因为会有很多线程+当我更新屏幕上的每个球位置时,我实际上使用来自关卡实例的WHOLE球矢量,例如如果球与他身后的球之间存在间隙,或者何时渲染球,球需要向后移动取决于球在他已经渲染并且在“轨道”(点向量)之后,所以我真的不知道我应该怎么做,任何建议指导都会非常高兴!在此先感谢,希望你能理解我写的内容。而且我认为我不需要真正提供代码示例,因为我不想使用我想改变我写的内容所以它不会真正帮助提供运行/渲染方法,你需要知道的是我给你的类的结构以及我告诉你的字段。

1 个答案:

答案 0 :(得分:0)

各种开发人员使用各种方法来控制精灵移动的速度。 JavaME是众多需要您考虑不同分辨率和CPU速度的平台之一。所以它并不像在主游戏循环的每个循环中增加x值1像素一样简单。

假设2台设备具有不同的屏幕分辨率,但运行速度相同。在游戏循环的循环中将x值增加1,显然会导致精灵在小分辨率上更快地到达屏幕的末尾。 假设2个设备具有相同的屏幕分辨率,但具有不同的CPU。在游戏循环周期中将x值递增1,显然会导致精灵在具有最快CPU的设备上更快地到达屏幕的末端。

以下是解决这个问题的一种方法:

创建一个变量,称之为itemWait(其中" item"是要控制速度的对象的名称)。 itemWait变量包含一个值,告诉游戏循环在下次移动之前应该经过多长时间。 例如,假设精灵应该为它移动的每个像素等待40毫秒。代码看起来有点像这样:

// Variables defined outside the game loop
long lastTime, thisTime;
int cyclems;
int itemTime; // Replace "item" with the name of the object, like e.g. ballTime.
int itemWait = 40; // Wait 40 ms for each movement
int itemPixelsToMove = 1;

while (running == true) { // Game loop
 lastTime = thisTime; // Set lastTime to the time-stamp of the previous cycle
 thisTime = System.currentTimeMillis(); // Get the current time-stamp
 cyclems = (int) (thisTime - lastTime); // How long did it take to execute previous loop

 itemTime += cyclems; // How long has passed since last move
 while (itemTime > itemWait) { // If it's time to move
  itemTime -= itemWait;
  moveItem(itemPixelsToMove);
 }

 // Do other game logic

 // Draw everything

 // Handle input, unless you handle it with keyPressed()
}

使用该方法,代码并不关心设备的速度。如果您想将游戏移植到不同的屏幕分辨率,您只需更改itemPixelsToMoveitemWait即可。 例如,假设您为240x320分辨率设置itemWait = 40;。然后,您将其设置为40/240 * 480 = 80,480x640分辨率。 (当然,这也需要您缩放图形)。

我们已经在www.PirateDiamonds.com中使用了这种方法 - 以防您感到好奇。相同的代码可以在您想要的任何屏幕分辨率上运行。