cocos-js,时间相关的处理

前端之家收集整理的这篇文章主要介绍了cocos-js,时间相关的处理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1.原因


客户端在成功登陆后会从服务器收到一个登陆时间,然后开始让时间走起来,现在有两种走法:

1.单起一个全局定时器,每一次update后让秒数+1,但是这种走法在游戏切换到后台后,定时器被挂起,时间就停止了,当游戏再从后台切换到前台后,就会不准,还有当定时器加速或者减速的时候,时间也会不准
2.用服务器时间和本地时间对比,获取时间差,以后再需要用时间的时候,获取到本地时间+时间差,就是正确的服务器时间,这种走法会出现一种问题,就是有的玩家在登陆游戏后,主动修改本地时间,导致时间不准,和时间相关的数据出现混乱

2.选择


方法1会普遍遇到,因为每个人在玩游戏的时候,因为一个电话或者别的事情就会经常切换到后台,而方法2只有不正常玩游戏的玩家故意修改时间的时候才会遇到,而这种玩家也会经常使用游戏修改器之类的工具来修改客户端数据,应该从广义上属于一种作弊行为。

所以,我们会选择方法2

3.实现


1.时间初始化

  1. initTime:function(_server_time){
  2. this.server_login_time = _server_time
  3. this.server_login_time *= 1000
  4. this.cur_time = new Date().getTime()
  5. this.dis_time = this.cur_time - this.server_login_time
  6.  
  7. var loginDate = new Date(this.server_login_time)
  8.  
  9. this.server_login_day = loginDate.getDate()
  10. this.server_login_hour = loginDate.getHours()
  11. this.server_login_minute = loginDate.getMinutes()
  12. this.server_login_second = loginDate.getSeconds()
  13.  
  14. this.cur_day = this.server_login_day
  15. this.cur_hour = this.server_login_hour
  16. this.cur_minute = this.server_login_minute
  17. this.cur_second = this.server_login_second
  18.  
  19. }

2.获取当前时间

  1. getCurTime:function(){
  2. return new Date().getTime()-this.dis_time
  3. },getCurDay:function(){
  4. return new Date(this.getCurTime()).getDate()
  5. },getCurHour:function(){
  6. return new Date(this.getCurTime()).getHours()
  7. },getCurMinute:function(){
  8. return new Date(this.getCurTime()).getMinutes()
  9. },getCurSecond:function(){
  10. return new Date(this.getCurTime()).getSeconds()
  11. },getCurTimeByHMS:function(){
  12. return this.getCurHour() + ":" + this.getCurMinute() + ":" + this.getCurSecond()
  13. },

3.倒计时
游戏中经常会用到倒计时时间,例如体力恢复、技能点恢复等

  1. //_start_time:必须是服务器返回的时间错
  2. //_down_time:单位/秒
  3. getCutDownTimeByMS:function(_start_time,_down_time){
  4. var __time_dis = this.getCurTime()/1000 - _start_time
  5. if(__time_dis > _down_time)
  6. return 0
  7.  
  8. __time_dis = _down_time - __time_dis
  9. var __minute = parseInt(__time_dis/60)
  10. var __second = parseInt(__time_dis%60)
  11.  
  12. getFuncBit(__minute) > 1 ? (__minute = __minute):(__minute = "0"+__minute)
  13. getFuncBit(__second) > 1 ? (__second = __second):(__second = "0"+__second)
  14.  
  15. return __minute + ":" + __second
  16. return __down_date.getMinutes() + ":" + __down_date.getSeconds()
  17. },

4.思考


之前的两种方法,都不是十全十美,都会遇到各自的问题,有没有更好的方法呢?想来想去,还是在时间的校验上多做处理,就是在客户端和服务器的每条协议,服务器都向客户端发送当前时间,这样就能做到实时校验,避免时间错误导致的问题。但是,这样处理后,不知道服务器那边会不会出现问题?

猜你在找的Cocos2d-x相关文章