版权所有。所有权利保留。
欢迎转载,转载时请注明出处:
http://blog.csdn.net/xiaofei_it
游戏一般有好几个线程,有画图线程、产生物体的线程、让物体移动的线程、计时线程,这些通常情况下都要单独成为一个线程,并且要能够随时停止并且也可以随时重启。
通常Java用Thread实现线程,如果要做到每隔固定时间执行某个任务,通常用Timer实现。但它们有一个问题,就是一旦停止,那么就不能再启动了。所以我在制作游戏的过程中,自己写了一个MyTimer类,可以做到随时重启。
代码中task是线程执行的任务,task每隔sleepPeriod毫秒执行一次。私有的内部类MyThread主要实现不间断执行task的功能,只要其变量running为true,便一直执行,每次记录执行开始时间和结束时间,然后计算还要休眠多长时间,随后便进行休眠,然后再接着执行。MyTimer的start函数主要是检查thread私有变量,如果没有初始化,那么就说明没有开始执行,那么就初始化thread变量,然后开始执行。如果在执行,那么就把它停止,然后new一个MyThread,再执行。如果不在执行,那么直接new一个MyThread再执行。
public class MyTimer { private final TimerTask task; private MyThread thread; private final int sleepPeriod; private class MyThread extends Thread { private boolean running; @Override public void start() { running=true; super.start(); } public boolean isRunning() { return running; } public void pause() { running=false; } @Override public void run() { while (running) { long start=System.currentTimeMillis(); task.run(); try { long end=System.currentTimeMillis(); if (end-start<sleepPeriod) Thread.sleep(sleepPeriod-(end-start)); } catch (Exception e) {} } } } public MyTimer(TimerTask t,int i) { task=t; sleepPeriod=i; } public void start() { if (thread==null) { thread=new MyThread(); thread.start(); return; } if (thread.isRunning()) { thread.pause(); thread=new MyThread(); thread.start(); return; } thread=new MyThread(); thread.start(); } public void pause() { if (thread!=null) thread.pause(); } public boolean isAlive() { if (thread==null) return false; return thread.isAlive(); } }
另外TimerTask是一个借口,代码如下:
public interface TimerTask { public void run(); }
下面说一下游戏线程。之前已经说了,游戏一般有好几个线程,有画图线程、产生物体的线程、让物体移动的线程、计时线程。这些线程最好都各自成为一个线程。但对于游戏物体移动的线程,一般有两种实现方法。一个是单独建立一个线程,管控每个游戏物体。另一种方法是在每个游戏物体绑定一个线程。第二种做法实现简单,但这个消耗内存比较大。如果游戏中物体步调不一致,则第二种方法更易实现这种效果。但是本人推荐使用第一种方法,因为这种方法使游戏中的每个物体步调一致,也很容易实现相应的物理引擎,另外,这种方法调试起来很方便。即使对于步调不一致的物体,也可以通过一定的技巧进行改造,然后就可以使用第一种方法了。
在实现每个线程的时候,一定要读取状态机的当前状态,根据不同状态,进行相应的操作。
画图线程实现:
drawThread=new MyTimer(new TimerTask() { public void run() { 根据不同游戏状态画图。 注意:在游戏进行时,要调用游戏物体的函数获取位置和背景, 然后在图上画出。这个在以后介绍游戏物体和游戏世界时介绍。 } },Const.getInstance().sleepPeriod);
物体移动的实现:
moveThread=new MyTimer(new TimerTask() { public void run() { if (StateMachine.getInstance().getCurrentState()!=State.gameMode) return; world.move(Const.getInstance().sleepPeriod); } },Const.getInstance().sleepPeriod);