XNA 4 — таймер, не создающий астероиды

Я пытаюсь создать свой астероид через определенное время. Я делаю это, делая таймер.

Вот метод обновления.

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 не выполнялся.


person freemann098    schedule 23.04.2013    source источник
comment
ты пробовал if(timeElapsed >= spawnAsteroid) ?   -  person MikeB    schedule 24.04.2013
comment
Вся ваша логика/физика должна быть в цикле обновления, а рисунок должен быть в цикле рисования.   -  person Dustin Kingen    schedule 24.04.2013
comment
Да, но как мне назвать/нарисовать астероид после timeElapsed ›= spawnAsteroid?   -  person freemann098    schedule 24.04.2013


Ответы (1)


Вы должны рисовать методом 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;
}
person Cyral    schedule 23.04.2013
comment
Это сработало отлично! Только одно, мне нужно, чтобы они появлялись в разных местах каждый раз, когда появляются. Правда, только по оси Y. - person freemann098; 24.04.2013
comment
Рад, что смог помочь, это просто. Все, что вам нужно сделать, это изменить позицию появления в файле Asteroids.Add. Создайте новую случайную переменную Random random = new Random() и измените ее на эту Asteroids.Add(new Vector2(X,random.Next(0, GraphicsDevice.Viewport.Height))); - person Cyral; 24.04.2013
comment
Да, я пробовал это, но он все еще просто появляется в том же месте. - person freemann098; 25.04.2013