KBEngine官方论坛

 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-12 22:26:24 | 显示全部楼层
FirstOne 发表于 2015-4-12 21:01
改动技能这块后出现这个错误,没有说明是什么错误:
  INFO root [0x00001b08] [2015-04-12 20:58:21,324]  ...

原来类名和文件名需一样
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-13 09:28:09 | 显示全部楼层
FirstOne 发表于 2015-4-12 21:01
改动技能这块后出现这个错误,没有说明是什么错误:
  INFO root [0x00001b08] [2015-04-12 20:58:21,324]  ...

你可以改, 例如:
from skills.NormalAttack import NormalAttack11111

NormalAttack.py
  class NormalAttack11111:
        ...
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-13 12:25:58 | 显示全部楼层
kbe 发表于 2015-4-12 20:38
1:GameObject已经实现了OnTimer并可以根据一张表timermap来分发到不同的计时器回调上, 如果是按照demo ...

还是关于定时器的问题,  _timermap还是满足不了需求, 因为当玩家请求释放一个技能时,对应该技能会有多个定时器, 而addTimer(1,1,arg) 只有一个arg参数,无法区分同一个技能多个定时器。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-13 12:36:34 | 显示全部楼层
FirstOne 发表于 2015-4-13 12:25
还是关于定时器的问题,  _timermap还是满足不了需求, 因为当玩家请求释放一个技能时,对应该技能会有多 ...

这些需要你自己去扩展,方法很多:
1:你可以在int数上做区分 100001001, 100001是技能ID, 001是执行的状态。
2:你自己封装一个timermgr作为实体的属性, 自己产生intID与该timer附带的数据绑定

3: 其实只需要一个timer足够, 当有需要维护的技能时, timer激活, 每x秒检查一次列表中所有飞行技能的状态以及是否到达,到达则作用并从列表删除。 没有可维护的技能时timer自动关闭
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-13 13:49:08 | 显示全部楼层
kbe 发表于 2015-4-13 12:36
这些需要你自己去扩展,方法很多:
1:你可以在int数上做区分 100001001, 100001是技能ID, 001是执行的 ...

以第一种方法的话, 所有技能可能的定时器要作为key写入_timermap字典中,显得timermap有点臃肿,和耦合性太强。 假如有20个技能, 每个技能要2个定时器,那么 timermap至少要40个项。  因为_timermap是类变量,也不能动态扩展吧。

我目前使用的是第三种方法:) 再看看第二种方法吧。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-13 13:55:13 | 显示全部楼层
FirstOne 发表于 2015-4-13 13:49
以第一种方法的话, 所有技能可能的定时器要作为key写入_timermap字典中,显得timermap有点臃肿,和耦合 ...

一般我们都使用第三种, 比较省资源,而且效果是一样的。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-13 13:57:12 | 显示全部楼层
服务端有没有玩家状态请求的回调函数,
比如玩家按下W键是向前走, 但是有可能他现在正在释放魔法,如果走动了的话, 服务端就要停止释放魔法,或者禁止玩家走动请求。
api中def onMove( self, controllerID, userData ):是移动成功后的回调,有没有 移动前的回调呢。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-13 14:32:23 | 显示全部楼层
FirstOne 发表于 2015-4-13 13:57
服务端有没有玩家状态请求的回调函数,
比如玩家按下W键是向前走, 但是有可能他现在正在释放魔法,如果走 ...

topSpeed, topSpeedY 设置为0就不能走了
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-14 17:26:49 | 显示全部楼层
本帖最后由 FirstOne 于 2015-4-14 17:31 编辑
kbe 发表于 2015-4-13 14:32
topSpeed, topSpeedY 设置为0就不能走了


那如果 比如一个玩家正在施法前摇中, 这是玩家按了W向前走, 服务端怎么获取玩家走动请求,并进行处理呢。是在OnMove中回调的话那么此时人物已经移动了吧
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-14 21:08:33 | 显示全部楼层
FirstOne 发表于 2015-4-14 17:26
那如果 比如一个玩家正在施法前摇中, 这是玩家按了W向前走, 服务端怎么获取玩家走动请求,并进行处理呢 ...

客户端请求打断,同时施法合适的位置比较一下当前坐标与记录的施法前坐标
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-17 11:05:44 | 显示全部楼层
现在开始 完善玩家动作管理和状态管理, 实现简单的状态控制,例如 技能会被行走打断,行走也会被技能打断, 被攻击时无法释放技能等等。  

这个我用状态机实现好吗, 还有
  1. self.cancelController("Movement")
复制代码
这个控制器怎么理解呢
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-17 13:46:13 | 显示全部楼层
FirstOne 发表于 2015-4-17 11:05
现在开始 完善玩家动作管理和状态管理, 实现简单的状态控制,例如 技能会被行走打断,行走也会被技能打断 ...

因为实体移动的方式同一时刻只有唯一的一个控制器,因此可以使用一个固定的名称来关闭实体的移动控制器。
这样就不需要记录下控制器的ID来关闭控制器了。

可以用状态机
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-19 23:56:11 | 显示全部楼层
kbe 发表于 2015-4-17 13:46
因为实体移动的方式同一时刻只有唯一的一个控制器,因此可以使用一个固定的名称来关闭实体的移动控制器。 ...

self.cancelController("Movement") 是停止移动  跟topSpeed = 0.0 有什么区别呢,  onMoveOver还会被调用吗
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-20 10:35:00 | 显示全部楼层
FirstOne 发表于 2015-4-19 23:56
self.cancelController("Movement") 是停止移动  跟topSpeed = 0.0 有什么区别呢,  onMoveOver还会被调 ...

cancelController是停止服务端上的移动控制器(通常是怪NPC等移动),停止了控制器则导致服务端上移动停止,topSpeed只是一个移动限制(目前仅用于对客户端输入的检查)。
KBE中名称叫cancel
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-20 12:11:23 | 显示全部楼层
kbe 发表于 2015-4-20 10:35
cancelController是停止服务端上的移动控制器(通常是怪NPC等移动),停止了控制器则导致服务端上移动停止 ...

明白了,客户端是不用控制器, 主要根据网络tick发来的position值判断是否在移动吧。

warring中
  1.         def stopMotion(self):
  2.                 """
  3.                 停止移动
  4.                 """
  5.                 if self.isMoving:
  6.                         #INFO_MSG("%i stop motion." % self.id)
  7.                         self.cancelController("Movement")
  8.                         self.isMoving = False
复制代码


应该没作用吧 用的是cancelController
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-20 13:25:33 | 显示全部楼层
FirstOne 发表于 2015-4-20 12:11
明白了,客户端是不用控制器, 主要根据网络tick发来的position值判断是否在移动吧。

warring中

确实是cancelController,是我弄错了
是的,客户端只是同步tick位置到服务端
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-20 22:12:15 | 显示全部楼层
kbe 发表于 2015-4-20 13:25
确实是cancelController,是我弄错了
是的,客户端只是同步tick位置到服务端
...

我在函数中有实现
  1. def onMove( self, controllerID, userData ):
复制代码

但是 当我控制人物移动时该函数并没有被调用 是不是只有相关的Entity.moveToPoint与Entity.moveToEntity还有Entity.navigate方法被调用并且成功时才会回调此函数。

如果我想监控玩家移动,当玩家一移动我就能知道该用什么方法呢, 不太想让客户端发消息(不想信任客户端)



回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-20 22:34:25 | 显示全部楼层
self.topSpeed = 0.0后 好像人物就没有速度限制了,不会被拉回来。那么怎么限制人物速度为0 就是不能控制了。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-20 22:35:34 | 显示全部楼层
FirstOne 发表于 2015-4-20 22:12
我在函数中有实现
但是 当我控制人物移动时该函数并没有被调用 是不是只有相关的Entity.moveToPoint与Ent ...


对。监控玩家移动可以记录最后一tick的坐标,当前tick与之比较即可。通常一tick是0.1秒。配置决定
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-21 10:53:33 | 显示全部楼层
kbe 发表于 2015-4-20 22:35
对。监控玩家移动可以记录最后一tick的坐标,当前tick与之比较即可。通常一tick是0.1秒。配置决定 ...

这个是在C++里实现吗,

另外客户端同步坐标等信息时为什么是给baseapp发数据而不是cellapp呢
  1. _entityLastLocalPos = position;
  2.                                 _entityLastLocalDir = direction;
  3.                                
  4.                                 Bundle bundle = new Bundle();
  5.                                 bundle.newMessage(Message.messages["Baseapp_onUpdateDataFromClient"]);
  6.                                 bundle.writeFloat(position.x);
  7.                                 bundle.writeFloat(position.y);
  8.                                 bundle.writeFloat(position.z);

  9.                                 bundle.writeFloat((float)((double)direction.z / 360 * 6.283185307179586));
  10.                                 bundle.writeFloat((float)((double)direction.y / 360 * 6.283185307179586));
  11.                                 bundle.writeFloat((float)((double)direction.x / 360 * 6.283185307179586));
  12.                                 bundle.writeUint8((Byte)(playerEntity.isOnGound == true ? 1 : 0));
  13.                                 bundle.writeUint32(spaceID);
  14.                                 bundle.send(_networkInterface);
复制代码
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|KBEngine Forum

GMT+8, 2018-12-15 07:24 , Processed in 0.037760 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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