• 締切済み

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

みんなの回答

回答No.4

せっかくタイマーを利用しているのに、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

l06071
質問者

お礼

1050YENさんのようなプログラムソースの書き方もあるのだと 思いました。アドバイスありがとうございましたー!!! 参考URL見てみます! いろいろとアドバイスをありがとうございました!

  • uruz
  • ベストアンサー率49% (417/840)
回答No.3

一回のタイマイベント内で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 でいいのでは?

l06071
質問者

お礼

実は、あまり、IPictureDispとPictureの使い分けの仕方がわかっていません。すみません。。。 また、プログラムのソースの訂正あいがとうございました! 本当に助かりました。おかげで、かなり助かりました!!! 本当にありがとうございました~。

  • uruz
  • ベストアンサー率49% (417/840)
回答No.2

一回のタイマイベント内で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 でいいのでは?

回答No.1

VB6.0は良く知りませんが、Timer1_Timer()の中で 変数animeを0~3までループしているので、一瞬の間にanime0からanime3までを表示してるので、見た目にはanime0の次にanime3が表示されているように見えているのだと思います。 Timer1_Timer()の中で 変数animeを0~3までループしてはいけません。この関数の起動毎に1枚ずつ順番に表示するように作らないといけません。とりあえず、変数animeをスタティックな変数にして、関数が呼ばれる度に更新するようにすれば良いと思います。

l06071
質問者

お礼

アドバイス、ありがとうございました。

関連するQ&A

  • 画像のランダム表示

    初心者なのですがVisual Studio6.0でもぐらたたきゲームを利用した作品を現在制作しています。内容は決まった画像がランダムでImageコントロールに表示され、それをクリックできると画像が変わり得点加算、クリックできないと画像が変わり減点というゲームです。現在Imageコントロールに決まった画像を呼び出す処理が完成しました。そして追加機能としてクリックできたらボーナスポイントの画像をImageコントロールに何分の何かの確率で表示させたいのですがわからない状態です。ちなみに画像は私のパソコンのDドライブから呼び出して表示させています。 どういった命令文を打ったら良いのかわかる方教えて下さい。宜しくお願いします。 こちらがプログラムです。 Option Explicit Const MinImgAry = 0 Const MaxImgAry = 15 Const GameTime = 15 Dim HitFlg As Integer Dim TEN As Integer Dim HoleNum As Integer Dim IconAry(2) As String Private Sub Command1_Click() Command1.Enabled = False Option1.Enabled = False Option2.Enabled = False Option3.Enabled = False HitFlg = 0 TEN = 0 Text1.Text = Str(TEN) Timer1.Enabled = True Timer2.Enabled = True End Sub Private Sub Command2_Click() Form1.Show End Sub Private Sub Form_Load() Dim StrPath As String StrPath = App.Path If Right(StrPath, 1) <> "\" Then StrPath = StrPath + "\" End If IconAry(0) = "D:制作\5\画像1.bmp" IconAry(1) = "D:制作\5\画像2.bmp" IconAry(2) = "D:制作\5\画像3.bmp" End Sub Private Sub Image1_Click(Index As Integer) Image1(Index).Enabled = False HitFlg = -1 End Sub Private Sub Option1_Click() Timer1.Interval = 1000 End Sub Private Sub Option2_Click() Timer1.Interval = 800 End Sub Private Sub Option3_Click() Timer1.Interval = 500 End Sub Private Sub Timer1_Timer() Static CtlFlg As Integer Select Case CtlFlg Case 0 Image1(HoleNum).Enabled = False Image1(HoleNum).Visible = False HoleNum = Int((MaxImgAry - _ MinImgAry + 1) * Rnd + MinImgAry) Image1(HoleNum).Picture = _ LoadPicture(IconAry(0)) CtlFlg = 1 Image1(HoleNum).Visible = True Image1(HoleNum).Enabled = True Exit Sub Case 1 Image1(HoleNum).Enabled = False If HitFlg Then HitFlg = 0 Image1(HoleNum).Picture = _ LoadPicture(IconAry(2)) TEN = TEN + 1 Text1.Text = Str(TEN) Else Image1(HoleNum).Picture = _ LoadPicture(IconAry(1)) TEN = TEN - 1 Text1.Text = Str(TEN) End If CtlFlg = 0 Exit Sub End Select End Sub Private Sub Timer2_Timer() Static TimeCnt As Long TimeCnt = TimeCnt + 1 If TimeCnt <> GameTime Then Exit Sub End If Timer1.Enabled = False Timer2.Enabled = False MsgBox "おしまい" TimeCnt = 0 Command1.Enabled = True Image1(HoleNum).Enabled = False Image1(HoleNum).Visible = False Option1.Enabled = True Option2.Enabled = True Option3.Enabled = True End Sub

  • VBでの質問です

    VBでの質問です 5分を計るタイマーを作っていて5分たつと止まるプログラムを作っていて、コンマ以下のケタが長くて、しかも止まらない( Label1.Text = n5.Subtract(Now).ToStringをLabel1.Text = n5.Subtract(Now).TotalMinutesにしてIf Label1.Text = "00:00:00" ThenをIf Label1.Text = "0" Thenにした時は止まりました)ので止まるようにするにはどこを変えればいいですか? 教えてください 以下コードです Public Class Form1 Dim n5 As DatePrivate Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load n5 = Now.AddMinutes(5) Timer1.Interval = 1000 Timer1.Start() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Label1.Text = n5.Subtract(Now).ToString If Label1.Text = "00:00:00" Then MsgBox("時間になりました。") Timer1.Stop() End If End Sub 長文ですいません

  • PictureBoxでのアニメーションのちらつき防止

    タイマーを使って,以下のような感じで PictureBox にCircleを動かす簡単なアニメーションを作成しているのですが,Timer.Interval=10で描画がかなりちらついてしまいます. この場合,ちらつきを無くすような方法はありませんでしょうか.よろしくお願いします. Private Sub Timer1_Timer() Picture1.Cls Picture1.Circle (x,y), 30, vbRed x = x + 1 y = y + 1 End Sub

  • vb6.0のプログラム

    今こんなプログラムを作っているのですがなぜか、足りない部分があると言われて困っております。 できれば教えてください。 図 ーーーーーーーーーーーーーーーー from ーーーーーーーーーーーーーーーー 残り30秒[ーーーーラベルーーーー] 000+000=000←(3つともlabel) □-------------------□←HScrollbar max100 min0 [コマンドボタン] [タイマー]←非表示 ーーーーーーーーーーーーーーーー コード Private intCount As Integer Private intSecond As Integer Private Sub cmdStart_Click() Dim intNum1 As Integer Dim intNum2 As Integer If cmdStart.Caption = "Start" Then intCount = 0 intSecond = 30 lblResult.Caption = "" cmdStart.Caption = "OK" tmrSecond.Enabled = True ElseIf cmdStart.Caption = "OK" Then If CInt(lblAnswer.Caption) = CInt(lblNum1.Caption) + CInt(lblNum2.Caption) Then lblResult.Caption = lblResult.Caption & "○" intCount = intCount + 1 Else lblResult.Caption = lblResult.Caption & "×" End If intNum1 = Rnd() * 50 intNum2 = Rnd() * 50 lblNum1.Caption = intNum1 lblNum2.Caption = intNum2 End If End Sub Private Sub hsbAnswer_Change() lblAnswer.Caption = hsbAnswer.Value End Sub Private Sub tmrSecond_Timer() intSecond = intSecond - 1 lblTime.Caption = "残り" & intSecond & "秒" If intSecond = 0 Then tmrSecond.Enabled = False MsgBox (intCount & "問正解") cmdStart.Caption = "Start" Else End If End Sub どうぞよろしくお願いします。

  • VB ストップウォッチ

    こんにちは☆ VBの勉強を始めたばかりなんですが… ソースをビルドできません↓↓ <ソースの一部> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Static Stwch Static Tm If Stwch = False Then Tm = Timer TextBox1.Text = "計測開始" Else TextBox1.Text = Timer - Tm & "秒経過" End If Stwch = Not Stwch End Sub >'Timer'は型です。有効な式ではありません。 とエラーが出ます。 知識がほとんどないのでソフトな解説をくださると 嬉しいです☆

  • VB6でスロットを作成したい

    VB6歴2ヶ月の初心者です。 フォーム上に ラベルコントロールが三つ コマンドボタンが二つ タイマーコントロールが一つ あります。 タイマーのプロパティは Enabled False Interval 10 です。 スロットを作成したいのですが、 ボタン1を一回押すごとに左からスロットが回り、 最後にボタン2で動きを止めたいのです。 一応自分でも書いてみたのですが、ここで行き詰まりました。 ウワァァァァァァヽ(`Д´)ノァァァァァァン! Private Sub Command1_Click() Timer1.Enabled = True End Sub Private Sub Command2_Click() Timer1.Enabled = False End Sub Private Sub Timer1_Timer() Dim slot As Integer slot = Int(Rnd(1) * 9 + 1) Label1.Caption = slot End Sub 思い通りに動かすにはどんなコードにしたらいいですか?

  • VB6 ドラッグ&ドロップ

    Image1をPicture1(正方形)にドラッグ&ドロップするプログラム を作りたいと思っています。 このプログラムだとImage1全体がドラッグされるのではなく、 Image1の絵はその位置に残ってImage1の外枠だけがドラッグされてしまいます。 外枠だけでなくImage1の絵も一緒にドラッグできるようにするにはどうすればいいのでしょうか? また、このプログラムだとドロップする場所(Picture1_)以外で ドロップしてしまった場合でも画面上からImage1の絵と外枠が消えてしまいます。 ドロップする場所(Picture1_)以外でドロップしてしまった場合は、 Image1全体を画面上に残しておきたいのですがどうすればいいのでしょうか? Option Explicit Dim dx As Single, dy As Single Private Sub Form_Load() Image1.Picture = LoadPicture(App.Path & "picture.jpg") Image1.Stretch = True End Sub Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single) Source.Move X - dx, Y - dy End Sub Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Image1.Drag 1 dx = X: dy = Y 'マウスダウン位置 End Sub Private Sub Picture1_DragDrop(Source As Control, X As Single, Y As Single) Source.Visible = False 'ドロップオブジェクトを非表示にする Picture1.BackColor = RGB(255, 255, 255) End Sub Private Sub Picture1_DragOver(Source As Control, X As Single, Y As Single, _ State As Integer) If State = 0 Then Picture1.BackColor = RGB(0, 0, 255) If State = 1 Then Picture1.BackColor = RGB(255, 255, 255) End Sub

  • Timer_Tickについて

    Timerイベントについてですが、Interval = 1 に設定し、例えば下記のようなプログラムを動かした場合、 /*-------------------------------------------*/ Private Sub Form_Load(~~)~~     Timer1.Start()     Original() '自作プロシージャ End Sub Private Sub Timer1_Tick(~~)~~     num += 1 'Publicで宣言してある     if num > 100 then Timer1.Stop() End Sub /*-------------------------------------------*/ Original()の処理に移るのは、numが100より大きくなってTimer1がStopしてからでしょうか? それとも、Timer1が動いている最中に、移ってるのでしょうか?

  • VB6.0 KeyDownイベントの対応

    VB6.0を使ってプログラム中ですが、下記の  Command10_KeyDown で、複合キー「 Ctrl + ↓」 だとイベント KeyDown を受信できるのですが、単純な キー「↓」だと、イベント KeyDown を受信でず、他のボタンにフォーカスが移ってしまいます。 Comman10_GotFocus に何か対応策を入れて、単純な キー「↓」のイベント KeyDown を受信する方法はないでしょうか? Private Sub Command10_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 40 Then execsub001() End If End Sub Private Sub Commnad10_Click() execsub001() End Sub Private Sub Comman10_GotFocus() 上記問題への対応策を此処に記述したい End If Private Sub execsub110() 内容は省略 End Sub

  • フォームを閉じないようにする VB6 SP6

    VB6 でプログラムを作成中です。 プログラムを実行して、フォームが立ち上がった所で右上の×を押し、画面を閉じようとします。 そこで以下のコードで、もし×が押されたらvbYesNoメッセージボックスを表示させ、もし「いいえ」が押されたらフォームを閉じないようにし、実行画面を維持したいのです。 しかし、Exit Sub ですとプログラムが終了してしまい、困っています。宜しくお願い致します。 Private Sub Form_Unload(Cancel As Integer) 'フォームを閉じる Dim last As String last = MsgBox(" プログラムを終了させますか?", vbYesNo, "終了確認1") If (last = vbYes) Then Dim last2 As String last2 = MsgBox(" 本当にプログラムを終了させますか?", vbYesNo, "終了確認2") If (last2 = vbNo) Then Exit Sub End If End If If (last = vbNo) Then Exit Sub End If End Sub

専門家に質問してみよう