此博客由一个新手游戏程序编写,没有高深的技术,基本是天气效果表现和代码设计的浅谈,若是有更好的实现方法,欢迎指正。编辑器
该系统设计背景:2D游戏、正交45度表现地图、以及同一张地图上存在不一样气候的区域/地形,须要体现不一样天气效果以及不一样天气的切换ide
相似游戏:三国群英传(地图类似)、塞尔达传说-众神的三角力量(天气表现类似)、口袋妖怪绿宝石(天气表现类似)函数
额外系统:区域划分系统学习
根据地图的设计,各个理论上会出现不一样气候的地形均放在一张地图里面,所以在游戏中就须要有一个相似“气象台”的系统来控制不一样区域的天气,而后根据玩家所在区域去“表现”当前区域的天气,该设计的目的就是为了节省cpu和内存。优化
众所周知,天气的表现是会有不小的消耗的(2d游戏中,大量的雨滴粒子以及地面滴水表现;3d游戏中则是画面的渲染),直接全场景添加天气的效果明显不现实,因此采用全局计算天气的状态,再根据位置表现天气的方式去实现该系统动画
“气象台”的实现须要引入另一个系统:区域划分系统。该系统系统主要的做用有两点:1)根据玩家的位置得出当前所在区域。2)根据时间变化实施计算各个天气的状态ui
第一点的实现,在此不展开讲,区域划分的方式因人而异,博主采用的方式就是把区域当作一个多边形去作,若是使用这种方法的话,区域断定提供两种方式:spa
1)必定时间判断点与多边形的包含关系。设计
这个能够去搜索“判断点是否在多边形内部”,而后定时去计算。3d
参考:https://www.jianshu.com/p/ba03c600a557
优势:空间上的精准;实现方式清晰,复杂度能够本身控制。缺点:频繁调用,时间上不够精准。
2)物理框碰撞。
这个方法是博主朋友提议的,并未实现。也是把区域当作一个多边形,不过这个多边形是一个物理框,玩家(也须要有物理框)进入和离开区域的时候去调用其碰撞函数,再去断定位置
优势:时间上的精准;方法不用本身实现。缺点:空间上的准确度有待商榷;须要进一步优化须要学习底层代码。
天气状态也是因人而异,不过最重要的就是“天气”和“天数”了。
无论用什么方式获得当前区域的天气以后,就须要去表现天气。表现的方式就是在摄像机上,把粒子和效果添加到相机节点上(或者根据相机位置添加到地图上),具体的表现和实如今下一节讲述。
天气系统的运做方式决定了以后,就是去设计天气的表现效果了。
博主设计的天气目前有四种:小雨、烈日、沙暴和暴雨
效果参考:
该天气推荐使用cocos2d的粒子编辑器(Particle Builder)作。粒子编辑器能够用一张图片表现各类效果,以下面两张图,只须要调节参数就能够作出下雨特效
下雨的时候能够在相机上再添加一个图片精灵(或者着色精灵)去实现变暗效果,经过修改颜色和透明度起到天变暗的效果,在暴雨天下,设置能够在几帧内瞬间改变亮度和颜色,起到打雷的表现效果
根据个人理解,粒子编辑器只能针对一张图片作特效,而地面滴水须要一个动画表示,因此须要建立精灵节点去播放动画,实现方式下文再讲。下图是植物大战僵尸滴水特效:
滴水精灵节点须要添加在地图节点上,若是添加在相机节点上的话,那么若是相机跟随人物移动的话,滴水还没消失就会移动会看上去很别扭。
滴水效果添加是颇有必要的,博主表达能力不强,因此只能用“感受上没滴水的雨很别扭”这句话去形容。
最终效果:
看到图应该就能理解了,目前实现方式为一张图片循环移动。
烈日实现的效果目前参考口袋妖怪绿宝石的烈日的效果,在以前下雨的着色精灵把透明度调高,改变颜色实现(和雨天的闪电闪屏效果相似),不过效果并非很好……
各个表现天气的精灵都须要独立,目的是防止在“切换”表现天气时出现冲突。人物从一个区域走到另一个区域的时候,天气系统须要作的事是:原区域天气逐渐消失,现区域天气逐渐出现,若是全部精灵(或者个别精灵)共用一个节点的话,那么“新”的天气精灵会覆盖以前的天气精灵,致使原区域天气瞬间消失。
def __init__(self): # 雨天精灵 self.RainSprite = None # 沙暴精灵 self.SandStormSprite = None # 暴雨精灵 self.RainStormSprite = None
说简单一点就是划分区域的时候,把边缘部分再划分一个区域。其目的是防止不一样区域刷出彻底对立的天气致使的不合理,好比说沙漠目前处于烈日状态,而沙漠外的草原在下暴雨,若是没有作过渡区,会出现“烈日渐渐消失,暴雨渐渐出现”的天气切换效果,虽然是渐变效果,但仍是出现了烈日和暴雨同时出现的画面,很是不合理。
前文讲了,滴水效果是动画效果,不能用粒子编辑器来作。因此博主的实现方式是:在初始化天气的时候,直接建立一堆精灵(好比暴雨天,地面上须要有300个滴水效果),每帧(时间间隔能够改)去播放动画,在播放动画以前把精灵移动到摄像机视野范围内。当前区域天气的表现结束的时候,也不要销毁精灵, 而是继续保留,其目的是防止频繁的建立精灵致使的消耗,水滴精灵的内存占用和地图相比,一般只占了很小一部分,权衡之下,能够用空间去换时间。
由于博主我的缘由,代码不肯意公开,因此本篇博文不过是个技术总结罢了。
总而言之,天气系统在游戏中不是一个很难实现的系统,不过在实际编写代码的过程当中仍是会遇到不少问题。
天气系统的主要难点只有两个,一是各类渐变效果,二是天气的表现效果,没有很硬核的技术。
最后感谢您看到这里,若是有好的想法和建议,欢迎留言~