好久没写东西了,我们接着以前的地图来讲吧。进入游戏给玩家最直观的东西就是场景。我们在场景中能看到当前场景的地图的样子(比如:沙滩,森林,火山等),在这个场景里你首先会看到你自己这个MyPlayer,然后你还能看到其他的玩家,你或许还能看到一些在地图上的NPC,Monster,Pet等其他Model。对,没错,这些东西都应该有一个基类,我们可以把它叫做Model,然后它可以派生出Player,Npc,Pet等子类,它们都会具有一个动画属性,在进入场景初始化地图后这些动画会被加载。这里面有几个问题得注意下:
我们一个场景必定对应相应的一个地图资源,so,如果不是这样的话,烧死策划!因为在rpg游戏中资源消耗比较狠,所以需要一些优化方法,首先是独立于地图之外的一个摄像机,当然这个摄像机一般是和屏幕一样大小的;地图或许N大,但是摄像机只有几百*几百,那么对于在屏幕外面的地图底块和摆件就不要去渲染啦,地图纹理毫无疑问地被放进缓存,在跳地图的时候我们再清理吧,减少IO操作。
对于场景中存在的MapPlayer(地图玩家),NPC,Monster等Model,请选用Map作为存储的数据结构。毕竟他们都会拥有一个唯一的标识符aid来区分他们。这里又涉及到一个加载动画的问题,我们用for遍历吧简单省事但这很粗暴,不是我们的风格。请在Model下设置一个bool型的flag来记录他们的动画模型是否被加载过,而我们会将for遍历放入定时器中,只有当没有加载过的Model的动画才会被加载,已经加载过的就不需要了。在NPC,Pet这类Model中,我们会需要一些配置表的信息,比如说,你点一个NPC他固定会说句:为了部落!那么这些数据需要从配置表里去读,本地是需要有配置表的,如果完全从服务器去获取这些东西,体验是很不好的也没有必要。至于配置表的选择以后有机会再聊,那么这个配置表信息,我们是应该在游戏启动的时候将他们load入缓存的,当然一些非必要性的数据我们可以需要的时候再去读取它,毕竟放入缓存是需要内存消耗的。对于DBData,都存在于这些NPC,Pet下面,而这些数据都建议进行提前进入游戏的时候进行加载,一般加载都很快,做一个进度条过度也不显得不舒服,如果等需要碰到这个NPC触发事件的时候再去读,感觉会不那么流畅或者有一种卡的现象。当然这种是否需要提前预加载就需要大家自己琢磨了,毕竟过多使用缓存也不好,得找到一个平衡点。
至于UI部分,这必须是单独的一个layer来贴在woldLayer最顶层。总之,地图,模型,ui独自分开,但我们却会用一个WorldLayer来承载这些东西,而这些东西我们再通过一个单例Controller来将他们合在一起。这或许也能叫做MVC模式的一种体现了吧。