使用requestAnimationFrame作为Timer

时间:2014-08-18 10:10:48

标签: javascript asp.net signalr

这是我正在研究的多人游戏“猜单词”回合制游戏。

我有一个应该从给定数字倒计时的页面。如果在时间限制之前提交了单词猜测,则调用SignalR hub方法。如果达到0,则调用不同的SignalR集线器方法。在这两种情况下,hub方法都会将消息发送回所有相关客户端(在一个组中)。

有人推荐,而不是JS计时器,我可以使用requestAnimationFrame,它每17毫秒更新一次。

所以这是我在Play.aspx文件中的requestAnimationFrame代码......

function turnTimerOn() { //called by server code as a startup script

      var timerStep = '<%=Application(Session("GameID") & "_TimeLimit")%>';
      timerStep = Number(timerStep);

      var startT = Date.now();
      var timedifference = 0;
      var countdown = document.getElementById('SecondsLeft');
      requestAnimationFrame(function anim() {
               requestAnimationFrame(anim);
               startT = startT || Date.now();
               countdown.innerHTML = timerStep - ((Date.now() - startT) / 1000 | 0);
               timedifference = (Date.now() - startT) / 1000 | 0;

               if (timedifference >= timerStep) {

                      startT = Date.now();
                      timedifference = 0;

                      countdown.innerHTML = "";
                      TomatoHubProxy.invoke('NextPlayer', '<%=Session("username")%>', '<%=Session("GameID")%>');
                 } 
           });

     }

来自SignalR集线器的返回消息导致再次执行turnTimerOn(),这意味着再次为当前播放器开始倒计时。

倒计时似乎有效,但有一个错误,它达到3或4之类的低数字,然后重置计数或调用Hub方法(很难说出发生了什么)。当倒计时达到0时,它应该调用Hub方法(这样游戏就可以移动到下一个玩家)

我还应该提到Play.aspx页面永远不会重新加载。所有更新都自动发生(感谢SignalR)

请帮忙。

0 个答案:

没有答案