繁体   English   中英

J2ME 游戏线程

[英]J2ME game thread

我正在尝试为 J2ME 制作一个类似于 Zuma 游戏的游戏,您需要了解的类结构如下:

-Level 类,其中包含有关级别的信息,例如点向量(我创建的类称为 Point,球将遵循的路径)、球向量(我创建的类称为 Ball)以容纳不同的球对象、速度(该特定级别中球的速度..(有更多领域,但您无需担心)

-Frog 类(只是为了让您知道它存在)如果您不熟悉 zuma 游戏,它可以用作可以射球的可控炮塔。)。 (无需担心该类中的字段)

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

各种开发人员使用各种方法来控制精灵移动的速度。 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 例如,假设您设置itemWait = 40; 240x320 分辨率。 然后,对于 480x640 分辨率,您可以将其设置为 40/240*480 = 80。 (当然,这要求您还缩放图形)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM