一、游戏的线程
线程是程序中的一个执行流,每个线程都有自己的专有寄存器,但代码区是共享的,即不同的线程可执行同样的函数。多线程是程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行的线程来完成各自的任务。
线程的创建有两种方法,一种是从Thread类派生然后改写run方法,一种是实现Runnable接口的run方法,两种方法代码如下:
public class exThread extends Thread
{
public void run(){…}
public void test();
{
exThread thread=new exThread();
thread.start();
}
}
public class exThread extends Runnable
{
public void run()
{…}
public void test)_
{
Thread thread=new Thread(new exThread());;
thread.start();
}
}
{
public void run(){…}
public void test();
{
exThread thread=new exThread();
thread.start();
}
}
public class exThread extends Runnable
{
public void run()
{…}
public void test)_
{
Thread thread=new Thread(new exThread());;
thread.start();
}
}
派生自Thread类的方法有一个最大的缺点就是不能够在从其他的类派生,只能够实现新的接口,而实现Runnable接口的方式,只需要在已有类的基础上多实现一个run方法而已,没有多余的负担就可以立刻实现线程。由于第一种方法只能够实现新的接口,所以在本程序中,对于线程的创建,只使用了第一种方法。
启动线程时使用了Thread类的start方法,调用start方法后,线程实际上并不会立刻启动,而是有了相应的延迟,这时因为启动新的线程,必然在已经存在的线程上启动,线程的切换消耗时间。
停止或中断一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地终止其当前的操作。线程是死亡还是等待新的任务或是继续运行下一步,就取决于该操作。
由于同一程序的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。比如说一个线程现在正在读取一个值,而在返回这个值之前,另一个线程改变这一个值,这就使得读取的数值出现错误,并不是需要的值,java语言synchronized来解决这个冲突。
Synchronized关键字包括两种用法,即synchronized方法和synchronized块。
Synchronized方法即通过在方法声明中记入synchronized关键字来声明synchronized方法。
Public synchronized void setVat(int newVal);
Synchronized方法控制对类成员变量的访问,确保了同一时刻对于每一个类实例,其所有声明为synchronized的成员函数中至多只有一个处于可执行状态,从而有效避免了类成员变量的访问冲突。
二、机体的控制
GameCanvas中提供了与以往MIDP1.0不同的键盘采样功能。Canvas类中采取响应键盘事件的方法,每次执行周期时会读取keyPressed函数中需执行的代码。这样的机制并不适合某些游戏场合。在某些不支持keyRepeat功能的设备上,反复执行的按键,比如飞机移动,将不能因为长时间按压而自动重复,这样就需要用户高频率的手动击键,这在操纵空间非常有限的移动设备上是非常困难的。同时,事件的执行周期也并不一定适合游戏的场合,也许需要更高频率执行的按键却只能在指定的周期内规律的响应。对此,针对游戏的开发,Game包提供的键盘状态功能将显得十分有效。
GameCanvas提供getKeyStates函数可获取当前键盘上的信息。将以位的形式返回键盘上所有键的按与释放的状态,当bit为1时,键就是被按下的状态,为0时则为释放状态。只需要此一个函数的返回值就可以返回所有键的状态,这保证了快速的按键和释放也会被循环所捕捉。同时,这样的机制也可检测到几个键同时按下的状态,从而提供斜向运行等相应功能。
三、模拟器的相关调试
IDE整合的Wireless Tool Kit提供了许多在运行时监视运行状态的工具。包括内存状况的检测(手机上的内存空间十分有限,必须时刻关注机载内存是否大于程序所能使用到的最大可能的内存空间),网络状况的检测,运行函数的跟踪等。其中,允许强制垃圾回收(Garbage Collection)。由于Java语言中,不像许多其他的如C++语言,不需要指定回收函数中特定的不使用的资源,资源回收机制将自动清空无效变量占用的空间。在程序运行中也可以调用System类的 gc()函数手动收回废弃的内存。手机模拟器如下图:
本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/203835,如需转载请自行联系原作者