画像の周囲に残像が残る

解決


たまご  2009-11-03 19:03:38  No: 142731

ボールをころがすアニメを作ってみたのですが
ころがるボールの周囲に残像らしきものがうずを蒔くように
みえてしまいます。
3つのPictureBoxのサイズは同じにしているのですが、
何が問題なのでしょうか?

 Dim flag As Boolean

    Dim x, y As Integer
   

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim g As Graphics
        g = PictureBox1.CreateGraphics()
        If PictureBox1.Left > 0 Then
            PictureBox1.Left = PictureBox1.Left - 8
        End If
        flag = Not flag
        If flag = True Then
            g.DrawImage(PictureBox2.Image, x, y, PictureBox1.Width, PictureBox1.Height)
        Else
            g.DrawImage(PictureBox3.Image, x, y, PictureBox1.Width, PictureBox1.Height)

        End If
    End Sub


聖帝  2009-11-03 22:37:06  No: 142732

CreateGraphicsはDisposeとかメンドクサイ感じ。
これってシステム変更で改善されてますかね^^;
PictureBoxを3個使うのは何故?
あと、VBのグラッフィックス処理は遅いんで高速移動は残像がでますね。
ゲームセンター並みの高速処理を実現できれば綺麗にグラフィックスが移動します。
C++を推奨します。


たまご  2009-11-04 04:48:03  No: 142733

>PictureBoxを3個使うのは何故?
フォームに2つの画像を埋め込んで、それを交互にPictureBox1に描画させてます。
ボウリングの玉ですが、45度に回転させたときに位置がズレるようです
そのために、2つの画像がピッタリ合わずに、残像のようなうずがでるようです。
なぜ、回転したときに位置がズレるのでしょうね。


聖帝  2009-11-05 04:53:36  No: 142734

ボーリングでしたか^^;
全部コードを」書いたら?
僕ならペイントイベントの中で処理します。
Disposeとか面倒くさいですから。


通りすがり  2009-11-05 08:04:39  No: 142735

回答つかないのは、自作自演にしか見えないから。

何、以心伝心で会話してるのかさっぱり分かりません。


聖帝  2009-11-06 05:14:16  No: 142736

別人でしゅよ^^;
ボーリングなら2日で造れますね。
今度、暇なときに、ボク流のつくりかたを教えますが。
ボクの得意分野はゲームです。


とりあえず  2009-11-06 19:39:38  No: 142737

>2つの画像がピッタリ合わずに、残像のようなうずがでるようです。
>なぜ、回転したときに位置がズレるのでしょうね。

たとえば、90度の位置に直線を描けばまっすぐに描画されますが、
45度の角度だとどうなりますか?  ギザギザの線になりませんか?

座標位置に  5,5 はあっても、2.5,2.5 のような座標位置は設定できませんよね。
45度に回転させて表示した場合、整数で表せない位置に移動する座標のドットが正しく表示されないからです。


たまご  2009-11-07 03:21:38  No: 142738

稚拙なボウリングゲームのコードです。
2つのレーンがあり、2人で対戦することもできます。
また、自分の写真を読み込むことやピンが倒れたときの
カキーンという効果音やストライクのときには歓声を挿入しました。

  Dim x, y As Integer
    Dim flag As Boolean = True
    Dim kekka As Integer'結果パターン1(倒れたピンと立っているピンの数)
    Dim kekka2 As Integer’
    Dim kekka3 As Integer
    Dim kekka4 As Integer
    Dim kekka5 As Integer
    Dim kekka6 As Integer
    Dim kekka7 As Integer
    Dim kekka8 As Integer
    Dim kekka9 As Integer
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Label15.Text = ""

    End Sub
’ストライクがでたらミュージックが流れる
    Public Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Integer, ByVal hwndCallback As Integer) As Integer
    Dim SoundFileName As String

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        Dim g As Graphics
        g = PictureBox1.CreateGraphics()
        If PictureBox1.Left > 0 Then
            PictureBox1.Left = PictureBox1.Left - 8

        End If

’玉をころがす
        flag = Not flag
        If flag = True Then
            g.DrawImage(PBa.Image, x, y, PictureBox1.Width, PictureBox1.Height)
        Else
            g.DrawImage(PBb.Image, x, y, PictureBox1.Width, PictureBox1.Height)

        End If

        Randomize()

        kekka4 = Int(6 * Rnd() + 1)
        If PictureBox1.Left < 320 Then
            PictureBox1.Left = PictureBox1.Left - 5
            Select Case kekka
                Case 0
                    PB10.Visible = False '立っているピンの画像(PB○)
                    PB10a.Visible = True '倒れているピンの画像(PB○a)
                    PB9.Visible = False
                    PB9a.Visible = True
                    PB8.Visible = False
                    PB8a.Visible = True
                Case 1
                    PB7.Visible = False
                    PB7a.Visible = True
                    PB6.Visible = False
                    PB6a.Visible = True
                    PB5.Visible = False
                    PB5a.Visible = True
                    PB4.Visible = False
                    PB4a.Visible = True
                Case 2
                    PB3.Visible = False
                    PB3a.Visible = True
                    PB3.Visible = False
                    PB2a.Visible = True
                    PB2.Visible = False
                    PB1a.Visible = True
                    PB1.Visible = False

            End Select

            SoundFileName = """metal.wav"""

            mciSendString("Play " & SoundFileName, vbNull, 0, 0)

        End If

        If PictureBox1.Left <= 320 Then
            PictureBox1.Left = PictureBox1.Left - 5

            Select Case kekka
                Case 0
                    PB10.Visible = False
                    PB10a.Visible = True

                Case 1
                    PB9.Visible = False
                    PB9a.Visible = True

                Case 2
                    PB8.Visible = False
                    PB8a.Visible = True
                Case 3
                    PB10.Visible = False
                    PB10a.Visible = True
                    PB9.Visible = False
                    PB9a.Visible = True
                    PB8.Visible = False
                    PB8a.Visible = True

            End Select
            SoundFileName = """metal.wav"""

            mciSendString("Play " & SoundFileName, vbNull, 0, 0)

        End If
        kekka2 = Int(10 * Rnd() + 1)

        If PictureBox1.Left <= 240 Then
            PictureBox1.Left = PictureBox1.Left - 5

            Select Case kekka2
                Case 0
                    PB5.Visible = False
                    PB5a.Visible = True

                Case 1
                    PB6.Visible = False
                    PB6a.Visible = True

                Case 2
                    PB7.Visible = False
                    PB7a.Visible = True
                Case 3

                    PB5.Visible = False
                    PB5a.Visible = True
                    PB6.Visible = False
                    PB6a.Visible = True
                    PB7.Visible = False
                    PB7a.Visible = True

            End Select
            SoundFileName = """metal.wav"""

            mciSendString("Play " & SoundFileName, vbNull, 0, 0)

        End If

        If PictureBox1.Left <= 160 Then
            PictureBox1.Left = PictureBox1.Left - 5
            kekka3 = Int(8 * Rnd() + 1)
            Select Case kekka3
                Case 0
                    PB1.Visible = False
                    PB1a.Visible = True

                Case 1
                    PB2.Visible = False
                    PB2a.Visible = True

                Case 2
                    PB3.Visible = False
                    PB3a.Visible = True
                Case 3
                    PB1.Visible = False
                    PB1a.Visible = True
                    PB2.Visible = False
                    PB2a.Visible = True
                    PB3.Visible = False
                    PB3a.Visible = True
                    PB4.Visible = False
                    PB4a.Visible = True
            End Select
            SoundFileName = """metal.wav"""

            mciSendString("Play " & SoundFileName, vbNull, 0, 0)

        End If
        If PictureBox1.Left <= 20 Then
            PictureBox1.Left = 20
            flag = False
            Timer1.Enabled = False
        End If
        If PB10a.Visible And PB9a.Visible And PB8a.Visible And PB7a.Visible And PB6a.Visible And PB5a.Visible _
                And PB4a.Visible And PB3a.Visible And PB2a.Visible And PB1a.Visible = True Then
            SoundFileName = """app.wav"""

            mciSendString("Play " & SoundFileName, vbNull, 0, 0)
            PictureBox6.Visible = True
        End If

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Button6.Visible = False
        Button7.Visible = False

        Timer1.Enabled = True

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        PictureBox6.Visible = False
        TextBox1.Text = ""
        TextBox23.Text = ""

        If PictureBox1.Left <= 20 Then
            PictureBox1.Left = 688
        End If

        PB1.Visible = True
        PB2.Visible = True
        PB3.Visible = True
        PB4.Visible = True
        PB5.Visible = True
        PB6.Visible = True
        PB7.Visible = True
        PB8.Visible = True
        PB9.Visible = True
        PB10.Visible = True
        PB1a.Visible = False

        PB2a.Visible = False

        PB3a.Visible = False

        PB4a.Visible = False

        PB5a.Visible = False

        PB6a.Visible = False

        PB7a.Visible = False

        PB8a.Visible = False

        PB9a.Visible = False

        PB10a.Visible = False

        Label15.Text = Label15.Text & TextBox16.Text & vbLf
        TextBox16.Text = Nothing

    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        Dim g As Graphics
        g = PictureBox3.CreateGraphics()
        If PictureBox3.Left > 0 Then
            PictureBox3.Left = PictureBox3.Left - 8

        End If

        flag = Not flag
        If flag = True Then
            g.DrawImage(PBa.Image, x, y, PictureBox1.Width, PictureBox1.Height)
        Else
            g.DrawImage(PBb.Image, x, y, PictureBox1.Width, PictureBox1.Height)

        End If

        Randomize()

        kekka5 = Int(7 * Rnd() + 1)
        If PictureBox3.Left < 288 Then
            PictureBox3.Left = PictureBox3.Left - 5

            Select Case kekka5
                Case 0
                    PBz10.Visible = False
                    PBz10a.Visible = True

                    PBz8.Visible = False
                    PBz8a.Visible = True
                Case 1
                    PBz7.Visible = False
                    PBz7a.Visible = True
                    PBz6.Visible = False
                    PBz6a.Visible = True

                    PBz4.Visible = False
                    PBz4a.Visible = True
                Case 2
                    PBz3.Visible = False
                    PBz3a.Visible = True
                    PBz3.Visible = False
                    PBz2a.Visible = True
                    PBz2.Visible = False

            End Select
            SoundFileName = """metal.wav"""

            mciSendString("Play " & SoundFileName, vbNull, 0, 0)

        End If
        kekka6 = Int(6 * Rnd() + 1)
        If PictureBox3.Left < 288 Then
            PictureBox3.Left = PictureBox3.Left - 5
            Select Case kekka6
                Case 0
                    PBz10.Visible = False
                    PBz10a.Visible = True

                Case 1

                    PBz9.Visible = False
                    PBz9a.Visible = True
                    PBz10.Visible = False
                    PBz10a.Visible = True
                Case 2

                    PBz8.Visible = False
                    PBz8a.Visible = True
            End Select
            SoundFileName = """metal.wav"""

            mciSendString("Play " & SoundFileName, vbNull, 0, 0)

        End If
        kekka7 = Int(6 * Rnd() + 1)
        If PictureBox3.Left <= 208 Then
            PictureBox3.Left = PictureBox3.Left - 5

            Select Case kekka7
                Case 0
                    PBz7.Visible = False
                    PBz7a.Visible = True

                Case 1
                    PBz6.Visible = False
                    PBz6a.Visible = True

                Case 2

                    PBz5.Visible = False
                    PBz5a.Visible = True

            End Select
            SoundFileName = """metal.wav"""

            mciSendString("Play " & SoundFileName, vbNull, 0, 0)

        End If
        kekka8 = Int(6 * Rnd() + 1)

        If PictureBox3.Left <= 240 Then
            PictureBox3.Left = PictureBox3.Left - 8

            Select Case kekka8
                Case 0

                    PBz3.Visible = False
                    PBz3a.Visible = True
                Case 1
                    PBz2.Visible = False
                    PBz2a.Visible = True
                    PBz1.Visible = False
                    PBz1a.Visible = True

                Case 2
                    PBz3.Visible = False
                    PBz3a.Visible = True
                Case 3

                    PBz2.Visible = False
                    PBz2a.Visible = True
                    PBz3.Visible = False
                    PBz3a.Visible = True
                    PBz4.Visible = False
                    PBz4a.Visible = True

            End Select
            SoundFileName = """metal.wav"""

            mciSendString("Play " & SoundFileName, vbNull, 0, 0)

        End If

        If PictureBox3.Left <= 168 Then
            PictureBox3.Left = PictureBox3.Left - 8
            kekka9 = Int(8 * Rnd() + 1)
            Select Case kekka9
                Case 0
                    PBz1.Visible = False
                    PBz1a.Visible = True

                    PBz3.Visible = False
                    PBz3a.Visible = True
                Case 1
                    PBz2.Visible = False
                    PBz1.Visible = False
                    PBz1a.Visible = True
                    PBz2a.Visible = True

                Case 2
                    PBz3.Visible = False
                    PBz3a.Visible = True
                    PBz1.Visible = False
                    PBz1a.Visible = True
                Case 3
                    PBz1.Visible = False
                    PBz1a.Visible = True
                    PBz2.Visible = False
                    PBz2a.Visible = True
                    PBz3.Visible = False
                    PBz3a.Visible = True

            End Select
            SoundFileName = """metal.wav"""

            mciSendString("Play " & SoundFileName, vbNull, 0, 0)

        End If
        If PictureBox3.Left <= 20 Then
            PictureBox3.Left = 20
            flag = False
            Timer2.Enabled = False
        End If
        If PBz10a.Visible And PBz9a.Visible And PBz8a.Visible And PBz7a.Visible And PBz6a.Visible And PBz5a.Visible _
        And PBz4a.Visible And PBz3a.Visible And PBz2a.Visible And PBz1a.Visible = True Then
            SoundFileName = """app.wav"""

            mciSendString("Play " & SoundFileName, vbNull, 0, 0)
            PictureBox7.Visible = True

        End If

    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Timer2.Enabled = True
        Button6.Visible = False
        Button7.Visible = False
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        PictureBox7.Visible = False
        TextBox1.Text = ""
        TextBox24.Text = ""

        If PictureBox3.Left <= 20 Then
            PictureBox3.Left = 688
        End If

        PBz1.Visible = True
        PBz2.Visible = True
        PBz3.Visible = True
        PBz4.Visible = True
        PBz5.Visible = True
        PBz6.Visible = True
        PBz7.Visible = True
        PBz8.Visible = True
        PBz9.Visible = True
        PBz10.Visible = True
        PBz1a.Visible = False

        PBz2a.Visible = False

        PBz3a.Visible = False

        PBz4a.Visible = False

        PBz5a.Visible = False

        PBz6a.Visible = False

        PBz7a.Visible = False

        PBz8a.Visible = False

        PBz9a.Visible = False

        PBz10a.Visible = False

    End Sub
    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        Label15.Text = Nothing
    End Sub

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
        If OpenFileDialog1.ShowDialog() = DialogResult.Cancel Then
            Exit Sub
        End If
        PictureBox2.Image = Image.FromFile(OpenFileDialog1.FileName)
        

    End Sub 

    Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
        If OpenFileDialog2.ShowDialog() = DialogResult.Cancel Then
            Exit Sub
        End If
        PictureBox4.Image = Image.FromFile(OpenFileDialog2.FileName)
    End Sub

End Class


たまご  2009-11-07 04:36:59  No: 142739

書き忘れてました
聖帝さん、ぜひアドバイスお願いします


たまご  2009-11-07 04:53:20  No: 142740

昨日と今日、計4時間くらいで作りました
荒削りですが、いろいろご指摘してください。


聖帝  2009-11-07 06:12:39  No: 142741

う〜む。
検証ができないんでアレですけど。
1_VBのバージョンは2008ですか?
2_Disposeを使用してますか?
3_pictureBoxを沢山使う必要がありますか?
4_あと、えっと、ボールの軌道である三角関数が見当たりませんが
、全て直線でしょうか?
5_ボーリングのレーンはバックグラウンドイメージで入ってるんですか?

ぼくなら、pictureBox1だけ使用してpaintイベントハンドラの中で処理します。

動いてるんなら、良し。とゆうボク流の理論もありますが、パソが故障する可能性が否定できません。

で、魔界先生のアドバイスのほうが説得力があるので、
期待しましょう。<マテ、^^;
では。

ああ忘れてた、トリアエズさん>ギザギザを目立たなくする方法がありますよ。


たまご  2009-11-07 06:24:13  No: 142742

1_VBのバージョンは2008ですか?
実は2003のときに作ったことがあるのです。
それをちょこっと改良したものです
2_Disposeを使用してますか?
してません。
3_pictureBoxを沢山使う必要がありますか?
ピンが10本×2ですから、それに転がる玉が2こ
4_あと、えっと、ボールの軌道である三角関数が見当たりませんが
、全て直線でしょうか?

すべて直線です。
同じ軌道でも、倒れる本数をランダムに発生させるようにしました。
5_ボーリングのレーンはバックグラウンドイメージで入ってるんですか?

レーンはありません。
ストライクがでたときに効果音と一緒にガッツポーズの男の子の画像が
突然出現するようにしました。


聖帝  2009-11-07 07:56:56  No: 142743

うむぅ。
VB2008の無料版しか知らないんでアレですけど。
市販されている製品並みのを作りたいのかなぁ〜って思ってました。^^;

で、やはり、1枚のピクチャ-ボックスで処理できるように頑張りましょう。
沢山の本を買うといいですよ(経験上)
e.で。


たまご  2009-11-07 20:42:45  No: 142744

>やはり、1枚のピクチャ-ボックスで処理できるように頑張りましょう 
完成はしておりませんが、
いちおうピンの描画、倒れたときの描画処理はこんな感じでよいのでしょうか?
非効率的かつ無駄な処理が含まれていたらご教授ください。

Dim g As Graphics
    Dim bmp As Bitmap
    Dim img As Image
    Dim img2 As Image
    

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        g = Graphics.FromImage(PictureBox1.Image)
        g.FillRectangle(New SolidBrush(Color.Yellow), 30, 30, 25, 60) '3本のピンを消す
        g.FillRectangle(New SolidBrush(Color.Yellow), 70, 80, 25, 60)
        g.FillRectangle(New SolidBrush(Color.Yellow), 110, 90, 25, 60)

        img2 = Image.FromFile("c:\xpin1a.gif") '倒れたピンの画像を描画
        g.DrawImage(img2, 0, 60, 60, 25)
        g.DrawImage(img2, 50, 100, 60, 25)
        g.DrawImage(img2, 90, 120, 60, 25)

        g.Dispose()
        PictureBox1.Refresh()
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.BackColor = Color.Yellow '背景色
        bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        PictureBox1.Image = bmp
    End Sub

    

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

       
        g = Graphics.FromImage(PictureBox1.Image)
        img = Image.FromFile("c:\pin5.gif") '立っているピンの画像
        
        '10本のピンを描画
        g.DrawImage(img, 30, 30, 25, 60)
        g.DrawImage(img, 70, 80, 25, 60)
        g.DrawImage(img, 110, 90, 25, 60)
        g.DrawImage(img, 150, 120, 25, 60)
        g.DrawImage(img, 30, 90, 25, 60)
        g.DrawImage(img, 70, 130, 25, 60)

        g.DrawImage(img, 30, 150, 25, 60)
        g.DrawImage(img, 70, 180, 25, 60)
        g.DrawImage(img, 110, 150, 25, 60)

        g.DrawImage(img, 30, 210, 25, 60)
        img.Dispose()
        g.Dispose()
        PictureBox1.Refresh()

    End Sub
End Class


聖帝  2009-11-08 03:12:16  No: 142745

配列とか、リソースとか
基本的な事を覚えたほうが良いと思います。
例えば
2^8=?

2*2*2*2*2*2*2*2=?
のように式が長くなりますよね。
2^100=?なら?さらに差がつきます。
コードの入力も時間がかかります。
もっとコードを短くできます。
多分、5分の1とか10分の1くらいに。
基礎工事は大事ですので。
では。


聖帝  2009-11-08 04:36:50  No: 142746

配列についての質問とかしてみては?
ボーリングって2投目があるわけだし、
ピンが倒れているか、一時的に保存もしなきゃいけないし。

pin(0)=trueとかの情報も必要ですよね。
スペアとかありますし。

配列を回避してVBを前進しても、かなり苦労しますよ。
koreは、ホントの話です。


たまご  2009-11-08 18:38:43  No: 142747

配列勉強してみます。
ところで聖帝さんがこれまでに作られたゲームを披露してくれたら
有り難いです。
楽しみに待ってます。


たまご  2009-11-08 19:15:01  No: 142748

言い忘れてましたが、ボウリングゲームは、最低2つのPictureBoxコントロールが必要だと思うのですが(転がる玉とピン)

もし1つのPictureBoxコントロールですべての処理ができるのなら
驚きです。私の悪い頭では想像できません。
文章でいいですので、処理の仕方を羅列していただけますか?


聖帝  2009-11-08 21:46:37  No: 142749

1つのpictureBoxで処理できます。
しかし、まず、たまごさんは配列を勉強しなければなりません。
配列は、すべてのコンピューター言語で共通の重要項目です。
配列が理解できないと、ボーリングゲームは作成不可能です。
ピンの10本分の状態を配列に入れなければなりません。
1投目の結果を確保しなけば....

Pin(0)=0:Pin(1)=1:Pin(2)=0:Pin(3)=1
あるいは
Pin(0)=false:Pin(1)=ture:Pin(2)=false
とかです。


たまご  2009-11-09 22:33:41  No: 142750

配列を勉強する前に玉をころがす動きを実装してますが、玉がピンを通過するときに玉の輪郭に四角い黄色の枠が見えてしまいます。(うまく透過できない)

また、玉がころがるときに玉の後方に半円形の玉の残像が見えてしまいます。(残像が残る)
とりあえずこの2点から解決していきたいと思うのですが
アドバイスお願いします

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.BackColor = Color.Yellow '背景色
        bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        PictureBox1.Image = bmp
        

        Me.DoubleBuffered = True’ダブルバッファリングしましたが効果なし

      
    End Sub

   Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        
        frg = Not frg
        x -= 8
      
        PictureBox1.Refresh()

    End Sub
   Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Dim g As Graphics = e.Graphics
        g = Graphics.FromImage(PictureBox1.Image)
        img = Image.FromFile("\pin5.gif")

        g.DrawImage(img, 30, 30, 25, 60)
        g.DrawImage(img, 70, 80, 25, 60)
        g.DrawImage(img, 110, 90, 25, 60)
        g.DrawImage(img, 150, 120, 25, 60)
        g.DrawImage(img, 30, 90, 25, 60)
        g.DrawImage(img, 70, 130, 25, 60)

        g.DrawImage(img, 30, 150, 25, 60)
        g.DrawImage(img, 70, 180, 25, 60)
        g.DrawImage(img, 110, 150, 25, 60)

        g.DrawImage(img, 30, 210, 25, 60)
        g3 = e.Graphics
        g3 = Graphics.FromImage(PictureBox1.Image)
        imgx = Image.FromFile("\1tama.gif")’オレンジ色の玉(左上方から右下に白い影あり)
        imgx2 = Image.FromFile("\x2tama.gif")’オレンジ色の玉(右上方から左下に白い影あり)

        If frg = True Then
            g3.FillRectangle(New SolidBrush(Color.Yellow), x, 155, 30, 30)
            g3.DrawImage(imgx, x, 155, 30, 30)

        Else
            g3.FillRectangle(New SolidBrush(Color.Yellow), x, 155, 30, 30)
            g3.DrawImage(imgx2, x, 155, 30, 30)

        End If


たまご  2009-11-10 03:59:18  No: 142751

透過の問題は解決しました。

しかし、残像が残る部分はダメです。VBの限界でしょうか?

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.BackColor = Color.Yellow '背景色
        bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        PictureBox1.Image = bmp
        

        Me.DoubleBuffered = True’ダブルバッファリングしましたが効果なし

      
    End Sub

   Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        
        frg = Not frg
        x -= 8
      
        PictureBox1.Refresh()

    End Sub
   Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Dim g As Graphics = e.Graphics
        g = Graphics.FromImage(PictureBox1.Image)
        img = Image.FromFile("\pin5.gif")

        g.DrawImage(img, 30, 30, 25, 60)
        g.DrawImage(img, 70, 80, 25, 60)
        g.DrawImage(img, 110, 90, 25, 60)
        g.DrawImage(img, 150, 120, 25, 60)
        g.DrawImage(img, 30, 90, 25, 60)
        g.DrawImage(img, 70, 130, 25, 60)

        g.DrawImage(img, 30, 150, 25, 60)
        g.DrawImage(img, 70, 180, 25, 60)
        g.DrawImage(img, 110, 150, 25, 60)

        g.DrawImage(img, 30, 210, 25, 60)
        g3 = e.Graphics
        g3 = Graphics.FromImage(PictureBox1.Image)
        imgx = Image.FromFile("\1tama.gif")’オレンジ色の玉(左上方から右下に白い影あり)
        imgx2 = Image.FromFile("\x2tama.gif")’オレンジ色の玉(右上方から左下に白い影あり)

        If frg = True Then
            
            g3.DrawImage(imgx, x, 155, 30, 30)

        Else
           
            g3.DrawImage(imgx2, x, 155, 30, 30)


たまご  2009-11-10 04:05:12  No: 142752

これが修正したコードです。
x−=1にすると  玉の残像は消えます。
ダブルバッファリングの手法は間違えているのでしょうか?

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.BackColor = Color.Yellow '背景色
        bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        PictureBox1.Image = bmp
        

        Me.DoubleBuffered = True

      
    End Sub
 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        
        frg = Not frg
        x -= 10
      
        PictureBox1.Refresh()

    End Sub
Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Dim g As Graphics = e.Graphics
        g = Graphics.FromImage(PictureBox1.Image)
        img = Image.FromFile("\pin5.gif")

        g.DrawImage(img, 30, 30, 25, 60)
        g.DrawImage(img, 70, 80, 25, 60)
        g.DrawImage(img, 110, 90, 25, 60)
        g.DrawImage(img, 150, 120, 25, 60)
        g.DrawImage(img, 30, 90, 25, 60)
        g.DrawImage(img, 70, 130, 25, 60)

        g.DrawImage(img, 30, 150, 25, 60)
        g.DrawImage(img, 70, 180, 25, 60)
        g.DrawImage(img, 110, 150, 25, 60)

        g.DrawImage(img, 30, 210, 25, 60)
      
        imgx = Image.FromFile("\1tama.gif")
        imgx2 = Image.FromFile("\x2tama.gif")

        If frg = True Then
            
            g.DrawImage(imgx, x, 155, 30, 30)

        Else
            
            g.DrawImage(imgx2, x, 155, 30, 30)

        End If


たまご  2009-11-10 04:18:30  No: 142753

これでなんとか残像は見えなくなりました。
ただ、玉とピンが重なったときに玉の輪郭が黄色くなってしまうのが
気にはなりますが

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.BackColor = Color.Yellow '背景色
        bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        PictureBox1.Image = bmp
        

        Me.DoubleBuffered = True

      
    End Sub

   

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        
        frg = Not frg
        x -= 5
      
        PictureBox1.Invalidate()

    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Timer1.Start()

    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Dim g As Graphics = e.Graphics
        g = Graphics.FromImage(PictureBox1.Image)
        img = Image.FromFile("\pin5.gif")

        g.DrawImage(img, 30, 30, 25, 60)
        g.DrawImage(img, 70, 80, 25, 60)
        g.DrawImage(img, 110, 90, 25, 60)
        g.DrawImage(img, 150, 120, 25, 60)
        g.DrawImage(img, 30, 90, 25, 60)
        g.DrawImage(img, 70, 130, 25, 60)

        g.DrawImage(img, 30, 150, 25, 60)
        g.DrawImage(img, 70, 180, 25, 60)
        g.DrawImage(img, 110, 150, 25, 60)

        g.DrawImage(img, 30, 210, 25, 60)
      
        imgx = Image.FromFile("\1tama.gif")
        imgx2 = Image.FromFile("\x2tama.gif")

        If frg = True Then
            g.FillEllipse(New SolidBrush(Color.Yellow), x, 155, 35, 35)
            g.DrawImage(imgx, x, 155, 30, 30)

        Else
            g.FillEllipse(New SolidBrush(Color.Yellow), x, 155, 35, 35)
            g.DrawImage(imgx2, x, 155, 30, 30)

        End If


たまご  2009-11-10 04:50:31  No: 142754

ちらつきも何とか解決できました。
今度は配列<List (of データ型)>の勉強をしたいと思います

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.BackColor = Color.Yellow '背景色
       

      
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim bmp As Bitmap = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        Dim g As Graphics = Graphics.FromImage(bmp)

        img = Image.FromFile("\pin5.gif")

        g.DrawImage(img, 30, 30, 25, 60)
        g.DrawImage(img, 70, 80, 25, 60)
        g.DrawImage(img, 110, 90, 25, 60)
        g.DrawImage(img, 150, 120, 25, 60)
        g.DrawImage(img, 30, 90, 25, 60)
        g.DrawImage(img, 70, 130, 25, 60)

        g.DrawImage(img, 30, 150, 25, 60)
        g.DrawImage(img, 70, 180, 25, 60)
        g.DrawImage(img, 110, 150, 25, 60)

        g.DrawImage(img, 30, 210, 25, 60)

        imgx = Image.FromFile("\1tama.gif")
        imgx2 = Image.FromFile("\x2tama.gif")
        frg = Not frg
        x -= 10
        If frg = True Then

            g.DrawImage(imgx, x, 155, 30, 30)

        Else

            g.DrawImage(imgx2, x, 155, 30, 30)

        End If
       

        PictureBox1.Image = bmp
        g.Dispose()

    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Timer1.Start()

    End Sub


聖帝  2009-11-10 05:53:30  No: 142755

ほんとに動いてるんですか?
ピンの配列が1つも書いてないですが。
例えば
最初のピンの配列は
for i as integer=0 to 9
pin(i)=true
next
こうゆうのが配列です。
で、ピンが倒れた後ですけど
pin(0)=falseとかpin(5)=false
とか2投目に備えてピンのdataを配列に格納する必要があります。
ツッコミ2

それとスコアは、どうなってるんですか?
8+8+ストライク+スペア+ガーターとか
なんにもない。
ボーリングですか?
すいません。では。


たまご  2009-11-10 17:52:53  No: 142756

説明不足でしたが、これはとりあえず玉が転がっていく
アニメーションのテストのみで、当初は残像が残る不具合があったのですが
なんとかクリアできました。

で、これから配列を使った本格的なゲーム作りに着手します。
また、行き詰まったらご教授賜りたく思います。


聖帝  2009-11-11 07:44:51  No: 142757

前に教えたジャン。
配列。
pictureBoxを200個も使うの?
このプログラムはPictureBoxは1個だよ。
'_______________________________
Option Strict On
'VisualBasic2008無料版
'必要なもん
'PictureBox1,Button1,Timer1
'をフォームに入れる
Public Class Form1
    Private hosi_suu As Integer = 200
    Private hosi_x(hosi_suu - 1) As Integer
    Private hosi_y(hosi_suu - 1) As Integer
    Private hosi_size(hosi_suu - 1) As Integer
    Private hosi_speed(hosi_suu - 1) As Integer
    Private hosi_left_right(hosi_suu - 1) As Integer
    Private myRandom As Random

    Public Sub New()

        ' この呼び出しは、Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        With Me
            .BackColor = Color.Brown
            .Size = New Size(500, 700)
            .StartPosition = FormStartPosition.CenterScreen
        End With
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        With PictureBox1
            .BackColor = Color.Black
            .Size = New Size(450, 600)
            .Location = New Point(20, 50)
        End With
        Button1.Location = New Point(210, 20)
        Button1.Text = "Start"
        myRandom = New Random()
        Dim i As Integer
        For i = 0 To hosi_suu - 1
            hosi_size(i) = myRandom.Next(5, 30)
            hosi_x(i) = myRandom.Next(20, 480)
            hosi_y(i) = myRandom.Next(20, 500)
            hosi_speed(i) = myRandom.Next(1, 5)
            hosi_left_right(i) = myRandom.Next(-2, 2)
        Next
    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Dim g As Graphics = e.Graphics
        Dim i As Integer
        For i = 0 To hosi_suu - 1
            Dim my_font As New Font("ms gothic", hosi_size(i))
            g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
            g.DrawString("★", my_font, Brushes.Yellow, hosi_x(i), hosi_y(i))
        Next
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Interval = 1
        Timer1.Start()
        Button1.Enabled = False
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        For i As Integer = 0 To hosi_suu - 1
            hosi_y(i) += hosi_speed(i)
            hosi_x(i) += hosi_left_right(i)
            If hosi_y(i) > 600 Or hosi_x(i) < 0 Or hosi_x(i) > 500 Then
                hosi_y(i) = 0
                hosi_x(i) = myRandom.Next(20, 480)
                hosi_left_right(i) = myRandom.Next(-5, 5)
            End If
            PictureBox1.Invalidate()
        Next
    End Sub
End Class


たまご  2009-11-11 21:46:20  No: 142758

う、うつくし〜
思わず見入ってしまいましたよ。

参考にさせてもらいます。
ありがとね。


聖帝  2009-11-12 03:48:24  No: 142759

聖帝はゲームとか作らないの>と書いてあるね。
アイデアは何千個でもでてきますよ。
例えば
このプログラムをさらにUPします。
200個の星を30個程度に減らし、描画されている間にレーザービームを
回発射させる、そして別の星の動きをするやつを3個作る。
こいつは、誘導追跡ミサイルを1発発射できるようにする。
3秒でミサイルは消滅させる。
自分の戦闘機を入れる。
星やレーザーあるいはミサイルに接触すると自機が1個減るようにする。
戦闘機もレーザーを発射できるようにする。
星に当たれば30点スコアUP、1秒生存で1点加算。
ミニ、シューティングゲームの出来上がり。
{2}
星を文字の配列にして、4字熟語アテゲームを作成する。
問題は200問くらいですかねぇ・・^^;
はい、国語の教材ゲームが出来ました。アハハ。
データベースはイランですよ。
いくらでもゲームは作れます。
わはは。


聖帝  2009-11-12 04:33:58  No: 142760

ほら、改造してくと、ゲームらしくなってきますよね。
1番簡単なタイプの配列しか使用してません。
Option Strict On
'VisualBasic2008無料版
'必要なもん
'PictureBox1,Button1,Timer1
'をフォームに入れる
Public Class Form1
    Private hosi_suu As Integer = 200
    Private hosi_x(hosi_suu - 1) As Integer
    Private hosi_y(hosi_suu - 1) As Integer
    Private hosi_size(hosi_suu - 1) As Integer
    Private hosi_speed(hosi_suu - 1) As Integer
    Private hosi_left_right(hosi_suu - 1) As Integer
    Private hosi_moji(hosi_suu - 1) As Integer
    Private myRandom As Random

    Const moji_suu As Integer = 4
    Private moji(moji_suu - 1) As String

    Public Sub New()

        ' この呼び出しは、Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        With Me
            .BackColor = Color.Brown
            .Size = New Size(500, 700)
            .StartPosition = FormStartPosition.CenterScreen
        End With
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        With PictureBox1
            .BackColor = Color.Black
            .Size = New Size(450, 600)
            .Location = New Point(20, 50)
        End With
        Button1.Location = New Point(210, 20)
        Button1.Text = "Start"
        myRandom = New Random()
        Dim i As Integer
        For i = 0 To hosi_suu - 1
            hosi_size(i) = myRandom.Next(5, 30)
            hosi_x(i) = myRandom.Next(20, 480)
            hosi_y(i) = myRandom.Next(20, 500)
            hosi_speed(i) = myRandom.Next(1, 5)
            hosi_left_right(i) = myRandom.Next(-2, 2)
            hosi_moji(i) = myRandom.Next(4)
        Next

        moji(0) = "一" : moji(1) = "石" : moji(2) = "二" : moji(3) = "鳥"
    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Dim g As Graphics = e.Graphics
        g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
        Dim i, d As Integer
        For i = 0 To hosi_suu - 1
            Dim my_font As New Font("ms gothic", hosi_size(i))
            d = hosi_moji(i)
            g.DrawString(moji(d), my_font, Brushes.Yellow, hosi_x(i), hosi_y(i))
        Next
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Interval = 1
        Timer1.Start()
        Button1.Enabled = False
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        For i As Integer = 0 To hosi_suu - 1
            hosi_y(i) += hosi_speed(i)
            hosi_x(i) += hosi_left_right(i)
            If hosi_y(i) > 600 Or hosi_x(i) < 0 Or hosi_x(i) > 500 Then
                hosi_y(i) = 0
                hosi_x(i) = myRandom.Next(20, 480)
                hosi_left_right(i) = myRandom.Next(-5, 5)
            End If
            PictureBox1.Invalidate()
        Next
    End Sub
End Class


たまご  2009-11-12 18:23:13  No: 142761

聖帝さん、素晴らしいですね。
ゲームサイトなんか立ち上げてはいかがですか
ゲーム作りで苦労している人たちにはとても参考になると思います。
ぜひご検討ください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加