注册 登录
主题 : 求助,使用cocos2dx 实现客户端帧同步遇到了问题!
级别: 侠客
UID: 280237
精华: 0
发帖: 82
可可豆: 397 CB
威望: 397 点
在线时间: 90(时)
注册时间: 2013-12-09
最后登录: 2016-11-10
楼主 : 发表于: 2016-01-01 00:52    发自: Web Page
来源于 程序开发 分类

求助,使用cocos2dx 实现客户端帧同步遇到了问题!   

目前在做一款demo,逻辑在客户端,服务端负责用户的操作转发,游戏的逻辑循环通过心跳包来控制。
然后,有些逻辑(攻击等)的触发 绑定到了
 1.spine动画的关键帧
2.animate帧动画 
3.action动作上。


我想知道:上面这3个事件绑定都是根据update来触发的吗?  update能不能控制他的触发? 
action应该是固定时间触发, 无视 update调用次数, 那么spine和animate动画呢?


spine和animation类似 都是创建一个事件帧,那么这个事件帧到底是根据什么来触发的呢?
我在第10帧的时候创建了一个事件,  他会不会自动转化为时间单位?  还是用帧数单位来触发呢? 


真心求助。
我测试的时候把其它的事件都屏蔽了, 没有随机数存在, 但是实际测试的时候 有小概率会出现不同步的情况。
所有问题都排除了, 只剩下 事件的触发这个点了, !

级别: 侠客
UID: 280237
精华: 0
发帖: 82
可可豆: 397 CB
威望: 397 点
在线时间: 90(时)
注册时间: 2013-12-09
最后登录: 2016-11-10
沙发 : 发表于: 2016-01-01 00:56    发自: Web Page
补充一点, 如果action是基于时间的, 如何改成基于游戏帧?
比如 一个action是 10秒移动100像素, 改为让他执行 每秒10帧的动作。
(PS. 随便举例的. 只是移动我可以自己写.. 但是action里面的效果有些多...我想直接用)
级别: 侠客
UID: 280237
精华: 0
发帖: 82
可可豆: 397 CB
威望: 397 点
在线时间: 90(时)
注册时间: 2013-12-09
最后登录: 2016-11-10
板凳 : 发表于: 2016-01-01 11:43    发自: Web Page
顶顶顶顶顶顶顶顶顶顶顶顶
级别: 骑士
UID: 15014
精华: 0
发帖: 235
可可豆: 1693 CB
威望: 1693 点
在线时间: 270(时)
注册时间: 2010-03-08
最后登录: 2016-11-16
3 楼:  发表于: 2016-01-04 10:36    发自: Web Page
action独立于update,你这样的需求还是自己写代码处理动画吧
级别: 新手上路
UID: 202164
精华: 0
发帖: 20
可可豆: 56 CB
威望: 56 点
在线时间: 146(时)
注册时间: 2013-01-10
最后登录: 2017-01-03
4 楼:  发表于: 2016-01-29 00:02    发自: Web Page
回 楼主(luosixiang) 的帖子
"spine和animation类似 都是创建一个事件帧,那么这个事件帧到底是根据什么来触发的呢"

spine动画的回调原理和action的原理是一样的

假设在spine动画中,设定了第十帧触发,那么转换为时间单位的话是0.33333秒(10 / 30   spine的动画是运行在30帧的环境下)会被触发

同理,action的原理,也是通过判断当前累加起来的dt是否大于等于给出的时间,来做相应的处理

update中dt的值不是固定不变的,在60帧的环境下,有可能是0.01666666,0.017,0.0166668等
[ 此帖被ucchen在2016-01-29 00:11重新编辑 ]

级别: 新手上路
UID: 211204
精华: 0
发帖: 43
可可豆: 169 CB
威望: 169 点
在线时间: 181(时)
注册时间: 2013-03-03
最后登录: 2017-01-16
5 楼:  发表于: 2016-07-09 12:14    发自: Web Page
回 楼主(luosixiang) 的帖子
你的问题解决了吗,其实非常简单,你只需要将Director中的void Director::calculateDeltaTime() 和 void Director::calculateMPF() 中给_deltaTime和_secondsPerFrame赋值为固定值即可!比如1/30.0,希望能帮到你!
级别: 侠客

状态: 未签到 - [351天]
UID: 449179
精华: 0
发帖: 50
可可豆: 1842 CB
威望: 1137 点
在线时间: 447(时)
注册时间: 2015-03-14
最后登录: 2017-01-16
6 楼:  发表于: 2016-07-11 12:12    发自: Web Page
建议用时间和距离来控制,帧会受终端的影响,非常容易出现 不准确的情况。
噢噢噢噢噢噢噢噢哦哦哦
级别: 新手上路
UID: 440910
精华: 0
发帖: 11
可可豆: 20 CB
威望: 20 点
在线时间: 71(时)
注册时间: 2015-02-15
最后登录: 2016-12-29
7 楼:  发表于: 2016-12-28 09:13    发自: Web Page
使用源码 编译,在diretor类的
void Director::drawScene()
{
    // calculate "global" dt
    calculateDeltaTime();
    
    if (_openGLView)
    {
        _openGLView->pollEvents();
    }

    //tick before glClear: issue #533
    if (! _paused)
    {
        _eventDispatcher->dispatchEvent(_eventBeforeUpdate);
        _scheduler->update(_deltaTime);
        _eventDispatcher->dispatchEvent(_eventAfterUpdate);
    }

把update 设为固定值,游戏就按照帧计算时间了,跟实际时间就不一样了
描述
快速回复

关注本帖(如果有新回复会站内信通知您)

验证问题:
苹果公司现任CEO是谁?2字 正确答案:库克

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部