2016-07-20 13 views
0

私は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とゲームコードの両方がウィンドウオブジェクトからまっすぐに消費される、私のゲームの状態を保持する別のグローバル変数を持っています。私はグローバルを使用して悪いジュジュを理解していますが、私は一度ゲームの領域に入るように感じる、ラインが少しぼやけることができます。アドバイスをいただければ幸いです。

+0

$ windowをコントローラに挿入できますか?これは、グローバルウィンドウオブジェクトの周りにAngularラッパーオブジェクトを提供します。 – ThisClark

+0

ええ、私は$ windowについて知っています。私はこの例を更新しました。ありがとうございました。 – loubeasley

答えて

0

setTimeoutを使用する必要はありません。 Angularは、ダイジェストサイクルの実行に注意を払うラッパー$timeoutを提供します。つまり、手動で行う必要はありません。あなたのゲームのコードと角度UI間の通信用として

、ここでいくつかの勧告

  • あなたは、ゲームの状態を保存できる場所あなたがfactoriesまたはservicesを使用することができます(代わりに、任意のグローバル変数を使用して)
  • また、websocketsを使用することもできますので、1秒ごとにコールするのではなく、バックエンドのAPI(またはゲームコード)とソケット接続を確立し、apiを1回呼び出すごとに秒。あなたは、setTimeoutメソッドを使用している:あなたはこの
  • ます。また、値を格納するために$rootScopeを使用しますが、この

あなたの最後のオプションとして注意を持っている可能性を達成するために socket.ioで始めることができます。一定間隔で何かをトリガーするには、 $intervalを使用します。しかし、上記のオプションを分析して、どれがあなたに最も適しているかを把握してください。

関連する問題