1

Angular で作成した 2D JavaScript ゲーム エンジンを統合しています。このゲームは、エンジンが宇宙環境のシミュレーションを処理し、Angular が宇宙ステーションとの商品交換などのメニューを処理する宇宙ゲームです。

Angular サービスは、2 つのコンテキスト間のインターフェイスとして機能します。たとえば、ゲームがメッセージを記録する必要がある場合、 を呼び出しますlogServiceInstance.logDebug("Some message");。ゲーム キャンバスをオーバーレイする HTML div ($scope.logs で ng-repeat を使用) にログ メッセージをフィードする ConsoleController があります。

angular.module('game')
   .controller('ConsoleController', ['$scope', 'LogService', function($scope, logService) {
    $scope.logs = logService.getLogs();
}]);

ゲーム エンジンは Angular の外部でサービスを更新しているため、Angular はこれらのログの一部を認識していないため、すべてのログ メソッド (logInfo、logError、logDebug など) が logService でこれを呼び出します。ゲームから作成されたログは、ダイジェストをトリガーする 2 番目の引数として「true」を渡します。

addLog: function(log, updateContext) {
    console.log('(' + log.level + ') ' + log.message);
    logs.unshift(log);

    // NOTE: updateContext should be passed if log is
    // called outside of Angular context. This way Angular
    // reacts to the change.
    if(updateContext != null && updateContext === true) {
        // notify angular of a change
        $rootScope.$digest();
    }
}

ConsoleController が一貫してログ メッセージを取得できません。HTML 表示ではログが表示されませんが、javascript コンソールには表示されます。さらに、ダイジェスト内でダイジェストをトリガーしているというエラーが表示されます。

質問:

  • 他のソースからのダイジェストが既に進行中であるかどうかを知るにはどうすればよいですか?
  • サービスは、2 つのフレームワーク間で状態の受け渡しを統一するための最良の方法のように思えますが、これは悪いパターンですか? もしそうなら、なぜですか?

前もってありがとう、Angular 達人。

注: ゲーム エンジンはhttps://bitbucket.org/profexorgeek/frostflake-js-game-engine/です。

4

1 に答える 1