如何在VB6中平滑地动画这个角色

时间:2011-09-19 00:42:32

标签: animation vb6

好的,所以我有这个角色,我希望它顺利移动。我有它的步行动画由6个精灵驱动,这就是动画现在的运作方式:

首先,我有一个KeyDown子:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

...

Select Case KeyCode

    Case vbKeyLeft: 'move left
        MoveLeft Character, Speed

    Case vbKeyRight: 'move right
        MoveRight Character, Speed

    Case vbKeyUp: 'jump
        Jump Character

    Case vbKeyDown:
        Duck Character

End Select

...

End Sub

当按下向右或向左箭头键时,选择然后触发MoveLeft / MoveRight功能。

Public Function MoveRight(Character As Image, Speed As Integer)
SaveSetting "MLP", "Game", "direction", "right"
Character.Left = Character.Left + Speed
    Select Case GetSetting("MLP", "Game", "right_animation", 0)
        Case 0:
            Character.Picture = LoadPicture(App.Path & "\images\characters\" & GetSetting("MLP", "Game", "pony", "twilight") & "\sprite_27.gif")
            SaveSetting "MLP", "Game", "right_animation", 1
        Case 1:
            Character.Picture = LoadPicture(App.Path & "\images\characters\" & GetSetting("MLP", "Game", "pony", "twilight") & "\sprite_28.gif")
            SaveSetting "MLP", "Game", "right_animation", 2
        Case 2:
            Character.Picture = LoadPicture(App.Path & "\images\characters\" & GetSetting("MLP", "Game", "pony", "twilight") & "\sprite_29.gif")
            SaveSetting "MLP", "Game", "right_animation", 3
        Case 3:
            Character.Picture = LoadPicture(App.Path & "\images\characters\" & GetSetting("MLP", "Game", "pony", "twilight") & "\sprite_30.gif")
            SaveSetting "MLP", "Game", "right_animation", 4
        Case 4:
            Character.Picture = LoadPicture(App.Path & "\images\characters\" & GetSetting("MLP", "Game", "pony", "twilight") & "\sprite_31.gif")
            SaveSetting "MLP", "Game", "right_animation", 5
        Case 5:
            Character.Picture = LoadPicture(App.Path & "\images\characters\" & GetSetting("MLP", "Game", "pony", "twilight") & "\sprite_32.gif")
            SaveSetting "MLP", "Game", "right_animation", 0
    End Select
End Function

只有一个功能,因为两者都是相同的。现在,我想在这里添加100MS的延迟。我找到了暂停功能:

Public Function Pause(Milliseconds As Single)
Dim T As Single, t2 As Single
T = GetTickCount(): t2 = GetTickCount()
Do Until t2 - T >= Milliseconds
    t2 = GetTickCount(): Sleep 1: DoEvents
Loop
End Function

这个暂停功能效果很好,但出于某些原因不适用于这种情况。我已经尝试在Form_KeyDown Select中触发函数之前暂停,我在每张图片更改之前尝试过,我在每张图片更改后都尝试过,我在MoveRight / MoveLeft中选择之前尝试过,但它们都没有动画,就像角色只是滑动而没有精灵变化/动画。可能是什么问题,我该如何解决这个问题?

如果你想知道它没有Pause的作用,就像我在这里发布的代码一样,它动画但很快,你可以注意到精灵的变化,它看起来很动画,但它不顺畅,它会快速前进。

2 个答案:

答案 0 :(得分:2)

看起来你的每秒帧数由key_down被触发的速率或键盘重复速度/速率和延迟提供动力。您可以使用一些我不知道的VB代码来调整应用程序中的延迟(但您可以搜索我相信)。

但如果我这样做,我将使用“游戏循环”。对于简单的解决方案,您需要:

  • 计时器组件及其Tick事件,设置为33ms间隔,充当游戏循环
  • moveleft的全局布尔标志,moveright。
  • global int milliseconds_elasped。
  • keydown和keyup函数用于设置和清除moveleft和moveright标记。

在keydown函数中,专门设置/清除moveleft或moveright标志。

在timer_tick()Sub中,检查moveleft的标志,如果已设置,则通过x = x + speed * timer.interval.为字符设置动画,同时让角色对象知道已经通过了多少毫秒的时间,以便显示正确的框架本身。对于模拟做类似的事。

计时器将以rate.interval(FPS)的速率刷新动画;而角色动画独立于FPS,因为它使用milliseconds_elpased来确定它应该在哪个帧。

答案 1 :(得分:0)

我最后也是最成功的解决方案是Jake和我的组合。

首先,我使用了Jake的Timer概念,其次,我没有使用图像,而是使用了Wmode设置为透明的闪存图像。而不是循环浏览图像,我会循环通过1帧SWF文件,这些文件渲染得更漂亮,更闪烁!这是对新Select Case的一种尝试:

Select Case CurrentState
        Case 0:
            Character.LoadMovie 0, App.Path & "\swf\twilight\walk_1.swf"
            CurrentState = 1
        Case 1:
            Character.LoadMovie 0, App.Path & "\swf\twilight\walk_2.swf"
            CurrentState = 2
        Case 2:
            Character.LoadMovie 0, App.Path & "\swf\twilight\walk_3.swf"
            CurrentState = 3
        Case 3:
            Character.LoadMovie 0, App.Path & "\swf\twilight\walk_4.swf"
            CurrentState = 4
        Case 4:
            Character.LoadMovie 0, App.Path & "\swf\twilight\walk_5.swf"
            CurrentState = 5
        Case 5:
            Character.LoadMovie 0, App.Path & "\swf\twilight\walk_6.swf"
            CurrentState = 0
End Select

另外,如果您注意到,我不再使用Save / GetSetting和全局公共变量来提高效率,这是Deanna建议的。谢谢大家,我们都在帮助实现这个答案。