类型对象模式,基于cocos的一个玩家成长系统设计
来源:互联网 发布:联想m41指纹识别软件 编辑:程序博客网 时间:2024/06/03 21:57
1简述:
创造一个类A来允许灵活的创造新的类,而类A的每个实例都代表了不同类型的对象。
要点
- 类型对象模式:定义类型对象类与有类型的对象类。每个类型对象实例代表一种不同的逻辑类型。每种有类型的对象保存描述它类型的对类型对象的引用。
- 类型对象的基本思想就是给基类一个品种类(breed类),而不是用一些子类继承自这个基类。所以我们在做种类区分的时候就可以只有两个类,怪物类monster和品种类breed,而不是monster,dragon,troll等一堆类。所以在此种情况下,游戏中的每个怪物都是怪物类的一个实例,而实例中的breed类包含了所有同种类型怪物共享的信息。
使用场合
这个模式在任何你需要定义不同“种”事物,使用不当会让你的系统过于僵硬。而下面两者之一成立时,就非常适合使用:
- 不知道后续还需什么新类型。(举个例子,如果你的游戏需要支持增量更新,让用户下载后续新包含进来的怪物品种)
- 想要不改变代码或不重新编译就能修改或添加新类型。
2,cocos-lua例子
简述:使用python解析xls生成角色lua配置(可见使用python解析xls生成lua配置),使用配置+类型管理类 实现一个比较灵活的类型对象模式(每个类型以配置的形式保存,从而以数据的形式加载到游戏中);主要目的是方便的对玩家类进行类型转换,只需为玩家类实现一个根据条件转换id的方法。当id变化时通过类型管理类更新属性、外观资源,以及技能列表等表现形式。即玩家有3部分组成 等级-基础属性 类型-属性加成 技能列表-可分主动与被动; 由对象id(可改变)决定类型及技能列表, 触发事件可改变id技能应设计成兼容性高,易扩展的形式,将其封装成一个组件可以加入到任何一个对象中。实现目标:基于一个可升级的玩家对象,触发事件(如某项属性达到阀值)时进行改变(使用特定的配置),改变频繁。生成的lua-id相关配置:核心配置,使用数据的形式存储一个类型,每个id对应一种类型:local RoleCfg = { man = { [1] = { id = 1, name = "习武者", type = 1, desc = "物理近战",}, [2] = { id = 2, name = "善远攻者", type = 2, desc = "物理远程",}, [3] = { id = 3, name = "法师", type = 3, desc = "法术远程",}, }, moster = { [1] = { id = 1, name = "习武者", type = 1, desc = "物理近战",}, [2] = { id = 2, name = "善远攻者", type = 2, desc = "物理远程",}, },}return RoleCfg属性配置:local AttrCfg = { level = { -- 等级-level 攻击力-atk 防御-def 血量-hp 蓝量-mp 移速-speed 攻击范围-atk_range 能量-enger [1] = { [2] = 10.0, [3] = 5.0, [4] = 100.0, [5] = 100.0, [6] = 50.0, [7] = 100.0, [8] = 0.0,}, [2] = { [2] = 20.0, [3] = 15.0, [4] = 200.0, [5] = 200.0, [6] = 70.0, [7] = 100.0, [8] = 0.0,}, [3] = { [2] = 30.0, [3] = 15.0, [4] = 300.0, [5] = 300.0, [6] = 80.0, [7] = 100.0, [8] = 0.0,}, [4] = { [2] = 40.0, [3] = 20.0, [4] = 400.0, [5] = 400.0, [6] = 90.0, [7] = 100.0, [8] = 0.0,}, [5] = { [2] = 50.0, [3] = 25.0, [4] = 500.0, [5] = 500.0, [6] = 100.0, [7] = 100.0, [8] = 0.0,}, [6] = { [2] = 60.0, [3] = 30.0, [4] = 600.0, [5] = 600.0, [6] = 110.0, [7] = 100.0, [8] = 0.0,}, [7] = { [2] = 70.0, [3] = 35.0, [4] = 700.0, [5] = 700.0, [6] = 120.0, [7] = 100.0, [8] = 0.0,}, [8] = { [2] = 80.0, [3] = 40.0, [4] = 800.0, [5] = 800.0, [6] = 130.0, [7] = 100.0, [8] = 0.0,}, [9] = { [2] = 90.0, [3] = 45.0, [4] = 900.0, [5] = 900.0, [6] = 140.0, [7] = 100.0, [8] = 0.0,}, [10] = { [2] = 100.0, [3] = 50.0, [4] = 1000.0, [5] = 1000.0, [6] = 150.0, [7] = 100.0, [8] = 200.0,}, }, role_type = { -- 类型 攻击力加成 防御加成 血量加成 蓝量加成 移速加成 攻击范围加成 能量速率加成 描述 [1] = { [2] = 2.0, [3] = 1.0, [4] = 5.0, [5] = 0.3, [6] = 0.2, [7] = 0.1, [8] = 0.0,}, [2] = { [2] = 4.0, [3] = 0.0, [4] = 3.0, [5] = 0.3, [6] = 0.2, [7] = 3.0, [8] = 0.0,}, [3] = { [2] = 6.0, [3] = 0.0, [4] = 2.0, [5] = 3.0, [6] = 0.0, [7] = 3.0, [8] = 0.0,}, [4] = { [2] = 4.0, [3] = 1.0, [4] = 4.0, [5] = 2.0, [6] = 0.3, [7] = 0.3, [8] = 0.0,}, },}return AttrCfgtypeManger类:根据id及等级计算对象属性,返回一个属性列表用于刷新对象属性:function ObjTypeManger.GetAttrListById(id, level) local attr_list = {} local role_type = RoleCfg.man[id].type level = level or 1 local level_attr_list = AttrCfg.level[level] local add_attr_list = AttrCfg.role_type[role_type] --添加附属属性 attr_list = level_attr_list for k,v in pairs(attr_list) do if add_attr_list[k] then v = v + v * add_attr_list[k] end end return attr_listend
阅读全文