Vb.net Gif动画在按键事件时停止

Vb.net Gif动画在按键事件时停止,vb.net,winforms,gif,Vb.net,Winforms,Gif,我正在Visual Studio中开发一个小型超级马里奥游戏。我拍了两张照片,第一张是马里奥站着(png,不动),第二张是马里奥跑步(gif,3帧)。问题是,当我一直按“右”键时,gif中的3帧只处理一次,然后停止移动 Private Sub Level1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown Select Case e.KeyCode Case Keys.Right picBoxM

我正在Visual Studio中开发一个小型超级马里奥游戏。我拍了两张照片,第一张是马里奥站着(png,不动),第二张是马里奥跑步(gif,3帧)。问题是,当我一直按“右”键时,gif中的3帧只处理一次,然后停止移动

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

插入布尔检查。因此,如果Mario已经在运行,您不会让它再次运行:)。
否则,您的
PictureBox
将只继续显示第一帧,因为您会不断地向它输入相同的动画。

(我假设
Level1
表单
KeyPreview=True

正如Hans Passant在评论中指出的那样,将那些
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()
FormClosing()
事件来处理图像。

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

当你按住一把钥匙时,它会重复,通常每秒发射两次。然后,代码会一次又一次地替换图像,破坏动画效果。这也是使程序崩溃的一个好方法,您需要一个Dispose()调用来再次销毁这些图像。值得注意的是,如果他正确处理图像,那么他就不再需要布尔值了。对图像属性进行简单的比较就足够了。许多程序员希望它能够比较图像内容。但不,那是火箭科学。它只需要一个cpu周期,就像布尔测试一样。