ボールをころがすアニメを作ってみたのですが
ころがるボールの周囲に残像らしきものがうずを蒔くように
みえてしまいます。
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
CreateGraphicsはDisposeとかメンドクサイ感じ。
これってシステム変更で改善されてますかね^^;
PictureBoxを3個使うのは何故?
あと、VBのグラッフィックス処理は遅いんで高速移動は残像がでますね。
ゲームセンター並みの高速処理を実現できれば綺麗にグラフィックスが移動します。
C++を推奨します。
>PictureBoxを3個使うのは何故?
フォームに2つの画像を埋め込んで、それを交互にPictureBox1に描画させてます。
ボウリングの玉ですが、45度に回転させたときに位置がズレるようです
そのために、2つの画像がピッタリ合わずに、残像のようなうずがでるようです。
なぜ、回転したときに位置がズレるのでしょうね。
ボーリングでしたか^^;
全部コードを」書いたら?
僕ならペイントイベントの中で処理します。
Disposeとか面倒くさいですから。
回答つかないのは、自作自演にしか見えないから。
何、以心伝心で会話してるのかさっぱり分かりません。
別人でしゅよ^^;
ボーリングなら2日で造れますね。
今度、暇なときに、ボク流のつくりかたを教えますが。
ボクの得意分野はゲームです。
>2つの画像がピッタリ合わずに、残像のようなうずがでるようです。
>なぜ、回転したときに位置がズレるのでしょうね。
たとえば、90度の位置に直線を描けばまっすぐに描画されますが、
45度の角度だとどうなりますか? ギザギザの線になりませんか?
座標位置に 5,5 はあっても、2.5,2.5 のような座標位置は設定できませんよね。
45度に回転させて表示した場合、整数で表せない位置に移動する座標のドットが正しく表示されないからです。
稚拙なボウリングゲームのコードです。
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
書き忘れてました
聖帝さん、ぜひアドバイスお願いします
昨日と今日、計4時間くらいで作りました
荒削りですが、いろいろご指摘してください。
う〜む。
検証ができないんでアレですけど。
1_VBのバージョンは2008ですか?
2_Disposeを使用してますか?
3_pictureBoxを沢山使う必要がありますか?
4_あと、えっと、ボールの軌道である三角関数が見当たりませんが
、全て直線でしょうか?
5_ボーリングのレーンはバックグラウンドイメージで入ってるんですか?
ぼくなら、pictureBox1だけ使用してpaintイベントハンドラの中で処理します。
動いてるんなら、良し。とゆうボク流の理論もありますが、パソが故障する可能性が否定できません。
で、魔界先生のアドバイスのほうが説得力があるので、
期待しましょう。<マテ、^^;
では。
ああ忘れてた、トリアエズさん>ギザギザを目立たなくする方法がありますよ。
1_VBのバージョンは2008ですか?
実は2003のときに作ったことがあるのです。
それをちょこっと改良したものです
2_Disposeを使用してますか?
してません。
3_pictureBoxを沢山使う必要がありますか?
ピンが10本×2ですから、それに転がる玉が2こ
4_あと、えっと、ボールの軌道である三角関数が見当たりませんが
、全て直線でしょうか?
すべて直線です。
同じ軌道でも、倒れる本数をランダムに発生させるようにしました。
5_ボーリングのレーンはバックグラウンドイメージで入ってるんですか?
レーンはありません。
ストライクがでたときに効果音と一緒にガッツポーズの男の子の画像が
突然出現するようにしました。
うむぅ。
VB2008の無料版しか知らないんでアレですけど。
市販されている製品並みのを作りたいのかなぁ〜って思ってました。^^;
で、やはり、1枚のピクチャ-ボックスで処理できるように頑張りましょう。
沢山の本を買うといいですよ(経験上)
e.で。
>やはり、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
配列とか、リソースとか
基本的な事を覚えたほうが良いと思います。
例えば
2^8=?
を
2*2*2*2*2*2*2*2=?
のように式が長くなりますよね。
2^100=?なら?さらに差がつきます。
コードの入力も時間がかかります。
もっとコードを短くできます。
多分、5分の1とか10分の1くらいに。
基礎工事は大事ですので。
では。
配列についての質問とかしてみては?
ボーリングって2投目があるわけだし、
ピンが倒れているか、一時的に保存もしなきゃいけないし。
例
pin(0)=trueとかの情報も必要ですよね。
スペアとかありますし。
配列を回避してVBを前進しても、かなり苦労しますよ。
koreは、ホントの話です。
配列勉強してみます。
ところで聖帝さんがこれまでに作られたゲームを披露してくれたら
有り難いです。
楽しみに待ってます。
言い忘れてましたが、ボウリングゲームは、最低2つのPictureBoxコントロールが必要だと思うのですが(転がる玉とピン)
もし1つのPictureBoxコントロールですべての処理ができるのなら
驚きです。私の悪い頭では想像できません。
文章でいいですので、処理の仕方を羅列していただけますか?
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
とかです。
配列を勉強する前に玉をころがす動きを実装してますが、玉がピンを通過するときに玉の輪郭に四角い黄色の枠が見えてしまいます。(うまく透過できない)
また、玉がころがるときに玉の後方に半円形の玉の残像が見えてしまいます。(残像が残る)
とりあえずこの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
透過の問題は解決しました。
しかし、残像が残る部分はダメです。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)
これが修正したコードです。
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
これでなんとか残像は見えなくなりました。
ただ、玉とピンが重なったときに玉の輪郭が黄色くなってしまうのが
気にはなりますが
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
ちらつきも何とか解決できました。
今度は配列<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
ほんとに動いてるんですか?
ピンの配列が1つも書いてないですが。
例えば
最初のピンの配列は
for i as integer=0 to 9
pin(i)=true
next
こうゆうのが配列です。
で、ピンが倒れた後ですけど
pin(0)=falseとかpin(5)=false
とか2投目に備えてピンのdataを配列に格納する必要があります。
ツッコミ2
それとスコアは、どうなってるんですか?
8+8+ストライク+スペア+ガーターとか
なんにもない。
ボーリングですか?
すいません。では。
説明不足でしたが、これはとりあえず玉が転がっていく
アニメーションのテストのみで、当初は残像が残る不具合があったのですが
なんとかクリアできました。
で、これから配列を使った本格的なゲーム作りに着手します。
また、行き詰まったらご教授賜りたく思います。
前に教えたジャン。
配列。
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
う、うつくし〜
思わず見入ってしまいましたよ。
参考にさせてもらいます。
ありがとね。
聖帝はゲームとか作らないの>と書いてあるね。
アイデアは何千個でもでてきますよ。
例えば
このプログラムをさらにUPします。
200個の星を30個程度に減らし、描画されている間にレーザービームを
回発射させる、そして別の星の動きをするやつを3個作る。
こいつは、誘導追跡ミサイルを1発発射できるようにする。
3秒でミサイルは消滅させる。
自分の戦闘機を入れる。
星やレーザーあるいはミサイルに接触すると自機が1個減るようにする。
戦闘機もレーザーを発射できるようにする。
星に当たれば30点スコアUP、1秒生存で1点加算。
ミニ、シューティングゲームの出来上がり。
{2}
星を文字の配列にして、4字熟語アテゲームを作成する。
問題は200問くらいですかねぇ・・^^;
はい、国語の教材ゲームが出来ました。アハハ。
データベースはイランですよ。
いくらでもゲームは作れます。
わはは。
ほら、改造してくと、ゲームらしくなってきますよね。
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
聖帝さん、素晴らしいですね。
ゲームサイトなんか立ち上げてはいかがですか
ゲーム作りで苦労している人たちにはとても参考になると思います。
ぜひご検討ください。