<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 1  文章 - 37  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    留言簿(16)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    test

    搜索

    •  

    最新評論

    人物角色有多種動作:上馬,下馬,走,跑,物理攻擊,魔法攻擊,施放魔法,交易 .....等等
    每個動作間隔為600毫秒,任務有可能會執(zhí)行失敗。

    /**
     * 角色動作調(diào)度器
     * 
    @author Donf Yang
     
    */

    public final class ActionDispatcher {

        
    /**
         * 上一次動作的執(zhí)行時間
         
    */

        
    private static long previousActionTime = 0;

        
    /**
         * 每次動作執(zhí)行時間間隔
         
    */

        
    public static final int ACTION_INTERVAL = 600;

        
    /**
         * 上一個ActionMission,不受調(diào)度器控制,當currentActionMission不可執(zhí)行時,調(diào)度該Mission [未實現(xiàn)]
         
    */

        
    private static ActionMission previousActionMission = null;
        
    /**
         * 下一個ActionMission,不受調(diào)度器控制,當continueDispatch時,優(yōu)先調(diào)度
         
    */

        
    private static ActionMission nextActionMission = null;

        
    private static ActionMission currentActionMission = null;

        
    private static final String ISDISPATCHLOCKME = "IL";
        
    private static final String ACTIONLOCKME = "AL";

        
    private static Logger log = LoggerFactory.getLogger(ActionDispatcher.class);

        
    private static boolean isActionExecuting = false;

        
    /**
         * dispatch之前,先判斷是否可以被調(diào)度isDispatchable(); 如果不能被調(diào)度,調(diào)用setNextActionMission();
         * 
         * 
    @param action
         * 
    @throws Exception
         
    */

        
    public static void dispatch(ActionMission action) throws Exception {

            
    if (!isDispatchable()) {
                
    return;
            }

            
    try {
                setDispatching(
    true);
                currentActionMission 
    = action;
                
    /*
                 * 如果Action時間為0,說明該動作沒有執(zhí)行
                 
    */

                
    long _l = action.doMission();
                
    if (_l == 0{
                    setDispatching(
    false);
                }
     
            }
     catch (Exception e) {
                setDispatching(
    false);
                
    throw e;
            }

        }


        
    /**
         * GameProcess接受到服務器返回的動作執(zhí)行成功指令
         
    */

        
    public static void actionGood() {
            currentActionMission.returnActionGood();
            
    try {
                continueDispatch();
            }
     catch (Exception e) {
                setDispatching(
    false);
                e.printStackTrace();
            }


        }


        
    /**
         * GameProcess接受到服務器返回的動作執(zhí)行失敗指令
         
    */

        
    public static void actionFail() {
            currentActionMission.returnActionFail();
            
    try {
                continueDispatch();
            }
     catch (Exception e) {
                setDispatching(
    false);
                e.printStackTrace();
            }

        }


        
    private static void continueDispatch() throws Exception {
            
    synchronized (ACTIONLOCKME) {
                
    if (nextActionMission != null{
                    currentActionMission 
    = nextActionMission;
                    nextActionMission 
    = null;
                }

            }

            
    try {
                
    if (currentActionMission.isContinueExecutable()) {
                    setDispatching(
    true);
                    
    /*
                     * 如果Action時間為0,說明該動作沒有執(zhí)行
                     
    */

                    
    long _l = currentActionMission.continueDoMission();
                    
    if (_l == 0{
                        setDispatching(
    false);
                    }

                }
     else {
                    setDispatching(
    false);
                }

            }
     catch (Exception e) {
                setDispatching(
    false);
                
    throw e;
            }


        }


        
    /**
         * 設置當前是否有Mission正在被執(zhí)行的狀態(tài)
         * 
    @param dispatching
         
    */

        
    private static void setDispatching(boolean dispatching) {
            
    synchronized (ISDISPATCHLOCKME) {
                isActionExecuting 
    = dispatching;
            }

        }


        
    /**
         * Mission是否可以被馬上執(zhí)行,由當前是否有Mission正在被執(zhí)行決定
         * 
    @return
         
    */

        
    public static boolean isDispatchable() {
            
    synchronized (ISDISPATCHLOCKME) {
                
    return !isActionExecuting;
            }

        }


        
    public static void setNextActionMission(ActionMission actionMission) {
            
    synchronized (ACTIONLOCKME) {
                nextActionMission 
    = actionMission;
            }

        }


        
    public static void setPreviousActionMission(ActionMission actionMission) {
            
    synchronized (ACTIONLOCKME) {
                previousActionMission 
    = actionMission;
            }

        }

        
        
    /**
         * 設置調(diào)度時間,600毫秒
         * 
    @return
         
    */

        
    public static long dispatchActionTime(){
            
    long _l = ActionDispatcher.generateCurrentActionTime();
            
    if (_l - previousActionTime < ActionDispatcher.ACTION_INTERVAL) {
                
    try {
                    Thread.sleep((ActionDispatcher.ACTION_INTERVAL 
    - (_l - previousActionTime)));
                }
     catch (Exception e) {
                    e.printStackTrace();
                }

                previousActionTime 
    = ActionDispatcher.generateCurrentActionTime();
            }
     else {
                previousActionTime 
    = _l;
            }

            
    return previousActionTime;
        }


        
    /**
         * 為Action生成當前時間
         * 
    @return
         
    */

        
    public static long generateCurrentActionTime() {
            Calendar now 
    = Calendar.getInstance();
            
    return now.get(Calendar.HOUR_OF_DAY) * 3600000 + now.get(Calendar.MINUTE) * 60000
                    
    + now.get(Calendar.SECOND) * 1000 + now.get(Calendar.MILLISECOND);
        }


    }


     

    /**
     * ActionMission,可調(diào)度的動作任務,該任務可以是一個簡單的移動,也可以包含N層任務的AI流程
     * 
    @author Donf Yang
     
    */

    public interface ActionMission {

        
    /**
         * 首次執(zhí)行Mission
         * 
    @return 返回Action執(zhí)行時的當前時間,如果為0,說明沒有被執(zhí)行
         * 
    @throws Exception
         
    */

        
    public long doMission() throws Exception;

        
    /**
         * 繼續(xù)執(zhí)行Mission
         * 
    @return 返回Action執(zhí)行時的當前時間,如果為0,說明沒有被執(zhí)行
         * 
    @throws Exception
         
    */

        
    public long continueDoMission() throws Exception;
        
        
    /**
         * 服務器返回動作執(zhí)行成功,該方法不能有過多的動作邏輯
         
    */

        
    public void returnActionGood();
        
        
    /**
         * 服務器返回動作執(zhí)行失敗,該方法不能有過多的動作邏輯
         
    */

        
    public void returnActionFail();

        
    /**
         * 是否需要(可以)繼續(xù)執(zhí)行
         * 
    @return
         
    */

        
    public boolean isContinueExecutable();

    }


    動作的回調(diào)接口

    /**
     * 
     * ControllableAction回調(diào)接口 <br />
     * 1. 停止當前動作<br />
     * 2. 當動作完成時,得到通知
     * 
     * 
    @author Donf Yang
     * @2008-7-8 下午09:31:44
     
    */

    public interface ActionObserver {

        
    public void onControllableActionFinished(ControllableAction action);
        
    }

    /**
     * 
     * 所有可控制的動作接口需要繼承該接口,用于回調(diào) <br />
     * 
     * 
    @author Donf Yang
     * @2008-7-8 下午09:32:31
     
    */

    public interface ControllableAction {
        
        
    public void stopAction();

    }
    posted on 2008-07-06 18:05 Phrancol Yang 閱讀(481) 評論(0)  編輯  收藏 所屬分類: Mir3gAnyWhere

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 亚洲一本之道高清乱码| 亚洲第一黄片大全| 免费三级毛片电影片| 100部毛片免费全部播放完整| a级毛片毛片免费观看久潮| 国产在线播放线91免费| 在线视频网址免费播放| 91成人免费观看网站| 亚洲第一网站免费视频| 亚洲成年人免费网站| 噼里啪啦免费观看高清动漫4| 妻子5免费完整高清电视| 女人18特级一级毛片免费视频| 好爽…又高潮了毛片免费看| 日韩免费高清视频| 亚洲国产精品一区二区第四页| 亚洲国产精品无码久久久久久曰| 亚洲综合AV在线在线播放| 无码国产精品久久一区免费| 嫩草影院免费观看| 无码国产亚洲日韩国精品视频一区二区三区 | 中文字幕亚洲码在线| 亚洲高清乱码午夜电影网| 偷自拍亚洲视频在线观看| 在线视频网址免费播放| 日韩免费无码视频一区二区三区| 24小时日本电影免费看| 成人无遮挡裸免费视频在线观看| 国产无遮挡又黄又爽免费视频| 亚洲午夜福利精品无码| 日韩免费高清视频网站| 亚洲天堂中文字幕在线| 亚洲AV无码久久精品狠狠爱浪潮| 亚洲色欲或者高潮影院| 亚洲精品无码专区久久| 羞羞视频免费网站在线看| 一级毛片在线免费看| 成年女人免费碰碰视频| 国产a v无码专区亚洲av| 亚洲一区二区成人| 亚洲精品乱码久久久久久V|