2013-03-30 2 views
0

Я пишу игру, и я бы хотел, чтобы анимация взрыва запускалась всякий раз, когда происходит столкновение. Однако подходы, которые я знаю, как оживить, основаны на ввод с клавиатуры. Каков наилучший способ кодирования метода, чтобы при вызове анимации один проход через все кадры останавливался?Анимация короткой последовательности

public void Update(GameTime gametime) 
    { 
    timer += gametime.ElapsedGameTime.Milliseconds; 
     if (timer >= msBetweenFrames) 
     { 
     timer = 0; 
     if (CurrentFrame++ == numberOfFrames - 1) 
      CurrentFrame = 0; 
      rect.X = CurrentFrame * width; 
      rect.Y = 0; 
    } 
    } 

    public void Render(SpriteBatch sb, Vector2 position, Color color) 
    { 
    sb.Draw(aniTex, position, rect, color, 0, Vector2.Zero, 2.0f, SpriteEffects.None, 0); 
} 
+0

ли ваш код сделать работу? Это выглядит хорошо. – Virtlink

+0

В метод Update Game1.cs - это взрыв вызоваAnimatio.Update (gameTime), который работает без ошибок, но он бесконечно циклически. Я хочу, чтобы один пробег над кадрами, а затем анимация, остановилась. – phcoding

+0

Это похоже на то, что вы его зацикливаете (когда текущий кадр достигает конца, вы возвращаете его обратно на 0). –

ответ

2

Если проблема просто перекручивание вопроса, вы можете просто удалить кусочек кода в вашем обновлении, что приводит к его циклу (The if (CurrentFrame++ == numberOfFrames - 1) CurrentFrame = 0;) Все, что вам нужно будет сделать, чтобы получить анимацию, чтобы играть снова, , если вы хотите, чтобы он воспроизводился, установите текущий кадр обратно на 0. (Чтобы остановить его рисование, просто сделайте вызов рисования, когда захотите.)

Если вы ищете способ его структурирования (как я изначально интерпретировал ваш вопрос!), Почему бы не иметь анимированный класс которые вы настроили с помощью любых объектов, которые хотите оживить. Что-то вдоль линий

class AnimatedObject 
{ 
    Texture2D texture; 
    Rectangle currentRectangle; 
    Rectangle frameSize; 
    int frameCount; 
    int currentFrame; 

    bool isRunning; 

    public AnimatedObject(Texture2D lTexture, Rectangle lFrameSize, int lFrameCount) 
    { 
     texture = lTexture; 
     frameSize = lFrameSize; 
     currentRectangle = lFrameSize; 
     currentFrame = 0; 
    } 

    public void Pause() 
    { 
     isRunning = false; 
    } 

    public void Resume() 
    { 
     isRunning = true; 
    } 

    public void Restart() 
    { 
     currentFrame = 0; 
     isRunning = true; 
    } 

    public void Update() 
    { 
     if(isRunning) 
     { 
      ++currentFrame; 
      if(currentFrame == frameCount) 
      { 
       currentFrame = 0; 
      } 

      currentRectangle.X = frameSize.Width * currentFrame; 
     } 
    } 

    public void Draw(SpriteBatch spriteBatch) 
    { 
     if(isRunning) 
     { 
      spriteBatch.Draw(texture, currentRectangle, Color.White); 
     } 
    } 
} 

Очевидно, что вы можете расширить это, чтобы быть более сложными (например, используя свои таймеры, чтобы выбрать, когда для перемещения кадров и т.д.

+0

Это продуманная структура, и я думаю, что это поможет упростить мой код. Спасибо за информативный ответ. – phcoding

1

Вы можете остановить анимацию, например, путем удаления объекта с анимацией из игры, когда анимация закончилась.

Или иначе вы можете установить currentFrame на недопустимое значение (например, -1), когда анимация будет выполнена, и протестировать это.

public void Update(GameTime gametime) 
{ 
    if (currentFrame >= 0) 
    { 
     timer += gametime.ElapsedGameTime.Milliseconds; 
     if (timer >= msBetweenFrames) 
     { 
      timer = 0; 
      currentFrame++; 
      if (currentFramr >= numberOfFrames - 1) 
       currentFrame = -1; 
      rect.X = CurrentFrame * width; 
      rect.Y = 0; 
     } 
    } 
} 

public void Render(SpriteBatch sb, Vector2 position, Color color) 
{ 
    if (currentFrame >= 0) 
     sb.Draw(aniTex, position, rect, color, 0, Vector2.Zero, 2.0f, SpriteEffects.None, 0); 
} 
+0

Спасибо за ваш ответ. Я нашел, что это полезно. – phcoding

Смежные вопросы