我试图在一段时间后产生我的小行星。我通过制作计时器来做到这一点。
这是更新方法。
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语句不会执行。
答案 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;
}