gpt4 book ai didi

animation - 如何在VB6中流畅地制作这个角色的动画

转载 作者:行者123 更新时间:2023-12-03 06:56:34 24 4
gpt4 key购买 nike

好的,我有了这个角色,我希望它能顺利移动。我的行走动画由 6 个 Sprite 驱动,这就是动画现在的运行方式:

首先,我有一个 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

只有其中一个功能,因为两者是相同的。现在,我想在这里添加 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中的Select之前尝试过,但它们都不会产生动画,就像角色只是滑动而没有 Sprite 变化/动画一样。可能是什么问题以及如何解决这个问题?

如果你想知道它在没有像我在这里发布的代码那样的暂停的情况下做了什么,它有动画,但速度非常快,你可以注意到 Sprite 的变化,它看起来有动画,但不平滑,它的速度很快。

最佳答案

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

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

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

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

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

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

关于animation - 如何在VB6中流畅地制作这个角色的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7465449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com