不能在XNA中的另一个方法中使用变量

时间:2011-08-02 01:14:44

标签: for-loop xna

我会在深入解释之后。所以这是我的代码,我们有一个Elevation []变量,每个Elevation都有一个随机数:

public void elevation()
    {
        for (x = (int)Width - 1; x >= 0; x--)
        {
            for (y = (int)Width - 1; y >= 0; y--)
            {
                y = rand.Next((int)MaxElevation); //random number for each y.
                Elevation[x] = y; //each Elevation gets a random number.
            }
        }
    }

在此之后我尝试在draw方法中使用这个随机数,如下所示:

public void Draw(SpriteBatch spriteBatch)
    {
        for (x = (int)Width - 1; x >= 0; x--)
        {
            spriteBatch.Draw(Pixel, new Rectangle((int)Position.X + x, (int)Position.Y - Elevation[x], 1, (int)Height), Color.White);
            //HERE, I try to acces the random number for each Elevation (y value). But I get 0 everywhere.
        }
    }

如何访问此随机数?

如果我这样做:

public void Draw(SpriteBatch spriteBatch)
    {
        for (x = (int)Width - 1; x >= 0; x--)
        {
            for (y = (int)Width - 1; y >= 0; y--)
            {
                y = rand.Next((int)MaxElevation);
                spriteBatch.Draw(Pixel, new Rectangle((int)Position.X + x, (int)Position.Y - Elevation[y], 1, (int)Height), Color.White);
            }
        }
    }

我将能够访问随机数,但它会更新每一帧,随机数会发生变化。所以我需要计算一次然后再使用它们。

以下是所有代码:

namespace procedural_2dterrain
{
  class Terrain
{
    Texture2D Pixel;
    Vector2 Position;
    Random rand;

    int[] Elevation;

    float MaxElevation;
    float MinElevation;

    float Width;
    float Height;

    int x;
    int y;


    public void Initialize( ContentManager Content, float maxElevation, float minElevation, float width, float height, Vector2 position)
    {
        Pixel = Content.Load<Texture2D>("pixel");
        rand = new Random();

        Elevation = new int[(int)width];

        MaxElevation = maxElevation;
        MinElevation = minElevation;

        Width = width;
        Height = height;

        Position = position;

        elevation();

    }

    public void Update()
    {
    }

    public void elevation()
    {
        for (x = (int)Width - 1; x >= 0; x--)
        {
            for (y = (int)Width - 1; y >= 0; y--)
            {
                y = rand.Next((int)MaxElevation);
                Elevation[x] = y;
            }
        }
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        for (x = (int)Width - 1; x >= 0; x--)
        {
            spriteBatch.Draw(Pixel, new Rectangle((int)Position.X + x, (int)Position.Y - Elevation[x], 1, (int)Height), Color.White);
        }
    }

}

}

1 个答案:

答案 0 :(得分:1)

问题在于您的elevation()方法。您正在使用y作为内循环索引器,并在循环内为其分配值。因此循环开始,y被赋予随机值。当它继续循环时,它会递减,然后测试为>=0。此循环将退出的唯一时间是y被赋予随机数0。这就是为什么你的所有Elevation都为零。

我有点困惑为什么你认为你需要一个内循环。尝试:

public void elevation()
{
    for (x = (int)Width - 1; x >= 0; x--)
    {            
        Elevation[x] = rand.Next((int)MaxElevation);            
    }
}