2012-02-18 14 views
0

私はキャンバス/ JSで初めてのゲームを作っていますが、関数コンストラクタに関する問題が発生しています。 Enemyオブジェクトが作成時に2つのスプライトの1つをランダムに取得するようにしようとしています。ここに私たちのコードの抜粋です:Javascript:コンストラクタのランダムスプライト選択

function Enemy() { 
    // Boilerplate stuff omitted. Relevant bit: 

    if (randomFromTo(1,50)%2 === 0) { // Assume this function works correctly 
     this.sprite.src = "images/scientist_1.png"; 
    } else { 
     this.sprite.src = "images/scientist_2.png"; 
    } 
} 

var enemy1 = new Enemy(); 
var enemy2 = new Enemy(); // etc 

それは十分に簡単なようだが、それは同じスプライトを持つすべての敵オブジェクトで終わります。私はこれがなぜ起こるのか分かりません。コンソールログメッセージを適切な場所に置くと正しい選択が記録されますが、すべての敵は同じスプライトで終わります。それが可能であると仮定して、これについて行く最善の方法は何ですか?ありがとう!

+3

'this.sprite'をどのように初期化しますか?たぶん、すべての敵が同じImageオブジェクトを共有しているのでしょうか? – kayahr

+0

どうやってそれを呼んでいますか? – Sarfraz

+1

'this.sprite'とは何ですか?それはどこに宣言されていますか? – satoshi

答えて

1

this.spriteがEnemyオブジェクトの外にある場合は、毎回それを上書きしている可能性があります。あなたが得た価値は最後の価値です。

コードを表示した後:プロトタイプの値はすべてのインスタンスで共有されます。インスタンス関連の状態をインスタンス(関数)自体に入れる必要があります。この場合

)は(敵に

// Sprite 
    this.sprite = new Image(); 
    this.sprite.src = ""; 

を入れて{...}

+0

です。私は上記のコメントに[完全なソース](http://pastebin.com/xEs8hzRW)を貼り付けました。それは最も可能性の高い原因のように思える - 私たちはそれを回避するために何ができるのか? – ark

+1

なぜあなたはEnemyに直接スプライトを置かないのですか? – Ixx

+0

それはそれを解決するように見える - ありがとう! – ark

1

あなたはプロトタイプで直接this.spriteを初期化している場合、すべての敵オブジェクトには、各呼び出しを同じイメージを共有しますコンストラクタはすべてのの敵を上書きします。だから、これはありませんない仕事:あなたはこのようにそれをしなければならない

function Enemy() 
{ 
    this.sprite.src = ...someRandomizedUrl... 
} 

Enemy.prototype.sprite = new Image(); 

function Enemy() 
{ 
    this.sprite = new Image(); 
    this.sprite.src = ...someRandomizedUrl... 
} 

あなたの完全なソースコードは、すべての理由は、最初のコードブロック(間違った1)と全く同じです敵は同じGameObjectを共有するため、同じスプライト画像を共有します。コンストラクタEnemythis.spriteを初期化してください。