6

我对此完全陌生,有一个问题。我在学校和家里做了一个练习,但我不知道该怎么做。

问题是我想在屏幕上的 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);
    }
}

}

4

3 回答 3

7

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

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()方法中随机生成,之后不要更改。

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

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);
}
于 2012-09-12T19:11:09.183 回答
1
GraphicsDevice.Clear(Color.White);

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

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

编辑:(请参阅 Bartosz 答案的后半部分以获取示例。我目前无法打开我的 XNA IDE,因此无法为您编写代码示例。)

于 2012-09-12T19:09:10.043 回答
1

你正在调用Clear你的 draw 方法

GraphicsDevice.Clear(Color.White);

这将清除屏幕。

删除这条线,它将保留以前绘制的东西。

于 2012-09-12T19:09:15.970 回答