Gif анимация останавливается на событии KeyPress - PullRequest
0 голосов
/ 01 октября 2018

Я разрабатываю небольшую игру Super Mario в Visual Studio.Я сделал 2 снимка, первый из которых стоит Марио (png, не двигается), а второй - бегущий Марио (gif, 3 кадра).Проблема в том, что, когда я продолжаю нажимать на кнопку «Вправо», 3 кадра внутри GIF обрабатываются только один раз, а затем перестают двигаться.

Private Sub Level1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
  Select Case e.KeyCode
    Case Keys.Right
      picBoxMario.Image = My.Resources.mario_running_right
  End Select
End Sub

Private Sub Level1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
  picBoxMario.Image = My.Resources.mario_standing_2
End Sub

1 Ответ

0 голосов
/ 01 октября 2018

Вставьте логический чек.Так что, если Mario уже запущен, вы не сможете запустить его снова:).
В противном случае ваш PictureBox будет продолжать показывать только первый кадр, потому что вы продолжаете показывать одну и ту же анимацию снова и снова.

(я полагаю, Level1 - это Form и KeyPreview = True)

Как отметил Ганс Пассант в комментариях, это (более чем) хорошая идея назначить эти Image Ресурсы для объектов классов, которые можно затем .Dispose(), когда они больше не нужны.

ОБНОВЛЕНИЕ: на основе комментариев сравнение на равенство с использованием объекта класса позволяет еще больше упростить проверку состояния анимации..

Private MarioRunning As Image = My.Resources.mario_running_right
Private MarioStanding As Image = My.Resources.mario_standing_2

Private Sub Level1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    picBoxMario.Image = MarioStanding
End Sub

Private Sub Level1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    Select Case e.KeyCode
        Case Keys.Right
            If picBoxMario.Image.Equals(MarioRunning) Then Return
            picBoxMario.Image = MarioRunning
    End Select
End Sub

Private Sub Level1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
    picBoxMario.Image = MarioStanding
End Sub

Вы можете использовать события FormClosing() или FormClosed() вашего Form для утилизации изображений.

Private Sub Level1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
    If MarioRunning IsNot Nothing Then MarioRunning.Dispose()
    If MarioStanding IsNot Nothing Then MarioStanding.Dispose()
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...