淺談cocos2d遊戲中天氣系統的簡單實現

1、前言

   此博客由一個新手遊戲程序編寫,沒有高深的技術,基本是天氣效果表現和代碼設計的淺談,若是有更好的實現方法,歡迎指正。編輯器

2、背景

   該系統設計背景:2D遊戲、正交45度表現地圖、以及同一張地圖上存在不一樣氣候的區域/地形,須要體現不一樣天氣效果以及不一樣天氣的切換ide

   相似遊戲:三國羣英傳(地圖類似)、塞爾達傳說-衆神的三角力量(天氣表現類似)、口袋妖怪綠寶石(天氣表現類似)函數

3、全局計算和局部表現

   額外系統:區域劃分系統學習

   根據地圖的設計,各個理論上會出現不一樣氣候的地形均放在一張地圖裏面,所以在遊戲中就須要有一個相似「氣象臺」的系統來控制不一樣區域的天氣,而後根據玩家所在區域去「表現」當前區域的天氣,該設計的目的就是爲了節省cpu和內存。優化

   衆所周知,天氣的表現是會有不小的消耗的(2d遊戲中,大量的雨滴粒子以及地面滴水錶現;3d遊戲中則是畫面的渲染),直接全場景添加天氣的效果明顯不現實,因此採用全局計算天氣的狀態,再根據位置表現天氣的方式去實現該系統動畫

  一、全局計算

   「氣象臺」的實現須要引入另一個系統:區域劃分系統。該系統系統主要的做用有兩點:1)根據玩家的位置得出當前所在區域。2)根據時間變化實施計算各個天氣的狀態ui

   第一點的實現,在此不展開講,區域劃分的方式因人而異,博主採用的方式就是把區域當作一個多邊形去作,若是使用這種方法的話,區域斷定提供兩種方式:spa

    1)必定時間判斷點與多邊形的包含關係。設計

     這個能夠去搜索「判斷點是否在多邊形內部」,而後定時去計算。3d

     參考:https://www.jianshu.com/p/ba03c600a557

     優勢:空間上的精準;實現方式清晰,複雜度能夠本身控制。缺點:頻繁調用,時間上不夠精準。

    2)物理框碰撞。

     這個方法是博主朋友提議的,並未實現。也是把區域當作一個多邊形,不過這個多邊形是一個物理框,玩家(也須要有物理框)進入和離開區域的時候去調用其碰撞函數,再去斷定位置

     優勢:時間上的精準;方法不用本身實現。缺點:空間上的準確度有待商榷;須要進一步優化須要學習底層代碼。

   天氣狀態也是因人而異,不過最重要的就是「天氣」和「天數」了。

  二、局部表現

   無論用什麼方式獲得當前區域的天氣以後,就須要去表現天氣。表現的方式就是在攝像機上,把粒子和效果添加到相機節點上(或者根據相機位置添加到地圖上),具體的表現和實如今下一節講述。

4、天氣表現效果

   天氣系統的運做方式決定了以後,就是去設計天氣的表現效果了。

   博主設計的天氣目前有四種:小雨、烈日、沙暴和暴雨

  一、小雨和暴雨

   效果參考:

   

   該天氣推薦使用cocos2d的粒子編輯器(Particle Builder)作。粒子編輯器能夠用一張圖片表現各類效果,以下面兩張圖,只須要調節參數就能夠作出下雨特效

     

      

   下雨的時候能夠在相機上再添加一個圖片精靈(或者着色精靈)去實現變暗效果,經過修改顏色和透明度起到天變暗的效果,在暴雨天下,設置能夠在幾幀內瞬間改變亮度和顏色,起到打雷的表現效果

   根據個人理解,粒子編輯器只能針對一張圖片作特效,而地面滴水須要一個動畫表示,因此須要建立精靈節點去播放動畫,實現方式下文再講。下圖是植物大戰殭屍滴水特效:

   

   滴水精靈節點須要添加在地圖節點上,若是添加在相機節點上的話,那麼若是相機跟隨人物移動的話,滴水還沒消失就會移動會看上去很彆扭。

   滴水效果添加是頗有必要的,博主表達能力不強,因此只能用「感受上沒滴水的雨很彆扭」這句話去形容。

     最終效果:

           

  二、沙暴

    

    看到圖應該就能理解了,目前實現方式爲一張圖片循環移動。

  三、烈日

    烈日實現的效果目前參考口袋妖怪綠寶石的烈日的效果,在以前下雨的着色精靈把透明度調高,改變顏色實現(和雨天的閃電閃屏效果相似),不過效果並非很好……

    

5、技術點(代碼和數值設計的緣由)

  一、全部天氣精靈獨立

    各個表現天氣的精靈都須要獨立,目的是防止在「切換」表現天氣時出現衝突。人物從一個區域走到另一個區域的時候,天氣系統須要作的事是:原區域天氣逐漸消失,現區域天氣逐漸出現,若是全部精靈(或者個別精靈)共用一個節點的話,那麼「新」的天氣精靈會覆蓋以前的天氣精靈,致使原區域天氣瞬間消失。

    
        def __init__(self):
            # 雨天精靈
            self.RainSprite = None
            # 沙暴精靈
            self.SandStormSprite = None
            # 暴雨精靈
            self.RainStormSprite = None    
View Code

 

  二、區域劃分的時候須要有過渡區

    說簡單一點就是劃分區域的時候,把邊緣部分再劃分一個區域。其目的是防止不一樣區域刷出徹底對立的天氣致使的不合理,好比說沙漠目前處於烈日狀態,而沙漠外的草原在下暴雨,若是沒有作過渡區,會出現「烈日漸漸消失,暴雨漸漸出現」的天氣切換效果,雖然是漸變效果,但仍是出現了烈日和暴雨同時出現的畫面,很是不合理。

  三、滴水效果實現方法

    前文講了,滴水效果是動畫效果,不能用粒子編輯器來作。因此博主的實現方式是:在初始化天氣的時候,直接建立一堆精靈(好比暴雨天,地面上須要有300個滴水效果),每幀(時間間隔能夠改)去播放動畫,在播放動畫以前把精靈移動到攝像機視野範圍內。當前區域天氣的表現結束的時候,也不要銷燬精靈, 而是繼續保留,其目的是防止頻繁的建立精靈致使的消耗,水滴精靈的內存佔用和地圖相比,一般只佔了很小一部分,權衡之下,能夠用空間去換時間。

6、後記

    由於博主我的緣由,代碼不肯意公開,因此本篇博文不過是個技術總結罷了。

    總而言之,天氣系統在遊戲中不是一個很難實現的系統,不過在實際編寫代碼的過程當中仍是會遇到不少問題。

    天氣系統的主要難點只有兩個,一是各類漸變效果,二是天氣的表現效果,沒有很硬核的技術。

    最後感謝您看到這裏,若是有好的想法和建議,歡迎留言~

相關文章
相關標籤/搜索