2017-10-01 11 views
1

私はキャンバスにタイルのグリッドを使ってランダムマップジェネレータを構築しようとしています。各タイルtiles[i]については、tiles[i-1]を使用する前にタイルのプロパティをチェックします。これは、 "普通の"オブジェクト(方法1)を使用して動作するように見えますが、 "2d"オブジェクト(方法2)ではなく、tiles[i-1].tileIDtiles[i].tileIDと表示されます。私は標準オブジェクト(javascript)のようにタイル[i-1]を介して "2d"オブジェクトのプロパティにアクセスできません

for (i=0; i<40; i++) { 
    tiles[i] = { tileID: i}; // METHOD 1 
    tiles[i]=c.getContext("2d") // METHOD 2 
    tiles[i].tileID = i // METHOD 2 
    if(i>0) { 
    console.log("my tile ID is", tiles[i].tileID, 
    ". The tile ID of the tile before me is", tiles[i-1].tileID) 
    } 
} 

方法1を使用して(と方法2の2行を削除)、あなたが期待するものコンソール版画:
私のタイルIDが12です。私の前にタイルのタイルIDは11

ではなく、方法2のために:
私のタイルIDは12です。私の前のタイルのタイルIDは12

私は回避策を見る前にこれを行う理由がありますか?乾杯!

答えて

0

c.getContext("2d")は常に同じオブジェクトを返すためです。あなたはこのようにそれを行うときに:

for (i=0; i<40; i++) { 
    tiles[i]=c.getContext("2d") // METHOD 2 
    tiles[i].tileID = i // METHOD 2 
} 

tiles[i] = c.getContext("2d")、アレイ内の各タイルに同じオブジェクトを割り当てます。式tiles[i].tileID = iは、新しいIDをタイルオブジェクトに割り当てるのに必要ですが、タイルオブジェクトは常に同じです。そして、同じオブジェクトが各反復で新しいIDを取得するだけです。

タイルのプロパティを保存するための正しい方法は、あなたが法1でそれを行うように、各タイルのための新しいオブジェクトを作ることです。

for (i=0; i<40; i++) { 
    tiles[i] = { tileID: i}; // METHOD 1 
} 
関連する問題