笨木头  2012-04-20 12:31     Android     阅读(5457)     评论(8)
转载请注明,原文地址: http://www.benmutou.com/archives/219
文章来源:笨木头与游戏开发
游戏开发中,免不了有很多定时任务、动画效果。

这些不是在一次的流程中就能执行完毕的。

正常情况下,我会想到用线程,但是,这么多定时任务,这么多动画效果,哪能这么多线程呢?~

于是,笨木头有笨方法~

自己模拟一下多线程就好了嘛~不就间隔一段时间执行一个函数么,简单~

来,看看:
public class GameEventThread extends Thread {
	private final String TAG = "GameEventThread";

private int SLEEP_TIME = 10;

/* 注意咯,A_GameEvent是一个事件类,就是用来模拟子线程的 */private ArrayList<A_GameEvent> gameEventList = new ArrayList<A_GameEvent>();

private boolean isRun = true;

public GameEventThread(String threadName) { super(threadName); }

public GameEventThread(String threadName, int iSleepTime) { super(threadName); this.SLEEP_TIME = iSleepTime; }

/** * 添加事件到线程的事件列表中 * @param event */ public void addGameEvent(A_GameEvent event) { if(gameEventList.contains(event) == false) { gameEventList.add(event); } }

public void stopRun() { this.isRun = false; }

@Override public void run() { Iterator<A_GameEvent> iter = null; A_GameEvent event = null;

while(isRun) { /* 遍历事件列表 */ try { iter = gameEventList.iterator(); while(iter.hasNext()) { event = iter.next();

/* 事件存活 */ if(event.isAlive()) { /* 到达事件执行时间 */ if(event.isAtTheTime()) { event.doEvent(); } } else { /* 事件已经不存活,删除该事件 */ iter.remove(); } } } catch (ConcurrentModificationException e1) { }

try { Thread.sleep(SLEEP_TIME); } catch (InterruptedException e) { } } }
这是一个线程,要做的工作很简单,就是不断遍历事件列表,发现某个事件到达了执行时间,就执行该事件的回调函数~

那,那,你是不是很想问我,怎么判断事件达到了执行时间呢?~

来,听听我的做法:
public abstract class A_GameEvent implements I_GameEvent {
	protected boolean isAlive = true;
	private long startTime = 0;
	private int iSleepTime = 0;

public A_GameEvent(int _iSleepTime) { this.iSleepTime = _iSleepTime;

refreshStartTime(); }

/* 记录开始时间 */ public void refreshStartTime() { startTime = System.currentTimeMillis(); }

/* 判断是否达到了时间间隔: 当前时间 - 开始时间 大于 休眠时间 */ public boolean isAtTheTime() { long endTime = System.currentTimeMillis(); long span = endTime - startTime;

if(span >= iSleepTime) { startTime = endTime; return true; } return false; }

/* isAlive标记事件是否存活,如果事件不存活,就会被kill掉 */ public void setisAlive(boolean isAlive) { this.isAlive = isAlive; } }
怎么样?很简单吧?当前时间减去添加事件时的时间,如果这个时间大于我们设定的事件休眠时间,就执行该事件~

喂~!等等,你怎么不问我I_GameEvent接口是什么?

嘿嘿,是这个:
public interface I_GameEvent {
	public void doEvent();		// 执行操作
	public boolean isAlive();		// 判断该操作是否存活
}
简单~不解释~

再来理一遍~

1. 有很多个事件类,事件类有一个开始时间,还有休眠时间。

2. 有一个全局线程,不断遍历一个事件列表。

3. 当前时间 - 事件开始时间 大于等于 事件的休眠时间,则执行事件。

4. 没了~完毕~

哎吖~我知道,这个方法也许早就有了~

但是,但是~这是我自己领悟的~没有看任何书籍,没有看任何文章~没有问任何人~

就是在开发过程中领悟的~噢~不行,你们一定要赞我~

好吧,不赞就...不赞咯...
8 条评论
  • lgp159753    2012-06-29 02:00:00

    攒 顶一个
    回复
  • musicvs    2012-06-29 08:59:00

    [reply]lgp159753[/reply]
    嘻嘻~
    回复
  • jizhoubo    2012-06-29 09:48:00

    哈哈 赞一个!
    回复
  • musicvs    2012-06-29 12:36:00

    [reply]jizhoubo[/reply]
    哈哈,谢谢~很开心
    回复
  • jizhoubo    2012-06-29 23:37:00

    客气啦,其实该谢谢你。这样用心去学习、又愿意分享经验的年轻博主不是很多哦[reply]musicvs[/reply]
    回复
  • musicvs    2012-06-30 09:05:00

    [reply]jizhoubo[/reply]
    因为有前辈告诉我:分享使人进步。嘻嘻
    回复
  • stalendp    2012-12-01 14:07:00

    不知道博主在编写多线程的时候,有没有考虑过线程同步的问题
    回复
  • musicvs    2012-12-01 19:34:00

    [reply]stalendp[/reply]
    有的,但是我多线程的水平好水,所以现在能不多线程的我都尽量不用了~
    回复
发表评论
粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发