遊戲開發中,免不瞭有很多定時任務、動畫效果。
這些不是在一次的流程中就能執行完畢的。
正常情況下,我會想到用線程,但是,這麼多定時任務,這麼多動畫效果,哪能這麼多線程呢?~
於是,笨木頭有笨方法~
自己模擬一下多線程就好瞭嘛~不就間隔一段時間執行一個函數麼,簡單~
來,看看:
[java]
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) {
}
}
}
這是一個線程,要做的工作很簡單,就是不斷遍歷事件列表,發現某個事件到達瞭執行時間,就執行該事件的回調函數~
那,那,你是不是很想問我,怎麼判斷事件達到瞭執行時間呢?~
來,聽聽我的做法:
[java]
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接口是什麼?
嘿嘿,是這個:
[java]
public interface I_GameEvent {
public void doEvent(); // 執行操作
public boolean isAlive(); // 判斷該操作是否存活
}
簡單~不解釋~
再來理一遍~
1. 有很多個事件類,事件類有一個開始時間,還有休眠時間。
2. 有一個全局線程,不斷遍歷一個事件列表。
3. 當前時間 – 事件開始時間 大於等於 事件的休眠時間,則執行事件。
4. 沒瞭~完畢~
哎吖~我知道,這個方法也許早就有瞭~
但是,但是~這是我自己領悟的~沒有看任何書籍,沒有看任何文章~沒有問任何人~
就是在開發過程中領悟的~噢~不行,你們一定要贊我~
好吧,不贊就…不贊咯…
摘自 笨木頭