类型对象模式,基于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
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 空乘视力不合格怎么办 当兵蹲不下去怎么办 睾丸越来越大怎么办呢 房东不让养宠物怎么办 房东不退房租怎么办 被同学举报了怎么办 招行申报退回怎么办 有偏头痛当兵了怎么办 顺丰怎么办退件 柴油车年检尾气不合格怎么办 移动进黑名单了怎么办 快递到了取不了怎么办 qq邮箱撤回失败怎么办 当兵初检不合格怎么办 当兵初检不过怎么办 商品退回去了怎么办 快递无人收退回怎么办 苹果app待处理怎么办 app购买待处理怎么办 大学没工作档案怎么办 吃米氮平导致月经推迟怎么办 被火钳烫到了怎么办 屁股上有伤疤怎么办 电工证年审色弱怎么办 九岁近视400度怎么办 儿童眼睛视力4.6怎么办 钢筋焊接复检不合格怎么办 上环一周同房了怎么办 狗咬起了疙瘩怎么办 晚上开车视力不好怎么办 眼睛一下模糊了怎么办 征兵体检待复查怎么办 眼睛度数600度怎么办 眼睛度数高了怎么办 尿潜血弱阳性怎么办 单眼开车有障碍怎么办 肾结石有一公分怎么办 3厘米的结石怎么办 右肾结石4mm怎么办 孕妇右肾结石痛怎么办 肾小结石疼痛怎么办