【问题标题】:How to smoothly animate this character in VB6如何在VB6中平滑地动画这个角色
【发布时间】:2011-09-19 00:42:32
【问题描述】:

好的,所以我有了这个角色,我希望它能够顺利移动。我有它的行走动画,由 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

Select 然后在按下右或左箭头键时触发 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

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

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中的Select之前尝试过,但它们都不会产生动画,就像角色只是在没有精灵变化/动画的情况下滑动一样。可能是什么问题,我该如何解决?

如果您想知道它在没有 Pause 的情况下会做什么,就像我在此处发布的代码一样,它有动画但非常快,您会注意到精灵的变化,它看起来有动画但不流畅,它的速度非常快。

【问题讨论】:

  • 你真的需要使用注册表(GetSetting/SaveSetting)来存储当前的精灵吗?哦,你想加载和缓存图像。
  • @Deanna 如何在 VB6 中缓存图像?
  • 创建一个StdPicture 对象数组,并将每个对象分配给数组的一个成员。 ` RedIm Sprites(5) For Index = 0 To 5 Set Sprites(Index) = LoadPicture(App.Path & "\images\charactersmages\characters\twilight\sprite_" & cstr(27 + Index) & ".gif") Next `
  • 我不完全理解你为 stdPicture 创建一个数组是什么意思。
  • 这就是为什么我给出了一个代码示例(但所以把它搞砸了)。网上有很多VB6中使用数组的例子。您可能想复习基本的编程结构。

标签: animation vb6


【解决方案1】:

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

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

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

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

在timer_tick() Sub中,检查moveleft的标志,如果设置了,则通过x = x + speed * timer.interval.对角色进行动画处理,同时让角色对象知道经过了多少毫秒_elpased,以便正确显示框架本身。对 moveright 执行类似操作。

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

【讨论】:

  • 请阅读我的回答以及我将许多建议合并成一个超级想法。
【解决方案2】:

我的最终也是最成功的解决方案是 Jake 和我的结合。

首先,我使用了 Jake 的 Timer 想法,其次,我没有使用图像,而是使用了 Wmode 设置为透明的 Flash 图像。我不会循环浏览图像,而是循环浏览 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 建议的。谢谢大家,我们都在实现这个答案的过程中提供了帮助。

【讨论】:

    猜你喜欢
    • 2017-10-09
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多