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);
            }
        }
    }

当我这样做时,它只会闪烁瓷砖并不断重绘它们。我该怎么做才能获得仅绘制一次的随机效果?有没有办法我可以用鼠标点击这些图块并让它们改变?另外,有没有办法让一个瓷砖比其他瓷砖更流行?

4

1 回答 1

3

我相信您只希望一次随机生成图块,然后每次都绘制该随机序列。请记住,Draw在 XNA 中运行每个“帧”,通常每秒不止一次!

将您当前的循环复制到一个新区域:您的地图加载。还添加一个 2D 数据结构(数组或其他)来存储图块生成的结果。我正在调用我的示例 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);
        }
    }
于 2012-02-27T06:53:01.563 回答