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 関数は、1 秒あたり約 30 ~ 60 回呼び出され、ランダマイザーはこれらの反復のたびに新しい値を取得します。

Draw の反復ごとに画面をクリアするのは正しいため、Draw の呼び出しごとにランダムな座標を選択するのではなく、事前に座標を決定します。コンストラクターで 10 個の Vector の配列を初期化し、その配列を Draw 関数で使用することをお勧めします (randomera.Next()何度も呼び出すのではなく)。

編集: (例については、Bartosz の回答の後半を参照してください。現時点では XNA IDE を開くことができないため、コード例を書き出すことはできません。)

于 2012-09-12T19:09:10.043 に答える
1

Cleardraw メソッドで呼び出しています

GraphicsDevice.Clear(Color.White);

これで画面がクリアされます。

この行を削除すると、以前に描画されたものが保持されます。

于 2012-09-12T19:09:15.970 に答える