1. 使用runnable和创建线程的主循环
一般主体的做法就是让displayable这个类实现runnable这个接口,然后在其构造函数中创建一个线程,启动其run()函数,而run函数里面就包含了游戏的主循环。下面是我在仙剑里面的片断代码。
public class gamemidlet extends midlet {
static gamemidlet instance;
display display;
gamedisplayable displayable = null;
public gamemidlet() {
instance = this;
display = display.getdisplay(this);
displayable = new gamedisplayable();
}
public void startapp() {
display.setcurrent(displayable);
}
public void pauseapp() {
}
public void destroyapp(boolean unconditional) {
displayable.running = false;
}
public static void quitapp() {
instance.destroyapp(true);
instance.notifydestroyed();
instance = null;
}
}
public class gamedisplayable extends fullcanvas implements runnable {
/** 主控制线程 */
thread mainthread = null;
/** 游戏时钟间隔 毫秒为单位 */
public static long timeinterval = 20;
public static boolean isstable = true;
/* 用于游戏时钟的变量 */
public static long timeold = 0;
public static long timenow = 0;
public long interval = 0;
public static long frames_per_second = 0;
int count = 0;
long second = 0;
public static boolean running = true;
public gamedisplayable() {
// 开始主线程
thread mainthread = new thread(this);
mainthread.start();
}
public void run() {
while (running) {
timenow = system.currenttimemillis();
interval = timenow - timeold;
if (interval >= timeinterval) {
timeold = timenow;
game_process();
if (second != (system.currenttimemillis() / 1000)) {
second = system.currenttimemillis() / 1000;
frames_per_second = count;
count = 1;
}
else
count++;
}
lib.sleep(30);
}
}
其中关于控制主循环速度的代码可以不要,但是lib.sleep(30)必须保留,因为在nokia 60的手机上,如果去除了sleep(30),那么游戏将无法切换回来。同时,在游戏中任何一个内部循环中,也必须加入sleep(30)这个等待,才能让游戏可以切换回来,至于为什么这样做,我暂时还不清楚。30ms是我测试过没有问题的数值,可能比30ms还小的值也是没有问题的。
同时,在moto的手机上,必须将游戏的主循环放在一个线程中,游戏才能切换回来,不过可以不加上面说的sleep(30)延时。
2. 不使用线程的主循环办法
这个办法只能在nokia的平台上实现,而我只建议在nokia 40的平台上做,这样不需要线程,道理上来说节约了一些内存,如果不是内存很紧张的机型,那么最好还是使用上一种办法。
游戏的主循环放在midlet的class里面,具体做法如下:
public class gamemidlet extends midlet {
gamedisplayable displayable = null;
/** 游戏时钟间隔 毫秒为单位 */
public static long timeinterval = 0;
//用于游戏时钟的变量
public static long timeold = 0;
public static long timenow = 0;
public long interval = 0;
public static long frames_per_second=0;
int count=0;
long second =0;
public static boolean running = false;
static boolean exitapp =false;
public gamemidlet() {
displayable = new gamedisplayable();
running =true;
}
public void startapp() {
running =true;
display.getdisplay(this).setcurrent(displayable);
while(running) {
timenow = system.currenttimemillis();
interval = timenow - timeold;
if (interval >= timeinterval) {
timeold = timenow;
displayable.game_process();
if(second != (system.currenttimemillis() /1000)){
second = system.currenttimemillis()/1000;
frames_per_second = count;
count = 1;
}else
count ++;
}
}
if(exitapp) {
destroyapp(true);
notifydestroyed();
}
}
public void pauseapp() {
running =false;
}
public void destroyapp(boolean unconditional) {
running = false;
}
public static void quitapp() {
running =false;
exitapp =true;
}
}
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!


