KBEngine官方论坛

 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 配置 开服
楼主: FirstOne

对warring示例中 U3d技术探讨汇总

[复制链接]

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-3-29 19:28:07 | 显示全部楼层
kbe 发表于 2015-3-29 18:49
S = Skill,技能
C = Cast object,技能投放对象

关于技能我还有点疑惑, 在skills包里 init文件里 一开始初始化了_g_skills全局字典,  
from KBEDebug import *
import d_skills

from skills.SkillAttack import SkillAttack

_g_skills = {}

def onInit():
        """
        init skills.
        """
        for key, datas in d_skills.datas.items():
                script = datas['script']
                scriptinst = eval(script)()
                _g_skills[key] = scriptinst
                scriptinst.loadFromDict(datas)
               
def getSkill(skillID):
        return _g_skills.get(skillID)

这个字典应该是这个cellapp全局的,那么所有玩家都共享, 也就是同一个技能所有玩家共享一个对象, 但是每个玩家的技能都应该记录一些自己的信息吧, 例如 技能等级 , 技能经验。 是不是应该为每个玩家的技能都实例化一个对象呢。
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-3-29 19:44:30 | 显示全部楼层
恩,延时技能demo中好像没实现 caster.addCastSkill(self, scObject, delay)这个函数spell没实现, 龙的那个技能应该属于这种延时技能, 在demo中跟普通技能处理是一样的,只是在客户端做了不同表现,所以客户端看见的是龙一施法玩家就掉血,但此时技能还没打到身上。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-3-30 09:28:48 | 显示全部楼层
FirstOne 发表于 2015-3-29 19:28
关于技能我还有点疑惑, 在skills包里 init文件里 一开始初始化了_g_skills全局字典,  
from KBEDebug i ...

通常技能只是一个固定的流水线,少数技能是需要动态扩展的(例如:玩家技能)。
对于普通的技能, 例如:怪的攻击,一次掉5点血,这个技能所有实体都可以共用一份实例(Monster可用,Avatar也可用,只是对entity.HP做加减操作),一些简单的手游中玩家的技能甚至都可以是全局实例。

如果需要扩展,可以分为静态全局实例和动态实例,动态实例针对于个体存储一些信息。
demo没有做这样的划分。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-3-30 09:28:50 | 显示全部楼层
FirstOne 发表于 2015-3-29 19:28
关于技能我还有点疑惑, 在skills包里 init文件里 一开始初始化了_g_skills全局字典,  
from KBEDebug i ...

通常技能只是一个固定的流水线,少数技能是需要动态扩展的(例如:玩家技能)。
对于普通的技能, 例如:怪的攻击,一次掉5点血,这个技能所有实体都可以共用一份实例(Monster可用,Avatar也可用,只是对entity.HP做加减操作),一些简单的手游中玩家的技能甚至都可以是全局实例。

如果需要扩展,可以分为静态全局实例和动态实例,动态实例针对于个体存储一些信息。
demo没有做这样的划分。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-3-30 09:29:48 | 显示全部楼层
FirstOne 发表于 2015-3-29 19:44
恩,延时技能demo中好像没实现 caster.addCastSkill(self, scObject, delay)这个函数spell没实现, 龙的那 ...

是的, 并没有实现。
可以在spell中维护一份列表,用一个timer-tick来检查
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-3-30 14:33:34 | 显示全部楼层
kbe 发表于 2015-3-30 09:28
通常技能只是一个固定的流水线,少数技能是需要动态扩展的(例如:玩家技能)。
对于普通的技能, 例如: ...

cell app里面脚本执行是单线程的吗, 或者是线程安全的,  skill全局实例可以通过传入玩家具体参数来达到处理技能等级和技能经验信息, 但前提是执行这些类的线程是单线程的。不知这样设计是否合理。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-3-30 18:03:50 | 显示全部楼层
FirstOne 发表于 2015-3-30 14:33
cell app里面脚本执行是单线程的吗, 或者是线程安全的,  skill全局实例可以通过传入玩家具体参数来达到 ...

cellapp逻辑是单线程的。

技能的级别可以是静态数据,一个技能策划可以拉表产生100级(100个技能),伤害等都是静态拉出来,调用技能的时候使用不同级别的技能ID得到不同的实例就行了。

除非是这种方式还满足不了, 你需要动态扩展的技能, 那么一个技能可以封装成类似一个物品, 物品也有自己的数据,并且可以从数据库load。

热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-3-31 00:02:16 | 显示全部楼层
kbe 发表于 2015-3-30 18:03
cellapp逻辑是单线程的。

技能的级别可以是静态数据,一个技能策划可以拉表产生100级(100个技能),伤 ...

最近正在思考怎么设计物品系统, 每一类物品都对应一种类,例如补给品类物品,传入用户实体, 那么use函数可以定义为:
def use( avator) :
     avator.addHP(self.addHP)
     avator.addMP(self.addMP)

这样的话, 这个物品类还是全局的一个实例, 所有玩家都共享这个对象, 只是传入的avator实体参数不一样。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-3-31 09:29:36 | 显示全部楼层
FirstOne 发表于 2015-3-31 00:02
最近正在思考怎么设计物品系统, 每一类物品都对应一种类,例如补给品类物品,传入用户实体, 那么use函 ...

可以设计一个基础类itembase.py, itembase中实现序列化与归原,用于存储和加载。
从itembase中扩展出不同类型的物品, 装备、补给类、。。。

物品是有数量的,通常我们在设计中,背包一格被称为一个item,这个item是同一类物品,使用一次扣除N个。
因为每个人背包中的状态不一样因此他们的实例会很多, 如果做成全局类,你仍然会找一个地方存放变量(可能也会放到背包格子中)。

而技能大多是没有积累性变量的,所以普通技能使用了全局实例。

这是demo的做法,不过还未完成。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-9 17:01:22 | 显示全部楼层
AOE技能 要记录技能范围内的所有实体,可以判断AOI内所有的实体的距离, 还有没有更好的方法呢。

还有非指向技能, 在中途中碰到怪才算伤害,这个一般怎么实现呢。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-9 18:13:29 | 显示全部楼层
FirstOne 发表于 2015-4-9 17:01
AOE技能 要记录技能范围内的所有实体,可以判断AOI内所有的实体的距离, 还有没有更好的方法呢。

还有非指 ...

范围内实体搜索, entity.entitiesInRange, 参考API

要做弹道碰撞,估计得创建实体挂trap来碰撞了,可以提前生成一些子弹类实体放到池子里。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-9 20:28:08 | 显示全部楼层
entity.entitiesInRange没有弧度参数吗,例如武器挥舞时, 在挥舞弧度内的怪收到伤害,而其他的则不收到伤害。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-9 21:10:24 | 显示全部楼层
FirstOne 发表于 2015-4-9 20:28
entity.entitiesInRange没有弧度参数吗,例如武器挥舞时, 在挥舞弧度内的怪收到伤害,而其他的则不收到伤 ...

弧度你可以自己二次过滤,底层提供是基础的
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-10 14:11:24 | 显示全部楼层
kbe 发表于 2015-4-9 21:10
弧度你可以自己二次过滤,底层提供是基础的

最近对技能释放的一些细节问题困扰,  主要是一些动作的表现, 例如玩家对敌人释放技能后,服务器返回可以释放,那么玩家就要播放动作,但是当收到攻击时,又要播放受击动画, 那么有可能技能释放了,但没播放动画。

不知这问题怎么处理。

下面是技能释放时序图。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-10 15:31:10 | 显示全部楼层
FirstOne 发表于 2015-4-10 14:11
最近对技能释放的一些细节问题困扰,  主要是一些动作的表现, 例如玩家对敌人释放技能后,服务器返回可 ...

假设是一个远程法术技能,AOE,施法对象是一个石头,受术者是石头10米范围内所有的玩家。

施放技能的流程是,  检查施法者状态-》检查施法目标状态(是否是石头)-》吟唱法术记时同时广播通知客户端表现-》吟唱完毕法术”火球“开始投放出去,开启记时同时广播通知客户端火球飞行表现-》法术”火球“到达目标的飞行时间足够,开始让施法目标与法术产生作用-》检查施法目标状态(石头此时是否还允许被法术作用)-》根据技能的条件(受术者是玩家10米范围)参考施法目标获得可受术者的列表-》对所有受术者产生效果,同时广播客户端受击效果表现-》技能施法完毕。

要实现这样一个技能还需要很多地方的完善,就目前demo的技能完成度以及你上面的图是达不到这个效果的。

注意:流程中有几处需要向客户端同步表现的地方,也有几处记时处理操作。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-11 00:02:52 | 显示全部楼层
明白了,  像子弹这种非指向技能还需要生成一个实体并主持trap吧
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-11 09:28:06 | 显示全部楼层
FirstOne 发表于 2015-4-11 00:02
明白了,  像子弹这种非指向技能还需要生成一个实体并主持trap吧

有严格的弹道碰撞需要生成实体, 但大多数游戏没有这种碰撞, 其实选定目标后计算距离飞行时间然后等时间到达检查一下合法距离就直接作用了, 客户端火球也是直接飞过去做击中表现的,只是一种取舍表现。

你可以随便找几款游戏, 在人扎堆的时候找一个人放一个远程技能, 这个技能特效中途碰到人并不会造成击中,而是直接穿越飞向选取的目标。

严格的碰撞服务器需要的资源会大一些
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-12 00:54:30 | 显示全部楼层
kbe 发表于 2015-4-10 15:31
假设是一个远程法术技能,AOE,施法对象是一个石头,受术者是石头10米范围内所有的玩家。

施放技能的流 ...

关于设计技能施法前摇定时器的问题:

   cell的avator 应该要维护一个技能释放前摇的定时器列表,如果avator继承skillManager, 在skillManger中再定义一个OnTimer会不会与GameObject中的OnTimer冲突,或者是覆盖。GameObject中的OnTimer中传入的参数是一个定值,不太灵活。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-12 20:38:17 | 显示全部楼层
FirstOne 发表于 2015-4-12 00:54
关于设计技能施法前摇定时器的问题:

   cell的avator 应该要维护一个技能释放前摇的定时器列表,如果av ...

1:GameObject已经实现了OnTimer并可以根据一张表timermap来分发到不同的计时器回调上, 如果是按照demo的来, 你不需要在写OnTimer, 参考demo中注册定时器回调的做法,在模块最下方Avatar.timermap=xxx。

2: 你也可以按照你的方法做, python有一个叫super的方法你可以研究一下。 不用super也行, 可以参考Avatar.__init__中如何将调用分发给他的基础类。

3: 由于实体会迁移,简单的数据结构更安全有效,如果直接注册一个回调进去迁移到其他进程后还需要重新找到实体的回调函数,另外由于python的特性不小心就容易造成对象的引用不释放。

热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-12 21:01:53 | 显示全部楼层
改动技能这块后出现这个错误,没有说明是什么错误:
  INFO root [0x00001b08] [2015-04-12 20:58:21,324] - Script::install(): KBExtra is successfully!
S_ERR root [0x00001b08] [2015-04-12 20:58:21,386] - Traceback (most recent call last):
  File "D:/GitHub/zcg/kbengine/kbengine_demos/scripts/cell\kbengine.py", line 5, in <module>
    import skills
S_ERR root [0x00001b08] [2015-04-12 20:58:21,386] -   File "D:/GitHub/zcg/kbengine/kbengine_demos/scripts/cell\skills\__init__.py", line 8, in <module>
    from skills.NormalAttack import NormalAttack
S_ERR root [0x00001b08] [2015-04-12 20:58:21,386] - ImportError: cannot import name 'NormalAttack'
ERROR root [0x00001b08] [2015-04-12 20:58:21,402] - app::initialize() is error!
S_ERR root [0x00001b08] [2015-04-12 20:58:21,402] - AttributeError: cellAppData
DEBUG root [0x00001b08] [2015-04-12 20:58:21,480] - Script::uninstall_py_dlls(): PyInit_pyexpat
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|KBEngine Forum

GMT+8, 2018-12-15 08:32 , Processed in 0.036347 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表