KBEngine官方论坛

 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-21 11:25:36 | 显示全部楼层
FirstOne 发表于 2015-4-21 10:53
这个是在C++里实现吗,

另外客户端同步坐标等信息时为什么是给baseapp发数据而不是cellapp呢

在服务端脚本中实现, 例如:某个buff只能在不动的时候加血,一旦移动则失效并消失。
buff可以在附加上玩家时记录一下玩家当前坐标,每次作用时检查当前位置,一旦发现不匹配则失效消失。

客户端只能与baseapp建立连接,所有信息都通过baseapp,客户端无法看到cellapp。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-21 11:57:58 | 显示全部楼层
topSpeed = 0.0 好像是不会检查移动速度合法性的
  1. bool Entity::checkMoveForTopSpeed(const Position3D& position)
  2. {
  3.         Position3D movment = position - this->position();
  4.         bool move = true;
  5.        
  6.         // 检查移动
  7.         if(topSpeedY_ > 0.01f && movment.y > topSpeedY_ + 0.5f)
  8.         {
  9.                 move = false;
  10.         }

  11.         if(move && topSpeed_ > 0.01f)
  12.         {
  13.                 movment.y = 0.f;
  14.                
  15.                 if(movment.length() > topSpeed_ + 0.5f)
  16.                         move = false;
  17.         }

  18.         return move;
  19. }
复制代码
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-21 12:42:58 | 显示全部楼层
kbe 发表于 2015-4-21 11:25
在服务端脚本中实现, 例如:某个buff只能在不动的时候加血,一旦移动则失效并消失。
buff可以在附加上玩 ...

我扩展了下 cell 的entity类 添加了onPlayerMove回调。
在C++中实现
  1. void Entity::onUpdateDataFromClient(KBEngine::MemoryStream& s)
  2. {
  3. 。。。。。。。
  4.         if(checkMoveForTopSpeed(pos))
  5.         {
  6.                 this->position(pos);
  7. //通知py脚本玩家位置移动
  8.                 this->onPlayerMove();
  9.         }
  10. 。。。。
  11. }

  12. void Entity::onPlayerMove()
  13. {
  14.         SCOPED_PROFILE(SCRIPTCALL_PROFILE);

  15.         SCRIPT_OBJECT_CALL_ARGS0(this, const_cast<char*>("onPlayerMove"));
  16. }
复制代码
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-21 13:23:15 | 显示全部楼层
FirstOne 发表于 2015-4-21 12:42
我扩展了下 cell 的entity类 添加了onPlayerMove回调。
在C++中实现

也是一种办法
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-22 00:58:09 | 显示全部楼层
我开了两个客户端(warring), 两个客户端的位置没有同步, 就是一个客户端动了,但是另外一个客户端上同一个人没有动。    怪物时同步的。

entity.position属性的改变会及时同步所有客户端吗?
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-22 13:11:19 | 显示全部楼层
FirstOne 发表于 2015-4-22 00:58
我开了两个客户端(warring), 两个客户端的位置没有同步, 就是一个客户端动了,但是另外一个客户端上同 ...

你检查一下, 当一个客户端移动后,服务端上他的位置是否改变了。
另一个玩家需要能看得到该玩家,既双方都在AOI范围内。

如果上面条件达到就会同步到所有AOI范围内的玩家客户端。
如果服务端位置没有改变,那就需要看看客户端是否没有同步位置到服务端

参考:http://bbs.kbengine.org/forum.ph ... &extra=page%3D1
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-23 01:33:27 | 显示全部楼层
本帖最后由 FirstOne 于 2015-4-23 01:50 编辑
kbe 发表于 2015-4-22 13:11
你检查一下, 当一个客户端移动后,服务端上他的位置是否改变了。
另一个玩家需要能看得到该玩家,既双方 ...

当另外一个玩家进入AOI时 服务端会同时调用客户端的onAvatarEnterWorld 和 onEnterWorld 导致客户端重复加载出错(一个字典加了entity.id两次)。 应该只需要调用onAvatarEnterWorld就可以了吧
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-23 09:27:20 | 显示全部楼层
FirstOne 发表于 2015-4-23 01:33
当另外一个玩家进入AOI时 服务端会同时调用客户端的onAvatarEnterWorld 和 onEnterWorld 导致客户端重复加 ...

服务端只会调用onEnterWorld, onAvatarEnterWorld是客户端本地调用的


  1. Avatar.cs:

  2.                 public override void onEnterWorld()
  3.                 {
  4.                         base.onEnterWorld();

  5.                         if(isPlayer())
  6.                         {
  7.                                 Event.fireOut("onAvatarEnterWorld", new object[]{KBEngineApp.app.entity_uuid, id, this});                               
  8.                                 SkillBox.inst.pull();
  9.                         }
  10.                 }
复制代码
  1. world.cs:
  2.         public void onEnterWorld(KBEngine.Entity entity)
  3.         {
  4.                 if(entity.isPlayer())
  5.                         return;
  6.                  ...
  7.         }

  8.         public void onAvatarEnterWorld(UInt64 rndUUID, Int32 eid, KBEngine.Avatar avatar)
  9.         {
  10.                 if(!avatar.isPlayer())
  11.                 {
  12.                         return;
  13.                 }
  14.               ...
  15.            }
复制代码


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

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-23 10:22:56 | 显示全部楼层
本帖最后由 FirstOne 于 2015-4-23 10:26 编辑
kbe 发表于 2015-4-23 09:27
服务端只会调用onEnterWorld, onAvatarEnterWorld是客户端本地调用的

哦   在warring中 onAvatarEnterWorld是在__init__中调用的,avator.cs
  1. public override void __init__()
  2.                 {
  3.                         Event.fireOut("onAvatarEnterWorld", new object[]{KBEngineApp.app.entity_uuid, id, this});
  4.                         combat = new CombatImpl(this);
  5.                 }
复制代码

KBEngine.cs
  1. public void Client_onEntityEnterWorld(MemoryStream stream)
  2.                 {
  3. 。。。。。。。。。。
  4. entity.isOnGound = isOnGound > 0;
  5.                                 entity.__init__();
  6.                                 entity.enterWorld();
  7. 。。。。。。。。。。。
  8. }
复制代码

回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-23 11:14:12 | 显示全部楼层
FirstOne 发表于 2015-4-23 10:22
哦   在warring中 onAvatarEnterWorld是在__init__中调用的,avator.cs

KBEngine.cs

你更新就不在__init__了
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-25 22:59:30 | 显示全部楼层
3D MMO游戏中的y轴坐标都是单独处理的吗,  demo中好像是只算xz平面的坐标, y轴没有算。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-27 09:21:32 | 显示全部楼层
FirstOne 发表于 2015-4-25 22:59
3D MMO游戏中的y轴坐标都是单独处理的吗,  demo中好像是只算xz平面的坐标, y轴没有算。 ...

demo也是有Y轴表现的时候, 每个实体都有一个是否在地面状态, 如果在地面则客户端可以忽略Y轴强制贴地,因为Navmesh包含的是不精确的地表, 如果直接使用服务端Y那么实体可能与地表有一些上下偏移。当实体不在地面的时候客户端可以按照实体真实的Y轴表现, 既可以停留在空中。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-27 11:38:48 | 显示全部楼层
kbe 发表于 2015-4-27 09:21
demo也是有Y轴表现的时候, 每个实体都有一个是否在地面状态, 如果在地面则客户端可以忽略Y轴强制贴地, ...

服务端会根据是否在地面做额外处理吗? 我现在开2个客户端, 当一个玩家跳跃到一堆箱子上面时, 另外一个客户上显示的不是踩在箱子上而是踩在地面上(有跳跃动作, 跳跃期间y坐标是正确的,跳跃后就贴地面了), 玩家物体我都取消了BoxCollier 添加了CarecterContrrol,并调节了胶囊体, 我看log 在最后的updateposition 的desposition 的y是地面的y值, 不是实际y值。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-27 11:44:38 | 显示全部楼层
FirstOne 发表于 2015-4-27 11:38
服务端会根据是否在地面做额外处理吗? 我现在开2个客户端, 当一个玩家跳跃到一堆箱子上面时, 另外一个 ...

如果不在地面上客户端需要设置玩家的isOnGound = false, 当这个状态同步到服务端后, 服务端会转发同步到其他客户端。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-27 23:49:45 | 显示全部楼层
本帖最后由 FirstOne 于 2015-4-28 01:06 编辑
kbe 发表于 2015-4-27 11:44
如果不在地面上客户端需要设置玩家的isOnGound = false, 当这个状态同步到服务端后, 服务端会转发同步到 ...

遇到个头疼的问题, public void update_position(KBEngine.Entity entity) 这个函数 entity.position.y的值最终都会等于玩家的position.y值。导致其他玩家的位置的y值也就是高度 恒等于 玩家高度。  

比如说:  A 、B两个客户端,  A 的高度是5    B的高度是10 ,  那么在A机器上看到的是 A 、B的高度都是5   ,在B的机器上 A、B的高度都是10。

不知道这样说 说清楚了吗。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-28 10:47:44 | 显示全部楼层
FirstOne 发表于 2015-4-27 23:49
遇到个头疼的问题, public void update_position(KBEngine.Entity entity) 这个函数 entity.position.y的 ...

update_position为何最终Y都等于玩家的? 现在的做法是服务器下发的是其他实体相对于玩家的偏移值,客户端会计算出正确的最终值。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-28 11:16:16 | 显示全部楼层
kbe 发表于 2015-4-28 10:47
update_position为何最终Y都等于玩家的? 现在的做法是服务器下发的是其他实体相对于玩家的偏移值,客户 ...

从log中打印的信息 看是这样的,  表现上也是的。  
A 、B两个客户端,  B跳跃时,在A客户端中看 跳跃过程中是正常的position,当跳完后, update_position跟新的y坐标就跟A一样了。:(
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-28 11:40:52 | 显示全部楼层
FirstOne 发表于 2015-4-28 11:16
从log中打印的信息 看是这样的,  表现上也是的。  
A 、B两个客户端,  B跳跃时,在A客户端中看 跳跃过 ...

现在demo中的跳跃是假跳, 并没有用到Y轴。
跳之后只是向服务端调用了jump方法,jump转发到其他客户端, 其他客户端模拟的跳。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-4-28 12:37:37 | 显示全部楼层
kbe 发表于 2015-4-28 11:40
现在demo中的跳跃是假跳, 并没有用到Y轴。
跳之后只是向服务端调用了jump方法,jump转发到其他客户端,  ...


不仅是跳跃,所有的实体Y坐标都会跟玩家一样,
例如: 在Update中 我将所有实体Y坐标设置为 destPosition.y 那么:
A客户端中 只要玩家跳跃或者去了一个高地, 那么所有其他实体包括怪物的Y坐标都跟玩家一样高了。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-4-28 14:59:28 | 显示全部楼层
FirstOne 发表于 2015-4-28 12:37
不仅是跳跃,所有的实体Y坐标都会跟玩家一样,
例如: 在Update中 我将所有实体Y坐标设置为 destPositi ...

晚点我试试
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|KBEngine Forum

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

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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