为了账号安全,请及时绑定邮箱和手机立即绑定

急求!!!!用h5的canvas做游戏用到了requestAnimationFrame来刷新画面,然后我在考虑角色移动是用上面的函数呢各位有什么建议?

急求!!!!用h5的canvas做游戏用到了requestAnimationFrame来刷新画面,然后我在考虑角色移动是用上面的函数呢各位有什么建议?

慕丝7291255 2019-10-25 20:22:12
用h5的canvas做游戏用到了requestAnimationFrame来刷新画面,然后我在考虑角色移动是用上面的函数呢还是用settimeout回调呢?问题卡点是在角色移动速度必须是固定的,例如1秒移动64px,还必须是平滑移动
查看完整描述

2 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

在requestAnimationFrame的回调里获取实时时间,并通过时间差计算来确定某一事件的执行时机。
letlastFrameMoment=Date.now();
lettotalDurations=0;
constanimationRequiredDuration=123456;//随便写的,具体值需要按所需频率进行计算
constframeHandler=()=>{
window.requestAnimationFrame(function(){
constthisMoment=Date.now();
totalDurations+=thisMoment-lastFrameMoment;
lastFrameMoment=thisMoment;
if(totalDurations>=animationRequiredDuration){
//在这里执行画布重绘函数
totalDurations=0;//重置,进入下一个帧的计时
}
frameHandler();//递归调用
});
}
这样的好处是这个时间差可以用于任何需要固定频率的任务,比如游戏里不止有一种角色的时候,如果封装得当,每个角色只要注册自己的频率和开始时间,将这些参数push到一个任务队列里,动画里就可以自动计算每个任务需要在哪些帧执行,并且将同一帧的所有任务合并计算,减少重绘画布的次数以优化性能,而不是给每个角色都弄一个定时器,毕竟使用了定时器之后,requestAnimationFrame其实就没多大意义了。
                            
查看完整回答
反对 回复 2019-10-25
?
慕斯709654

TA贡献1840条经验 获得超5个赞

game-loop了解一下.
你这个问题实际上就frame-based与time-based的选择.
基于帧实现简单,但不同设备运行的频率可能不一致,会产生影响游戏功能的问题.以打地鼠为例.假设地鼠的生命周期是10帧,性能差的设备更新一帧花的时间比性能强的设备长,那地鼠的实际存活时间就长--换句话说,用旧设备的玩家将占优势.
基于时间相对复杂,将游戏更新与画面更新拆开,但既然拆开,就存在同步的问题.忘了是哪款游戏,里面有个激光照射枪,产生的伤害是按时间算的,照射越长,伤害越高.有人发现,如果照射怪物时,暂停游戏,等一段时间,再开始,怪物会瞬间死亡,这实际上就是画面停止时,游戏更新没有暂停导致的.
所以,用哪种,看项目复杂度了.简单搞搞,那就基于帧,简单粗暴.产品比较事儿,那就基于时间,梳理清楚时间线.画画原型.
                            
查看完整回答
反对 回复 2019-10-25
  • 2 回答
  • 0 关注
  • 495 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信