现在的位置: 首页 > 综合 > 正文

android小游戏制作心得(三)——游戏线程

2014年09月05日 ⁄ 综合 ⁄ 共 2155字 ⁄ 字号 评论关闭

版权所有。所有权利保留。

欢迎转载,转载时请注明出处:

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);

抱歉!评论已关闭.