0

私のゲームでは、スポーン時にタイマーをオンにしてスポーンする小惑星があり、一度に 1 つずつスポーンさせたいと考えています。私の問題は、それらがすべて同じ列にスポーンすることです。そのため、速度が上がると左に移動し、すでに画面からほとんど外れている小惑星にスポーンします。

http://www.youtube.com/watch?v=9pKXZyzIpGs&feature=youtu.be

これが私の更新コードです。

namespace PixeBlastGame
{
    public class GameUpdate
    {
        SpriteBatch spriteBatch;
        GameTime gameTime;

        Vector2 vPlayer = new Vector2(0, 720 / 2);
        Vector2 vAsteroid;
        Vector2 velocity;
        Random rand = new Random();

        float spawnTimer;
        float spawnRate = 1;
        List<Vector2> Asteroids = new List<Vector2>();


        public GameUpdate()
        {
            vAsteroid.Y = rand.Next(100, 680);
            vAsteroid.X = 1100;
        }

        public void Update(GameTime theTime)
        {
            gameTime = theTime;
            vPlayer.Y += velocity.Y;

            float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;
            spawnTimer += elapsed;



            if (spawnTimer >= spawnRate)
            {
                Asteroids.Add(new Vector2(1000 ,rand.Next(0, 720)));
                spawnTimer = 0;
            }

            if (Keyboard.GetState().IsKeyDown(Keys.Down))
            {
                velocity.Y = 5;
            }

            else if (Keyboard.GetState().IsKeyDown(Keys.Up))
            {
                velocity.Y = -5;
            }

            else
            {
                velocity.Y = 0;
            }

            if (vPlayer.Y > 630 )//+ Game1.tPlayer.Height)
                vPlayer.Y = 630;
            if (vPlayer.Y < -10) //+ Game1.tPlayer.Height)
                vPlayer.Y = -10;


        }

        public void Draw(SpriteBatch theBatch)
        {
            spriteBatch = theBatch;

            foreach (Vector2 asteroid in Asteroids) //Draw each astroid
            {
                DrawAsteroid(asteroid.X, asteroid.Y);
            }

            spriteBatch.Begin();


            spriteBatch.Draw(Game1.tPlayer, vPlayer, Color.White);

            spriteBatch.End();
        }

        public void DrawAsteroid(float x, float y)
        {
            vAsteroid.X -= 5; vAsteroid.Y = y;
            spriteBatch.Begin();
            spriteBatch.Draw(Game1.tAsteroid, vAsteroid, Color.White);
            spriteBatch.End();
        }
    }
}

私を助けるためにさらにコードを提供する必要がある場合は、コメントを投稿してください。

4

1 に答える 1

2

小惑星クラスを作る

public class Asteroid
{
       public Vector2 Velocity;
       public Vector2 Position;
       public Asteroid(Vector2 velocity, vector2 position)
       {
        Velocity = velocity;
        Position = position;
       }
}

リストを次のように変更します。

List<Asteroid> Asteroids = ...

そして今から、あなたはこのようなことをすることができます

Asteroids[0].Velocity = Whatever

このようにして、小惑星の各インスタンスを変更できます

描画方法を見てみましょう。

public void DrawAsteroid(float x, float y)
        {
            vAsteroid.X -= 5; vAsteroid.Y = y;
            spriteBatch.Begin();
            spriteBatch.Draw(Game1.tAsteroid, vAsteroid, Color.White);
            spriteBatch.End();
        }

x と y の値を使用していないので、ポイントは何ですか? コードのどこでも、vASteroid を削除して、リスト内のインスタンスを使用する必要があります。

これに変更DrawAsteroidします。

 public void DrawAsteroid(Asteroid a)
            {
                spriteBatch.Begin();
                spriteBatch.Draw(Game1.tAsteroid, a.Position, Color.White);
                spriteBatch.End();
            }

そしてそれへの呼びかけ..

    foreach (Asteroid a in Asteroids) //Draw each astroid
    {
        DrawAsteroid(a);
    }

update で同じことを行う必要があります。位置を更新しないでください。Draw()

これを更新に追加します。

    foreach (Asteroid a in Asteroids) //Update each astroid
    {
        UpdateAsteroid(a, elapsed);
    }

そして、新しいメソッドを追加します...

 public void UpdateAsteroid(Asteroid a, float elapsed)
        {
            a.Position += a.Velocity * elapsed;
        }

さて、小惑星をスポーンするときは、速度が追加されていることを確認する必要があります!

Asteroids.Add(new Asteroid(new Vector2(0,-10), new Vector2(50,50)));

これにより、Y速度が -10、位置が 50,50の小惑星が生成されます。

于 2013-04-25T01:18:52.270 に答える