XNA 4 - 计时器不产生小行星

时间:2013-04-23 22:38:57

标签: c# xna xna-4.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语句不会执行。

1 个答案:

答案 0 :(得分:4)

您必须使用Draw方法

进行绘制

从更新方法中删除此内容:

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

在我们将其添加到您的绘制方法之前,我们必须首先进行更改,timeElapsed可能始终完全等于spawnAsteroid,即使它确实如此,每一帧我们刷新屏幕所以只绘制一帧。因此,我们必须使用大于或等于运算符>=

<强> - 编辑 -

但是我意识到你需要不止一个小行星,所以我们使用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;
 }

在你的更新方法中,我们需要制作一些新的代码来产生小行星

制作这些新变量:

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