2017-02-05 9 views
-1

Phaserを使用してJavascriptゲームを作成し、 'this'キーワードに関する質問があります。Phaser Javascriptゲーム、このキーワードとゲームの状態

  • このは、現在の状態(rainState)を参照してくださいしていますか?

  • this.emitter = this.game.add.emitter(100、0、400);は、emitterオブジェクトを格納するrainStateオブジェクトにemitterプロパティを作成しますか?

  • ゲームは州のプロパティですか? this.addエミッタとは対照的に、なぜ this.game.add.emitter

// --------------------をを書くのですか-----------------------------

 var Smash = Smash || {}; 

    Smash.rainState = { 
     create: function() { 
      this.emitter = this.game.add.emitter(this.game.world.centerX, 0, 400); 

      this.emitter.width = this.game.world.width; 
      this.emitter.angle = 30; 
      this.emitter.makeParticles('particle'); 

      this.player = new Smash.Player(this.game, 100, 300, 'player'); 

      this.intro0();  
     }, 

     intro0: function() { 
      this.player.animations.play("run", 9, true); 
     }, 
    }; 

答えて

1

これは、現在の状態(rainState)を参照してくださいしていますか?

答えはそれがどのように呼び出されるかによって異なります。

それはrainStateオブジェクトのメソッドとして呼ばれていた場合は、コンテキスト(this)はrainStateオブジェクトに設定されます:callapplyを使用して

Smash.rainState.create(); 

、またはbindあなたが好きなスコープに渡すことができます引数として:

Smash.rainState.create.call(foo); //immediately invoked 
Smash.rainState.create.apply(foo); //immediately invoked 
var bar = Smash.rainState.create.bind(foo); //reference to a newly created bound function 

Iが想定this.emitter = this.game.add.emitter(100、0、400);エミッタオブジェクトを格納するrainStateオブジェクトにエミッタプロパティを作成しますか?あなたはthis.emitterに値を割り当てる

はいは、それは、オブジェクトrainStateのプロパティとして追加されます。

Smash.rainState = { 
    create: function() { 
     console.log(Smash.rainState.emitter); //undefined 
     this.emitter = this.game.add.emitter(this.game.world.centerX, 0, 400); 
     console.log(Smash.rainState.emitter); //[object Object] 
    },  
}; 

状態の性質ゲームですか?対照的に、なぜあなたが提供したコードに基づいて

エミッタthis.addするthis.game.add.emitter書くんgamerainStateのメソッドやプロパティであるように、それは見ていません。さらに、this.addobjectタイプの組み込み関数ではありません。 gameが他の場所のrainStateのプロパティとして追加されていない限り、別の方法でそれを参照する必要があります。グローバル

Smash.rainState = { 
    create: function(game) { 
     this.emitter = game.add.emitter(this.game.world.centerX, 0, 400); 
    } 
} 

//a context where game is a property 
{ 
    this.game = new Phaser.Game(); 

    Smash.rainState.create(this.game); 
} 

フェイザーは、あなたがPhaser.Gamegameインスタンス化を参照してくださいどのように周りにいくつかの特定の設定があります。gameがコンテキストに存在する場所から渡されたパラメータとして

var game = new Phaser.Game(); 

var Smash = Smash || {}; 

Smash.rainState = { 
    create: function() { 
     this.emitter = game.add.emitter(this.game.world.centerX, 0, 400); 

別のコンテキストでのクラス:

"Via":クラスがビア列に項目を持っている場合は、ローカル参照を使用してすばやくアクセスできることを意味します。私。任意の状態からthis.cameraを介してカメラを制御することができます。また、ゲームがグローバルに定義されている場合はgame.cameraを使用できます。

これはグローバルスコープ(任意の{}の外側)にごgameインスタンスを初期化した場合、あなたは世界的にそれを呼び出すことができるべきであることを意味します。あなたのコード内でこのような何かを探し、それが別の関数やオブジェクトの内部ではないことを確認してください。

var game = new Phaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: preload, create: create, update: update, render: render }); 
+0

こんにちはスティーブン、おかげで、これは素晴らしい答えです。ゲームオブジェクトはコードで作成されます...... var Smash = Smash || {}; ...... Smash.game =新しいPhaser.Game(640,480、Phaser.AUTO、 'phaser'); ..しかし、この状態は別のファイル - game.js(ゲームのエントリーポイント) - stckpete 8分前 – stckpete

+0

Phaser.Stateクラスはプロパティとして「ゲーム」を持っているようです:[Phaser.State](http://phaser.io/docs/2.6.2/Phaser.State.html)。 'Smash.rainState'をPhaser.Stateクラスのインスタンスを生成する関数に渡す場合、' rainState'プロパティはPhaser.Stateプロパティと組み合わされ、 'this.game'は動作するはずです。 – stephenlcurtis

関連する問題