• ベストアンサー

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

スタートボタンを押すと一個のボールが現れ、 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

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

> 当たった瞬間、その場で右往左往してしまいます。 質問と、ソースが違うではないの! であれば、こうでしょう。 > If x >= Picture1.Width OR x < = 0 Then >  s = -1 > Else >  s = 1 > End If If x >= Picture1.Width OR x <= 0 Then  s = s * -1 End If s と z は、グローバル変数にして、初期値を設定してね。

tatuken
質問者

お礼

a-kumaさんのご助言のおかげで、無事プログラムが完成したした。本当に助かりました。またどうぞよろしくお願いしますm(_ _)m

その他の回答 (3)

  • momoturbo
  • ベストアンサー率55% (49/88)
回答No.4

ソースの表示が少なかった用です。 グローバル変数のところと、dx,dyの初期化を載せてませんでした。 m(_ _)m Dim x%, y%, dx%, dy% Dim r&, c& 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 dx = 100 dy = dx End Sub '----------------------------------------- Private Sub Timer1_Timer() Picture1.FillColor = Picture1.BackColor Picture1.Circle (x, y), r, Picture1.BackColor x = x + dx If x < 0 Then x = 0 dx = 0 - dx End If If x > Picture1.Width Then x = Picture1.Width dx = 0 - dx End If y = y + dy If y < 0 Then y = 0 dy = 0 - dy End If If y > Picture1.Height Then y = Picture1.Height dy = 0 - dy End If Picture1.FillColor = vbRed Picture1.Circle (x, y), r, vbRed End Sub

tatuken
質問者

お礼

 何度も投稿していただいて、本当にお手数かけました。 無事にプログラムも完成できました。どうもありがとうございました。

  • momoturbo
  • ベストアンサー率55% (49/88)
回答No.2

Ifのところを見直してください。 If 条件式 Then 成立時の処理 Else 不成立時の処理 End if xが0より小さいのにPicture1.Widthより大きいのはおかしいでしょ とりあえずは、以下のように変更してください If x < 0 Then x = 0 dx = 0 - dx End If If x > Picture1.Width Then x = Picture1.Width dx = 0 - dx End If y = y + dy If y < 0 Then y = 0 dy = 0 - dy End If If y > Picture1.Height Then y = Picture1.Height dy = 0 - dy End If

tatuken
質問者

お礼

 間違いのひとつが解決されました。どうもありがとうございました。m(_ _)m

tatuken
質問者

補足

ご指摘いただいたところは修正しましたが、ボールが壁に 当たった瞬間、その場で右往左往してしまいます。様々な方法を試してみたんですが、どうも上手くいきません。。 理由は、たぶん、壁に当たった時に進行方向が反転するも のの、それがその後の動作に反映されていないからだと思 うのですが、どう直したらよいのか分かりません。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

> 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 "And" の使い方が間違っています。英語のようには使えません。 If x < 0 Then  x = 0  dx = 0 - dx ElseIf x > Picture1.Width Then  x = Picture1.Width  dx = 0 - dx End If y 方向も同様に直してね。

tatuken
質問者

お礼

 大変参考になりました。 どうもありがとうございました。m(_ _)m

tatuken
質問者

補足

ANDを使っていたところを直せば、他にはもう直すところ はないのでしょうか?

関連するQ&A

専門家に質問してみよう