如何在随机位置绘制10个精灵?

时间:2012-09-12 18:54:02

标签: c# random xna position sprite

我是全新的,有一个问题。我在学校和家里做过锻炼,但我无法弄明白该怎么做。

问题是我想在屏幕上的10个随机位置绘制一个精灵,而不使用特殊的精灵类。我的问题是他们被吸引后会再次消失。

解决了它,感谢所有的帮助!

public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    Texture2D turtleTexture;
    int counter = 0;
    Random randomera = new Random();
    int x;
    int y;

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";        
    }

    protected override void Initialize()
    {
        base.Initialize();
    }

    /// <summary>
    /// </summary>
    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);
        turtleTexture = Content.Load<Texture2D>(@"Images/turtle_50x38");
    }

    protected override void UnloadContent()
    {
    }

    protected override void Update(GameTime gameTime)
    {
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();

         /*
         if(counter < 10)
         {
             x = randomera.Next(600);
            y = randomera.Next(400);
            counter++;
         }
         */

        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.White);

        spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);


        if (counter < 10)
        {
            for (int i = 0; i < 10; i++)
            {
                spriteBatch.Draw(turtleTexture, new Vector2(randomera.Next(600), randomera.Next(400)),
                    Color.Black);
                counter++;
            }
        }

        spriteBatch.End();
        base.Draw(gameTime);
    }
}

}

3 个答案:

答案 0 :(得分:7)

如果你想让你的精灵一直处于相同的随机位置并且仍然清除你的视口(例如,你可能想渲染其他内容),你可以将每一帧的随机种子重置为相同的值: / p>

protected override void Draw(GameTime gameTime)
{
    randomera = new Random(seed);   
    GraphicsDevice.Clear(Color.White);

    spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);


    if (counter < 10)
    {
        for (int i = 0; i < 10; i++)
        {
            spriteBatch.Draw(turtleTexture, new Vector2(randomera.Next(600), randomera.Next(400)),
                Color.Black);
            counter++;
        }
    }

    spriteBatch.End();
    base.Draw(gameTime);
}

种子应该在Initialize()方法中随机生成,之后不要更改。

您也可以使用预定义的coords初始化列表:

List<Vector2> coords = Enumerable.Range(0, 10).Select(i => new Vector2(randomera.Next(600), randomera.Next(400)).ToList();

并在绘图程序中使用此列表:

for (int i = 0; i < 10; i++)
{
    spriteBatch.Draw(turtleTexture, coords[i],
        Color.Black);
}

答案 1 :(得分:1)

GraphicsDevice.Clear(Color.White);

这会清除屏幕(意味着先前绘制的任何内容都将被删除)。包含此语句的Draw函数大约每秒调用30到60次,随机函数将在每次迭代中获取新值。

在每次Draw迭代中清除屏幕是正确的,因此,不是在每次调用Draw时选择随机坐标,而是先预先确定坐标。更好的方法可能是在构造函数中初始化10个向量的数组,然后在Draw函数中使用该数组(而不是一遍又一遍地调用randomera.Next()。)

编辑:(请看Bartosz的答案的后半部分。我现在无法打开我的XNA IDE,所以我不能为你写出代码示例。)

答案 2 :(得分:1)

您在绘制方法中调用Clear

GraphicsDevice.Clear(Color.White);

这将清除屏幕。

删除此行,它将保留以前绘制的内容。