• ベストアンサー

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

NATCHIの回答

  • ベストアンサー
  • NATCHI
  • ベストアンサー率43% (17/39)
回答No.1

Picture1のAutoRedrawがFalseになっていませんか? Trueにすると改善されると思うのですが(^^ それでもダメならAutoRedrawをTrueにして、下のようにしてみては。 Private Sub Timer1_Timer() Picture1.Visible = False Picture1.Cls Picture1.Circle (x, y), 30, vbRed Picture1.Visible = True x = x + 1 y = y + 1 End Sub

silverjet
質問者

お礼

たしかに「AutoRedrawをTrue」で改善されました. またDirectXでダブルバッファを使うことでも改善されました. ありがとうございました m(__)m

関連するQ&A

  • ボールが壁に当たって跳ね返るプログラムを・・

    スタートボタンを押すと一個のボールが現れ、 picture1の中を動き回り、壁に当たると跳ね返る、 スクリーンセイバーのようなプログラムを作って いるのですが「ボールが壁に当たって跳ね返る」 部分がどうしても上手くいきません。この部分を どなたか教えてください。お願いしますm(_ _)m (見やすいように線を引きました。最後の方が「跳ね返りの部分です。それ以外の部分は、文の長さ制限にひっかかるため省いてあるところがあります。) Private Sub Command1_Click() x = Int(Rnd * 3900) y = Int(Rnd * 3900) r = 100 c = vbRed Timer1.Enabled = True Timer1.Interval = 200 Picture1.Circle (x, y), r, vbRed End Sub ----------------------------------------- Private Sub Timer1_Timer() Picture1.FillColor = Picture1.BackColor Picture1.Circle (x, y), r, Picture1.BackColor dx = 100 dy = dx x = x + dx If x < 0 Then x = 0 And dx = 0 - dx If x > Picture1.Width Then x = Picture1.Width And dx = 0 - dx End If End If y = y + dy If y < 0 Then y = 0 And dy = 0 - dy If y > Picture1.Height Then y = Picture1.Height And dy = 0 - dy End If End If Picture1.FillColor = vbRed Picture1.Circle (x, y), r, vbRed End Sub

  • 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

  • VB PictureBoxの描画範囲

    VisualStudio2010のVBにて、ピクチャーボックスの範囲をプログラム中で大きくして描画をさせたいのですが、ピクチャーボックスのサイズを大きくしても、大きくした範囲には描画がされません。 やり方は↓の方法です。 まず、formにボタンとピクチャーボックスを300×200で配置して、 http://homepage1.nifty.com/rucio/main/dotnet/Samples/dnSampleKeepImage.htm ↑のページで書かれてた方法でグラフィックを再描画させています。 Public Class Form1 Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim g As Graphics = AutoGraphics(PictureBox1) PictureBox1.Width = 400 g.FillRectangle(Brushes.Black, 100, 100, 10, 10) '1つ目の図形 g.FillRectangle(Brushes.Black, 350, 100, 10, 10) '2つ目の図形 g.Dispose() End Sub Public Function AutoGraphics(ByVal picSource As PictureBox) As Graphics If picSource.Image Is Nothing Then picSource.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) End If Return Graphics.FromImage(picSource.Image) End Function End Class これを実行すると、1つ目の図形は描画されていますが、拡大した範囲にある2つ目の図形は描画されていません。 ピクチャーボックスの範囲を大きくした所にも描画をさせたいと思っています。 よろしくお願いします。

  • タイマーの使い方

    VB初心者です(6.0を使っています) タイマーの使い方がよく分かっていません。 ボタンを押してからの経過時間をラベルに表示させたいと思っているのですが、 ----------------------------------------------- Private Sub Command1_Click()   Timer1.Interval = 1000   処理1   処理2    ・    ・    ・   Timer1.Interval = 0 End Sub Private Sub Timer1_Timer()   Label1.Caption = [経過時間] End Sub ----------------------------------------------- という感じに書いていると、[処理1]~をしている間はラベルが表示されなくて、 最後の[処理]が終わった直後の[経過時間]のみが表示されます。 こういう形ではタイマーは使用できないのでしょうか? 他のWebサイトなども調べてみたのですが、解決できませんでした。 どなたか教えていただけませんでしょうか?

  • VB.NETのグラフィック描画で困っています

    VB.NETでのグラフィックの記述方法ですが 何かをクリックすると描画させるのではなく 単にあるsubプロシージャ内でグラフィックを描画させる記述する方法として pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) を教えていただきました。そこで private sub xy_keisan() '座標を計算させるプロシージャ disp_x() 'x座標に目盛りを表示させるプロシージャ disp_Y() 'xの目盛り数によってY座標の位置を変えて表示させるプロシージャ end sub private sub disp_x() pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) g.DrawLine(****** end sub private sub disp_y() pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) g.DrawLine(****** end sub のような記述(引数とか細かい所は端折っています)ですとdisp_yは描画されていますが,disp_xは消えてしまいます。 pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) が消えてしまう原因だとおもって宣言場所を変えてみましたが同じです 逆にこれが無いと描画させることが出来なくなります。 これの意味も今ひとつ判りません よろしくお願い致します

  • Paintpicture描画時のクリックイベント

    お知恵を貸してください! ただいま「ランダムな場所にImageを描画して、そのイメージをクリックするとイベントが起きる」という プログラムを組んでいます。 Paintpictureを使って、ランダムに描画することはできたのですが、 描画したイメージをクリックしてもイベントの動作を行ってくれません。 使用しているのはVB6.0です。 プログラムは以下のとおりです。 Imageは透過GIF(Image1)と保険にマスクイメージ(Image2)を使用しております。 ------- ・描画プログラム Private Sub Command1_Click() End End Sub Private Sub Timer1_Timer() x = Int(rnd * Form1.Width) - (Image1.Width \ 2) y = Int(rnd * Form1.Height) - (Image1.Height \ 2) Form1.Refresh Form1.PaintPicture Image2, x, y, , , , , , , vbSrcAnd Form1.PaintPicture Image1, x, y, , , , , , , vbSrcPaint End Sub ------- ・行動プログラム Private Sub Image1_Click() MsgBox "Score gat" End Sub ------- アドバイス、ご指摘お願いいたします。

  • 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 思い通りに動かすにはどんなコードにしたらいいですか?

  • VB.NETのグラフィック描画について

    グラフィック描画ですが、引数を持たないサブルーチンプロシージャ(固定的な 目盛り等)は、PictureBox_paint(***イベントプロシージャ内に記述すればグラフィック描画ができます(e.Graphicsでグラフィックスオブジェクトを取得できる為)が、 X、Y座標を引数としたサブルーチンプロシージャを作り、その中でLineDraw(*****で描画させたい場合サブルーチンプロシージャ内に dim g As Graphics=pictureBox1.CreateGraphics() でグラフィックオブジェクトを生成しても 描画できないのですがどのようにすれば解決できるでしょうか(イメージがわかり難いかもしれませんのでサンプルを書きました) よろしくお願いします (1)private sub pictureBox1_paint(Byval sender as Object, Byval e as system****** e.Graphics.DrawLine(****** (これは描画できる) End Sub (2)private sub zahyou() ' 座標を生成するサブルーチンプロシージャ dim i as integer for i=0 to 10 hyouji( i , i*5 ) End Sub private sub hyouji( x as integer, y as integer) ’直線を引くサブルーチンプロシージャ dim g As Graphics=pictureBox1.CreateGraphics() g.DrawLine(***,x,y**** (これは描画できない)

  • VB2008でPictureBoxをキーボードを使って動かしたい

    VBを始めたばかりの初心者です。 VB2008を使ってPictureBoxに取り込んだイラストをキーボードを使って自由に動かしたいと思っています。 今作ったものの問題点 1.現状、全く同時に→と↑のキーを押せば右上に動きます。  また、→キーを押してイラストが右に動いているときに、↑キーを押すと上に動きます。  これを右上に動くようにする方法が知りたいのです。 2.キーを押し続けてイラストを動かし続けようとすると、一回動いて止まってから動き続けるという風になってしまいます。  これを止まらずに動くようにしたいのです。 ちなみにこれ↓が今のソースコードです。 Public Class Form1 Private Sub form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyCode = Keys.Up Then PictureBox1.Top = PictureBox1.Top - 10 End If End Sub Private Sub form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyCode = Keys.Down Then PictureBox1.Top = PictureBox1.Top + 10 End If End Sub Private Sub form1_KeyLeft(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyCode = Keys.Left Then PictureBox1.Left = PictureBox1.Left - 10 End If End Sub Private Sub form1_KeyRight(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyCode = Keys.Right Then PictureBox1.Left = PictureBox1.Left + 10 End If End Sub End Class これ↑を実行する場合は、デザインにPictureBoxを表示してください。PictureBoxに入れるイラストは適当なものを入れてください。 よろしくお願いします。

  • Visual Basicがわかりません。

    Public Class Form1 Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint Dim GraphicsFun As System.Drawing.Graphics GraphicsFun = Me.CreateGraphics Dim PenColor As New System.Drawing.Pen _ (System.Drawing.Color.Black) GraphicsFun.DrawRectangle(PenColor, 30, 30, 450, 300) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Enabled = True End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If PictureBox1.Left < 480 - PictureBox1.Width And PictureBox1.Top + 31 Then PictureBox1.Left = PictureBox1.Left + 1 Else If PictureBox1.Top < 330 - PictureBox1.Height Then PictureBox1.Top = PictureBox1.Top + 1 Else If PictureBox1.Left > 30 Then PictureBox1.Left = PictureBox1.Left - 1 Else If PictureBox1.Top > 30 And PictureBox1.Left + 31 Then PictureBox1.Top = PictureBox1.Top - 1 End If End If End If End If End Sub End Class ピクチャーボックスを四角形の中で右周りに枠の中をボタンを押すと回るようにしたいんですけど、2回目の動作と3回目の動作がかぶってしまい、うまくいきません。4回目の解決策を教えてください。また、ボタン2を押すと反対周りにピクチャーボックスが回る、コマンドを 教えてください。