2011-09-19 3 views
3

좋아요,이 캐릭터가있어서 부드럽게 움직이기를 원합니다. 나는 6 개 스프라이트로 전원이 공급 될 애니메이션을 걷고 있고, 애니메이션이 지금 작동하는 방법이다 :VB6에서이 문자를 부드럽게 애니메이트하는 방법

첫째, 나는에서 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 /었던 MovieRight funcitons 때 트리거 그들은 오른쪽 또는 왼쪽 화살표 키를 누릅니다.

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에서 선택하기 전에 시도했습니다. 캐릭터가 마치 스프라이트 변경/애니메이션없이 슬라이드하는 것처럼 애니메이션을 만들지 않습니다. 무엇이 문제 일 수 있으며 어떻게 해결할 수 있습니까?

여기에 게시 된 코드와 같이 어떤 멈춤을하는지 궁금하다면, 실제로 빠르게 움직이면 스프라이트가 변경된 것을 볼 수 있지만 애니메이션처럼 보이지만 부드럽 지 않다면 빠르게 진행됩니다.

+2

현재 스프라이트를 저장하려면 레지스트리 ('GetSetting' /'SaveSetting')를 사용해야합니까? 오, 그리고 이미지를로드하고 캐시하고 싶습니다. – Deanna

+0

@Deanna VB6에서 어떻게 이미지를 캐시 할 수 있습니까? – Qasim

+1

'StdPicture' 객체의 배열을 만들고 각각을 배열의 멤버에 할당하십시오. 'RedIm Sprites (5) Index = 0 To 5 스프라이트 (색인) = LoadPicture (App.Path & "\ 이미지 \ 문자 이미지 \ 문자 \ 황혼의 \ sprite_"및 cstr (27 + 색인) & ")를 설정하십시오. gif ") Next' – Deanna

답변

0

제 마지막과 가장 성공적인 솔루션은 제이크와 제인의 조합이었습니다.

처음에는 Jake 's Timer 아이디어를 사용했고 두 번째로 이미지를 사용하는 대신 Wmode가 투명하게 설정된 플래시 이미지를 사용했습니다. 이미지를 순환하는 대신, 훨씬 아름답고 깜박임이없는 1 프레임 SWF 파일을 순환합니다.또한, 나는 더 이상 디아나에 의해 제안 된 효율성을 개선하기 위해 저장/GetSetting 및 글로벌 공용 변수를 사용하고 알 수없는 경우

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 

: 여기에 새로운 선택 케이스의 맛이다. 여러분 모두 감사합니다, 우리 모두는이 답변을 얻는 과정에서 도움을주었습니다.

2

초당 프레임이 key_down이 실행되는 속도 또는 키보드 반복 속도/속도 및 지연에 의해 작동되는 것처럼 보입니다. 내 머리를 모르겠다는 VB 코드를 사용하여 응용 프로그램의 지연을 조정할 수 있습니다 (하지만 내가 검색 할 수는 있습니다).

하지만 내가하고 있다면 "게임 루프"를 사용합니다. 단순한 솔루션, 다음이 필요합니다

  • 타이머 구성 요소와이 33ms 간격으로 설정된 틱 이벤트, moveleft,었던 MovieRight의 게임 루프
  • 글로벌 부울 플래그 역할을 할 수 있습니다.
  • global int milliseconds_elasped
  • keidown 및 keyup 함수는 moveleft 및 moveright 플래그를 설정하고 지우는 데 사용됩니다.

keydown 함수에서 moveleft 또는 moveright 플래그를 독점적으로 설정/해제하십시오.

timer_tick() Sub에서는 moveleft 플래그가 설정되어 있으면 문자를 x = x + speed * timer.interval.으로 움직이면서 동시에 캐릭터 개체에 얼마나 많은 밀리 초가 경과했는지 알려 주어 올바른 프레임을 표시하도록합니다. 그 자체. 맹비난과 비슷한 일을하십시오.

타이머는 rate timer.interval (FPS)에서 애니메이션을 새로 고칩니다. 캐릭터는 밀리 초 단위를 사용하여 프레임이 어느 프레임에 있어야 하는지를 결정할 때 FPS의 독립 체를 움직입니다.

+0

제 아이디어를 많은 아이디어를 통합하여 슈퍼 아이디어로 만들었습니다. – Qasim

관련 문제