【问题标题】:Gif animation is stopping on KeyPress eventGif 动画在 KeyPress 事件上停止
【发布时间】:2018-10-05 01:44:36
【问题描述】:

我正在 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

【问题讨论】:

  • 当你按住一个键时,它会重复,通常每秒触发两次。然后,您的代码会一遍又一遍地替换图像,从而破坏动画效果。这也是使程序崩溃的好方法,您需要调用 Dispose() 来再次销毁这些图像。 stackoverflow.com/questions/27749541/…

标签: vb.net winforms gif


【解决方案1】:

插入布尔检查。所以,如果马里奥已经在运行,你不要让它再次运行 :)。
否则,您的 PictureBox 将继续只显示第一帧,因为您一直在不断地为其提供相同的动画。

(我假设Level1FormKeyPreview = True

正如 Hans Passant 在 cmets 中指出的那样,将这些 Image 资源分配给类对象是一个好主意,然后您可以在不再需要时使用 .Dispose()

更新:基于 cmets,使用类对象进行相等比较,可以进一步简化动画状态检查。

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

您可以使用FormFormClosing()FormClosed() 事件来处理图像。

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

【讨论】:

  • 值得注意的是,如果他正确处理图像,那么他就不再需要布尔值了。对 Image 属性进行简单的比较就足够了。
  • 很多程序员都希望它能比较图像内容。但不,那是火箭科学。它只需要一个 cpu 周期,与布尔测试一样多。
猜你喜欢
  • 2018-07-17
  • 1970-01-01
  • 2014-12-02
  • 2014-04-23
  • 2010-10-21
  • 2021-09-22
  • 2015-03-26
  • 1970-01-01
相关资源
最近更新 更多