浅谈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、后记

    由于博主我的缘由,代码不肯意公开,因此本篇博文不过是个技术总结罢了。

    总而言之,天气系统在游戏中不是一个很难实现的系统,不过在实际编写代码的过程当中仍是会遇到不少问题。

    天气系统的主要难点只有两个,一是各类渐变效果,二是天气的表现效果,没有很硬核的技术。

    最后感谢您看到这里,若是有好的想法和建议,欢迎留言~

相关文章
相关标签/搜索