(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 的頭像
    finalfrank

    Frank's 資訊科技潮流站

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