<button id="ptu4h"><acronym id="ptu4h"><input id="ptu4h"></input></acronym></button>

<tbody id="ptu4h"></tbody>

    <dd id="ptu4h"><center id="ptu4h"></center></dd><dd id="ptu4h"></dd><dd id="ptu4h"><track id="ptu4h"><video id="ptu4h"></video></track></dd>
  • 16素材
    您現在的位置:首頁 > 教程中心 > Flash教程

    容易忽略的多條件狀態問題

     今天檢查游戲引擎代碼時發現一個不怎么起眼卻會影響整個系統的問題,最終用了一個簡單的方式做了了結。
    這個問題在這里暫時稱之為“多條件狀態問題”。

    我們常常會有這樣一種需求,某個事件觸發的前提有多個操作,每個操作都是一個獨立的行為。那么為了讓我們的代碼更加優雅,我們通常把每一個操作封裝成一個獨立方法。然后再用一個方法來調用這些獨立的方法,最后發出一個完成的事件。

    為了更加準確的理解,我們可以想象現在我們要發射一枚運載火箭,假定發射前我們需要做一些準備才能發射。

    1、電力系統檢查
    2、通訊系統檢查
    3、分離器檢查
    4、加注主推進燃料
    5、加注輔助推進器燃料

    最后通知準備完畢——點火。

    用程序簡單表示一下:

    public function 發射初始化()
    {
    電力系統檢查();
    通訊系統檢查();
    分離器檢查();
    加注主推進燃料();
    加注輔助推進器燃料();

    dispatchEvent(new Event("發射就緒"));
    }

    private function 電力系統檢查()
    {
    ……
    }

    private function 通訊系統檢查()
    {
    ……
    }

    private function 分離器檢查()
    {
    ……
    }

    private function 加注主推進燃料()
    {
    ……
    }

    private function 加注輔助推進器燃料()
    {
    ……
    }

    寫完之后感覺流程清晰,代碼優雅??雌饋砻菜茮]有問題了,而且也確實在大多數情況下你幾乎看不出有什么問題。

    然而真的是這樣嗎???

    仔細分析,你會發現由于我們把繁瑣的方法封裝到了一個個獨立的方法里面。盡管在方法的執行上,他是順序的。但是你卻忽視了至少兩點:

    第一點:方法被依次執行,但是并非是我們想象的第一個方法執行完才執行第二個,而是第一個執行后開始執行下一個。

    換句話說第一個方法開始后,沒有等到結束第二個就開始了,然后第三個、第四個。。。這與我們所期望的是完全背離了。

    第二點:或許“準備就緒”的事件已經發出了,而我們上面的各個發射準備卻還在進行。這相當恐怖了。

    那么為什么很多時候我們測試的時候我們發現不到呢?因為我們的各個獨立方法中的邏輯并不復雜不屬于耗時操作,所以“準備就緒”事件發出后,點火程序執行時正好前面的準備完畢了。所以火箭順利發射出去。

    解決方案:
    現在我們知道了問題的所在,你一定開始想辦法解決了。最簡單的方式我們可以吧這個過程改成順序執行的,即一個條件完成之后再進行下一個(有點像自己分配運行時間片段)。繼續拿發射火箭舉例,就好像總指揮喊話:
    “檢查電力系統”
    “電力系統檢查啟動。。。動力系統檢查完畢!”
    “檢查通訊系統”
    “通訊系統檢查啟動。。。通訊系統檢查完畢!”
    。。。。。。

    “所有檢查完畢,可以發射”
    “點火——”

    我們還可以用另一種方式來實現,使用非順序的事件通知的方式解決。怎么理解?

    現在,總指揮面前出現了5個開關,只有5個開關都打開,點火按鈕才可以按下?,F在的口令模擬一下如下:
    “開始發射準備”
    “電力系統一切正常” 總指揮打開1號開關
    “通訊系統一切正常” 總指揮打開2號開關
    關鍵詞: 容易忽略條件

    相關素材

    聯系客服 加入QQ群
    素材中国