我正在开发一款仅为其用户界面使用Angular的游戏。游戏代码有一个每秒运行一次的循环。为了保持UI同步,我直接从Angular外部调用$ digest。
//from angular code
angular
.module('app')
.factory('acp', acp);
acp.$inject = ['$rootScope', '$window'];
function acp($rootScope, $window){
var service = $window.ACP = {
heartBeat: heartBeat,
rootScope: $rootScope
};
return service;
function heartBeat(){
$rootScope.$$phase || $rootScope.$digest();
}
}
//from game code
setInterval(function(){
//do stuff within game
updateResources();
window.ACP.heartBeat();
}.bind(this), 1000);
对于一个简单的前端游戏,这是允许的吗?你能为我的角度ui和游戏代码之间的通信建议一个更好的方法吗?我有另一个全局变量,它保持我的游戏状态,Angular和游戏代码直接从窗口对象消耗,因为我非常喜欢对象引用的方便性和直接性。我理解使用全局变量的坏juju但我觉得一旦你进入游戏区域,线条会变得有点模糊。任何意见,将不胜感激。
答案 0 :(得分:0)
您不必使用setTimeout。 Angular提供了一个包装器$timeout
,它将负责运行摘要周期,这意味着您不必手动执行。
至于你的游戏代码和角度ui之间的沟通,这里有一些建议
- 您可以使用
factories
或services
来存储游戏状态(而不是使用任何全局变量)- 您也可以使用
websockets
所以不是每隔1秒拨打一次电话,而是与后端api(或游戏代码)建立套接字连接,并且他们互相交谈,而无需额外调用您的额外费用api每1秒。您可以从socket.io
开始完成此操作- 您也可以使用
$rootScope
存储该值,但将此作为最后一个选项注意:您正在使用setTimeout。要以一定间隔触发某些内容,请使用
$interval
。但是,分析上面的选项,找出最适合你的选项。