2012-02-27 45 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); 
      } 
     } 
    } 

当我这样做时,它只是闪烁的瓷砖,并不断重新绘制它们。我只做一次绘制的随机效果怎么办?有没有办法让我用鼠标点击这些瓷砖,并让它们变化?另外,有没有办法让一块瓷砖比其他瓷砖更普遍?C#XNA随机平铺引擎

回答

3

我相信你正在寻找只随机生成的瓦片一次然后绘制每次由随机序列。请记住,XNA中的Draw运行每个“帧”,这通常每秒钟超过一次!

将当前循环复制到新区域:加载地图。还要添加一个2D数据结构(数组或其他)来存储您的tile生成结果。我打电话给我的示例2D整数数组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数组的范围,但有一个问题。我创建这样的数组int [,] tileNums = new int [0,3];对? – Corey 2012-02-27 07:19:17

+0

不,那些是每个维度的大小。这个结构应该和你的地图大小完全一样,所以我会做'new int [map.GetLength(1),map.GetLength(0)];'(因为我做了'x,y',当然你可以做'y,x'并将它们反转) – 2012-02-27 07:23:59

+0

啊!好吧,现在我想到它是非常有意义的:p。非常感谢帮助我 – Corey 2012-02-27 07:28:50