(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) 戰鬥結束之後,把所有執行緒通通關掉 收工


arrow
arrow
    全站熱搜

    finalfrank 發表在 痞客邦 留言(0) 人氣()