0

一定時間後に小惑星を生成しようとしています。私はタイマーを作ることによってこれを行います。

更新方法はこちら。

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

            float secs = (float)theTime.ElapsedGameTime.Seconds;
            timeElapsed += secs;
            secs = 1.5f;

            if (timeElapsed == spawnAsteroid)
            {
                DrawAdsteroid();
                timeElapsed = 0f;
            }

            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;
        }

DrawAsteroid メソッドは次のとおりです。

public void DrawAdsteroid()
        {
            spriteBatch.Begin();
            spriteBatch.Draw(Game1.tAsteroid, vAsteroid, Color.White);
            spriteBatch.End();
        }

そして、ここに変数が定義されています。

SpriteBatch spriteBatch;
        GameTime gameTime;

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

        float timeElapsed = 0f;
        float spawnAsteroid = 1.5f;

発生する問題は、小惑星が決して現れないことです。デバッグして if ステートメントが実行されなかったため、タイマーが機能していないと思います。

4

1 に答える 1

4

Drawメソッドで描画する必要があります

update メソッドからこれを削除します。

    if (timeElapsed == spawnAsteroid)
    {
        DrawAdsteroid();
        timeElapsed = 0f;
    }

描画メソッドに追加する前に、最初に変更を加える必要があります。timeElapsed正確一致することはありません。変更spawnAsteroidした場合でも、フレームごとに画面が更新されるため、1 フレームのみ描画されます。このため、より大きいまたは等しい演算子を使用する必要があります>=

-編集-

しかし、複数の小惑星が必要であることはわかっているので、a を使用しListてすべての小惑星を保存します。独自の小惑星クラスを作成する必要がありますが、この例では位置のリストのみを使用します。

List<Vector2> Asteroids = new List<Vector2>();

メソッドでこれを試してくださいDraw

protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black) //Add a background and clear screen each frame
foreach (Vector2 asteroid in Asteroids) //Draw each astroid
{
     DrawAsteroid(asteroid.X,asteroid.Y);
}

}

また、速度に経過時間を適用することをお勧めします。この方法では、異なるコンピューターまたはパフォーマンスが異なるときに、まったく同じ速度で移動します。これを行うには、次のようにします。

 float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;
 if (Keyboard.GetState().IsKeyDown(Keys.Down))
 {
                velocity.Y = SPEED * elapsed;
 }

update メソッドでは、小惑星を生成する新しいコードを作成する必要があります。

これらの新しい変数を作成します。

float spawnTimer;
float spawnRate = 1; //Spawn every second

そして、このコードを追加して更新します(古い生成コードを削除します)

float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;
spawnTimer += elapsed;
if (spawnTimer >= spawnRate)
{
Asteroids.Add(new Vector2(X,Y));
spawnTimer = 0;
}
于 2013-04-23T23:28:42.680 に答える