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方法中绘制

从您的更新方法中删除它:

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

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

-编辑-

但我意识到你需要不止一颗小行星,所以让我们用 aList来存储所有的小行星。您应该创建自己的小行星类,但对于本示例,我们将仅使用位置列表:

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;
}
于 2013-04-23T23:28:42.680 回答