2011-09-19 14 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/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 

このポーズ機能は素晴らしいですが、この場合何らかの理由で機能しません。 Iveは、機能がForm_KeyDown Selectでトリガされる前に一時停止を試みました。各ピクチャが変更される前に試してみました。各ピクチャが変更された後に試しました。MoveRight/MoveLeftで選択する前に試しました。スプライトの変更やアニメーションを行わずに文字だけをスライドさせるようなアニメーションはありません。何が問題になる可能性があり、どうすればこの問題を解決できますか?

私がここに投稿したコードのように、何もしないのが不思議であれば、それは動くが、本当に速く、スプライトの変化に気づくことができ、アニメーションに見えるが滑らかではない。

+2

レジストリ( 'GetSetting' /' SaveSetting')を使って現在のスプライトを保存する必要がありますか?ああ、あなたはイメージをロードしてキャッシュしたいと思っています。 – Deanna

+0

@Deanna VB6でどのように画像をキャッシュすることができますか? – Qasim

+1

'StdPicture'オブジェクトの配列を作成し、それぞれを配列のメンバに割り当てます。 'RedIm Sprites(5) Index = 0 To 5 Sprites(Index)= LoadPicture(App.Path&" \ images \ charactersmages \ characters \ twilight \ sprite_ "&cstr(27 + Index)&"を設定します。 gif ") Next' – Deanna

答えて

0

私の最終的で最も成功した解決策は、Jakeと私の両方の組み合わせでした。

最初に、私はJake's Timerアイデアを使用しました。第2に、イメージを使用する代わりに、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 

:ここで新しいのSelect Caseの味があります。みんなありがとう、私たちは皆、この答えを達成する過程で助けてくれました。

2

あなたのフレームは、key_downが発生したレート、またはキーボードの繰り返し速度/レートと遅延によって動かされるようです。私の頭が分からないVBコードを使用することで、アプリケーションの遅延を調整することができます(しかし、あなたは私が信じる検索をすることができます)。

私がそれをやっていたら、私は "ゲームループ"を使います。単純な解決のためには、以下のものが必要です

  • Timerコンポーネントおよび33ms間隔に設定されたTickイベントは、moveleft、moveright用ゲームループ
  • グローバルブールフラグとして機能します。
  • グローバルintミリ秒超。
  • keidownおよびkeyup関数は、moveleftおよびmoverightフラグを設定およびクリアします。

keydown関数では、moveleftまたはmoverightフラグを排他的に設定/クリアします。 moveleftのフラグをチェックします(設定されている場合)。x = x + speed * timer.interval.でアニメーション化し、同時に、ミリ秒数が経過して正しいフレームが表示されることをキャラクタオブジェクトに知らせます。自体。 moverightの場合も同様です。

タイマーはrate timer.interval(FPS)でアニメーションをリフレッシュします。キャラクタはミリ秒単位でフレームを決定するためにミリ秒単位を使用するので、FPSの独立したものをアニメーション化します。

+0

私の答えと、私が提案した多くのアイデアをスーパーアイデアにまとめました。 – Qasim

関連する問題