(1) 各戰鬥中角色,各有一個執行緒,決定輪到他的時機 (就是右下角那個條)
速度越快(agi越高)的角色,這個條跑的越快,條跑滿的時候就輪到他
(2) 當輪到他的時候,輪到的人就依序進入一個Queue,開始排隊等處理
當排到他的時候,就顯示出這個角色的操作畫面,如果操作完了,
這程式就去找下一個在排隊的,如果有找到人在排隊,就顯示出這個角色的操作畫面
不斷的循環下去
(這個處理排隊的程式也是一個執行緒)
queue長度 > 我方 + 敵方 人數
(不能等於或小於,因為有可能有人速度很快,你動一步它動兩步,
如果又發生所有人都進入queue至少一次的情況,那queue就爆炸了,程式就當機了)
//關於隊列Queue的處理 新增人進來排隊的方法//
now=waiting=0; //initialize
queue[now]=跑完條子的; now++; waiting++;//把新來的排進Queue,它算一個等待者
//排隊執行演算法//
while(true){
if( waiting>0 && queue_lock==false ){
waiting--;
operate(queue[now-waiting]); //執行目前排到的人的操作畫面
queue_lock=true; //等他動作完再讓下一個排隊的動作
}
}
(3) 每當有一個(2)的操作畫面操作完畢,就開始把那些操作的內容丟到另外一個函式
然後把那個角色的(1)執行緒歸零 (讓他重新開始跑)
那個函式負責處理 要執行哪些動作(攻擊 防禦 魔法 道具 逃跑..)
並且接受剛才要動作的角色的數值 (例如他要攻擊的話,就要取得他的攻擊力)
struct action{ //角色命令的結構
int command;
int target;
int use_skill;
int use_magic;
int item_type;
};
action character; //宣告角色命令結構
if(character.command=="攻擊"){ //當角色選擇的是攻擊
attack(character.target); //攻擊命令選擇的目標
}
....後略
動作執行完後記得 (2)的lock改為 false
(4) 有一些狀況,那個(1)的條必須要停止 (例如敵攻擊、使用大型魔法技能)
所以要把那些處理(1)的條的執行緒暫停 並且把(2)的lock改為true
等到那些狀況結束之後 (1)的執行緒恢復 繼續跑 (2)的lock改為false
(5) 如果角色死亡,他的(1)的執行緒,就終止,直到復活才恢復
去queue裡面找,把所有含有那個死亡角色的排隊都刪除
(6) 戰鬥結束之後,把所有執行緒通通關掉 收工