【问题标题】:C# XNA Random tile engineC# XNA 随机瓦片引擎
【发布时间】:2012-02-27 06:17:50
【问题描述】:
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# random xna tile tile-engine


    【解决方案1】:

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

    将您当前的循环复制到一个新区域:您的地图加载。还添加一个 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);
            }
        }
    

    【讨论】:

    • 谢谢!我不知道 draw 每一帧都运行,但是当我看到它闪烁时我认为这就是问题所在。我只是不确定如何处理随机事件,但我现在明白了。一个问题虽然我得到了 tileNums 数组的索引超出范围。我创建这样的数组 int[,] tileNums = new int[0,3];对吗?
    • 不,这些是每个维度的大小。这个结构应该和你的地图一样大,所以我会做new int[map.GetLength(1), map.GetLength(0)];(因为我做了x, y,当然你可以做y, x并将它们反转)
    • 啊!好的,现在我考虑一下,这很有意义:p。非常感谢您帮助我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2016-11-07
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    相关资源
    最近更新 更多