大至急返答お願いします。
学校の自由実験で、VB2008でもぐらたたきを作っているのですが、以下のソースでデバッグし、ゲームを開始するボタンを押すとすると変なバグが表示されます。
Private Sub PictureBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Static Hit As Integer 'もぐらを叩いた時
Me.Controls.Remove(sender) 'もぐらが消える
Hit += 1 'Hitが1加算される
Point = 0 + Hit 'Pointは 0+ Hit で表わされる
Label5.Text = Format(Point, "000")
End Sub
Private Sub Timer4_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer4.Tick
Dim X, Y As Integer '座標指定
Dim mole1 As System.Windows.Forms.PictureBox '表示されるモグラ
For Each mole1 In Me.Controls
mole1.Tag -= 1 'もぐらの出現している時間のカウント
If mole1.Tag < 0 Then
Me.Controls.Remove(mole1) 'カウントが0になったらもぐらが消える
End If
Next
If Rnd() * 4 < 1 Then
mole1 = New System.Windows.Forms.PictureBox '1/4の確率でもぐらを表示
mole1.Size = New Size(100, 100) 'もぐらのサイズは100*100
X = Rnd() * (Me.ClientSize.Width - 100)
Y = Rnd() * (Me.ClientSize.Height - 100)
mole1.Location = New Point(X, Y) 'もぐらはX,Yの場所に表示される
mole1.Image = My.Resources.Mole
mole1.Tag = Int(Rnd() * 9) + 7 'もぐらの停滞している時間のカウント
AddHandler mole1.Click, AddressOf PictureBox_Click
Me.Controls.Add(mole1)
End If
End Sub
もぐらを表示させるためのTimerのソースはこれなのですが、デバッグしてゲームスタートボタンを押すと
InvalidCastExceptionはハンドルされませんでした。
型 'System.Windows.Forms.Label' のオブジェクトを型 'System.Windows.Forms.PictureBox' にキャストできません。
という意味深な文章が表示されてしまいます。
まだ初心者なので、よく分からないことが結構あります。
自己解決しようと努力してきましたが結局できず、終了期間間際になってしまいました。
是非御返答の程よろしくお願いします。
ソースをさらっと静的レビューしただけですが……
> For Each mole1 In Me.Controls
この行はMe.Controlsなので画面のコントロールすべてを対象に処理しちゃってますよね、PictureBoxだけでなくLabelに対しても。それなのにそのlabelをPictureBox専用の入れ物であるmole1に入れようとしたら、そりゃエラーとなります。
なお、キャストというのは型変換(integerをlongにするなど)という意味です。そのことからどういうエラーメッセージか察しがつくでしょうか?
そもそも、動作テストをして確認したわけではないですが、Timer4_Tick内のForの扱い方とか、いろいろおかしい気がします……が、とりあえずいろいろがんばってみてください。
それと説教くさくてすみませんが「どこで、だれが、なにを、どうした?」を常に考えるようにしましょう。質問文では、どこの行でエラーが起きているか(どこで?)が抜けています。デバッガーが表示しているはずから。