1

PhaserIO を Meteor と組み合わせて使用​​して、マルチプレイヤー html5 ゲームを作成していますが、作成中のネットワーク プロトタイプで理解できない障害に遭遇しました。まず、関連するコード ( gistとしても入手可能):

if(Meteor.isClient) {

    var game,
        mainState,
        mainStateInitialized,
        characterData;

    Template.game.game = function() {

        characterData = Character.find().fetch();

        if(!mainStateInitialized)
        {
            game = new Phaser.Game(500, 600, Phaser.AUTO, 'gameScreen');
            createMainState()
        }     
    }
}

function createMainState()
{
    mainState = {
        sprites: null,
        playerLastFrame: characterData.length,
        playerCurrentFrame: null,
        charData: characterData,

        preload: function() {
            this.sprites = game.add.group();
            game.stage.disableVisibilityChange = true;
            game.load.image('hello', 'resources/hello.png');
        },

        create: function() {
            $.each(characterData, function(index) {
                var sprite = mainState.sprites.create(this.x, this.y, 'hello');
                sprite.angle = this.angle;
            });
        },

        update: function() {
            this.charData = characterData;
            this.playersCurrentFrame = this.charData.length;

            if(this.playersLastFrame > this.playersCurrentFrame) {
                //todo: remove player that left
            }
            else if(this.playersLastFrame < this.playersCurrentFrame) {
                for(var i = playersLastFrame; i < playersCurrentFrame; i++) {
                    var thisData = this.charData[i],
                        sprite = null;
                    sprite = mainState.sprites.create(thisData.x, thisData.y, 'hello');
                    sprite.angle = thisData.angle;
                }
            }
            for(var j = 0; j < mainState.sprites.length; j++) {
                mainState.sprites.getAt(j).angle = this.charData[j].angle;
            }
            playersLastFrame = this.charData.length;
        }
    }

    game.state.add('main', mainState);
    game.state.start('main');
    mainStateInitialized = true;
}

このプロトタイプのアイデアは、DB 内の各アカウントのキャンバスにスプライトを表示することです。私がテストしている主な機能は次のとおりです。

  1. スプライト/プレーヤー データをシームレスに動的に追加する (すべての適切なマルチプレーヤー オンライン ゲームが可能である必要があります。これにより、最終的に適切な参加/退出システムへの道が開かれます)

  2. そして、効率的なパケットの作成を台無しにします。

現在、プレイヤーが新しいアカウントを作成したときに新しいスプライトを動的に作成する際に問題が発生しています。約 75% の確率で、プレーヤーが新しいアカウントを作成しても何も起こりません。Meteor は、クエリ可能な文字データを正しくプッシュ ダウンしmainState.sprites、スプライト データを正しく表示します。ただし、キャンバスには何もレンダリングされません。

残りの 25% の時間は問題なく動作します。さらに、コードにブレークポイントを設定すると、100% の確率で動作します。

したがって、断続的な何かがここで明らかに発生していますが、何が問題なのかわかりません。更新ループ中にスプライトを追加するときに欠けているものはありますか? これにアプローチするより良い方法はありますか?

私のコードは Nitrous.io にあるので、問題の解決に役立つ場合は、localhost インスタンスを実行してヒットさせることができます。

4

1 に答える 1

1

問題は、playersLastFrame =playerCurrentFrame を設定していなかったことです。

これが基本的なループ/比較構造であることを考えると、今ではばかげているように感じます。last = ループ終了時の電流。

はぁ : (。

于 2014-07-25T20:08:21.487 に答える