- 締切済み
VB6.0でアニメーション
現在VB6.0で簡単なアニメーションの作成を行おうと思っています。 あまりプログラミングが得意ではないので、分かる人教えてください。 一応自分なりに以下の様なプログラムを書いてみました。 やりたいことは、4枚の画像を使って、その画像をパラパラ漫画の様に アニメーションにしたいです。 処理方法としては、コマンドをクリックすると、タイマーが動きだして 画像がパラパラと変化するような感じにしたくて、以下の様にしました。 このプログラムだと、はじめの画像の次に最後の画像(anime3)が出てきてしまいます。 はじめの画像の次にanime0→anime1→anime2…と画面に表示されるようにするためにはどのようにしたらいいですか? 分かる人がいたら教えて頂きたいです。 よろしくお願い致します。 ●プログラムソース Private Nekos(3) As IPictureDisp Private Sub Command1_Click() Timer1 = True End Sub Private Sub Form_Load() Timer1 = False End Sub Private Sub Timer1_Timer() Dim anime As Long anime = 0 For anime = 0 To 3 Set Nekos(anime) = LoadPicture("F:\yobi_0406\glad\neko" & anime & ".bmp") Image1.Picture = Nekos(anime) anime = (anime + 1) If anime > 3 Then anime = 0 End If Next anime End Sub
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
せっかくタイマーを利用しているのに、1度目のタイマーイベント内でループが高速に行われ、マッハ的なサブリミナルでパラパラアニメが完了しているようです。 ************************************************************ 「タイマー自体がループ」という認識を持ったらよいかと思います。 ************************************************************ Option Explicit Private Const DEF_絵のパス As String = "F:\yobi_0406\glad\" Private Sub Command1_Click() Timer1 = True End Sub Private Sub Form_Load() Timer1 = False Timer1.Interval = 500 Timer1.Tag = 0 End Sub Private Sub Timer1_Timer() Dim img As IPictureDisp Dim picIndex As Integer picIndex = CInt(Timer1.Tag) Image1.Picture = LoadPicture(DEF_絵のパス & "neko" & picIndex & ".bmp") picIndex = picIndex + 1 If picIndex > 3 Then picIndex = 0 End If Timer1.Tag = picIndex End Sub ついでに、パラパラでは無いけど、参考URL http://okwave.jp/qa/q167464.html
- uruz
- ベストアンサー率49% (417/840)
一回のタイマイベント内でanime0~anime3をImage1にセットしています、タイマイベントを脱けるまではImage1の表示は更新されませんのでタイマイベントを脱けた時に最後にセットしたanime3が表示されることになります Private Nekos(3) As IPictureDisp Private TCount as long Private Sub Command1_Click() Timer1 = True End Sub Private Sub Form_Load() Dim i as long for i=0 to 3 Set Nekos(i) = LoadPicture("F:\yobi_0406\glad\neko" & cstr(i) & ".bmp") next i Timer1 = False End Sub Private Sub Timer1_Timer() Image1.Picture = Nekos(TCount) TCount = (TCount + 1) mod 4 End Sub ----------------------------------------- Private Nekos(3) As IPictureDisp なぜ"IPictureDisp"を使用するのでしょうか? VB6には"Picture"オブジェクトが用意されています Private Nekos(3) As Picture でいいのでは?
お礼
実は、あまり、IPictureDispとPictureの使い分けの仕方がわかっていません。すみません。。。 また、プログラムのソースの訂正あいがとうございました! 本当に助かりました。おかげで、かなり助かりました!!! 本当にありがとうございました~。
- uruz
- ベストアンサー率49% (417/840)
一回のタイマイベント内でanime0~anime3をImage1にセットしています、タイマイベントを脱けるまではImage1の表示は更新されませんのでタイマイベントを脱けた時に最後にセットしたanime3が表示されることになります Private Nekos(3) As IPictureDisp Private TCount as long Private Sub Command1_Click() Timer1 = True End Sub Private Sub Form_Load() Dim i as long for i=0 to 3 Set Nekos(i) = LoadPicture("F:\yobi_0406\glad\neko" & cstr(i) & ".bmp") next i Timer1 = False End Sub Private Sub Timer1_Timer() Image1.Picture = Nekos(TCount) TCount = (TCount + 1) mod 4 End Sub ----------------------------------------- Private Nekos(3) As IPictureDisp なぜ"IPictureDisp"を使用するのでしょうか? VB6には"Picture"オブジェクトが用意されています Private Nekos(3) As Picture でいいのでは?
- magicalpass
- ベストアンサー率58% (378/648)
VB6.0は良く知りませんが、Timer1_Timer()の中で 変数animeを0~3までループしているので、一瞬の間にanime0からanime3までを表示してるので、見た目にはanime0の次にanime3が表示されているように見えているのだと思います。 Timer1_Timer()の中で 変数animeを0~3までループしてはいけません。この関数の起動毎に1枚ずつ順番に表示するように作らないといけません。とりあえず、変数animeをスタティックな変数にして、関数が呼ばれる度に更新するようにすれば良いと思います。
お礼
アドバイス、ありがとうございました。
お礼
1050YENさんのようなプログラムソースの書き方もあるのだと 思いました。アドバイスありがとうございましたー!!! 参考URL見てみます! いろいろとアドバイスをありがとうございました!