2012-02-27 16 views
0
public void Draw(SpriteBatch theSpriteBatch) 
    { 
     Random rand = new Random(); 
     for(int y = 0; y < map.GetLength(0); y++) { 
      for(int x = 0; x < map.GetLength(1); x++) { 
       theSpriteBatch.Draw(tile[rand.Next(0,3)], new Rectangle(x*tileWidth,y*tileHeight,tileWidth,tileHeight), 
        Color.White); 
      } 
     } 
    } 

これを実行すると、タイルが点滅して常に再描画されます。一度描くだけでランダム効果を得るにはどうすればよいですか?これらのタイルをマウスでクリックして変更する方法はありますか?また、1つのタイルを他のタイルよりも優勢にする方法はありますか?C#XNAランダムタイルエンジン

答えて

3

は、私はあなただけをランダムタイル1時間を生成し、そのランダムシーケンスたびを描画するために探していると信じています。 XNAでDrawは一般道毎秒回以上であるすべての「フレーム」を、実行し、覚えておいてください!地図の読み込み:

は、新たなエリアへの上に電流ループをコピーします。また、2Dデータ構造(配列など)を追加して、タイル生成の結果を格納します。私はサンプルの2次元整数配列tileNumsを呼び出しています。今、彼らは今のようなループを維持する代わりに、抽選の結果を格納するために内臓を変更:

Random rand = new Random(); 
    for(int y = 0; y < map.GetLength(0); y++) { 
     for(int x = 0; x < map.GetLength(1); x++) { 
      tileNums[x, y] = rand.Next(0,3); 
     } 
    } 

今だけ、もはやこのデータから取るようにランダムにし、代わりに生成しないためにあなたの現在のDrawループの内臓を変更:

//Random object no longer needed 
    for(int y = 0; y < map.GetLength(0); y++) { 
     for(int x = 0; x < map.GetLength(1); x++) { 
      theSpriteBatch.Draw(tile[tileNums[x, y]], new Rectangle(x*tileWidth,y*tileHeight,tileWidth,tileHeight), 
       Color.White); 
     } 
    } 
+0

ありがとうございました!私はドローイングがフレームごとに走っているのを知らなかったが、私はそれがちらちら見えるときに問題だったと思った。私はちょうどランダムを得るのをどう扱うか分からなかったが、私は今それを得た。私はtileNums配列で範囲外のインデックスを取得しますが、1つの問題。私はこのint [、] tileNums = new int [0,3]のような配列を作成します。右? – Corey

+0

いや、これらは、各次元のサイズです。この構造は、マップとまったく同じサイズでなければなりませんので、私は '新しいint型だろう[map.GetLengthを(1)、map.GetLength(0)];'(私はそれ 'X、y'、もちろんあなたをしたので、ああ 'Y、X 'およびそれらの逆) –

+0

を行うことができます!私はそれについて考えるようになりました。私に手伝ってくれてありがとう – Corey