• ベストアンサー

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

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

  • うまくできない??NO3

    If Index = 1 Or 6 Or 11 Or 16 Or 21 Then If P1(1).BackColor = vbRed Then P1(1).BackColor = vbBlue Else P1(1).BackColor = vbRed End If If P1(6).BackColor = vbRed Then P1(6).BackColor = vbBlue Else P1(6).BackColor = vbRed End If If P1(11).BackColor = vbRed Then P1(11).BackColor = vbBlue Else P1(11).BackColor = vbRed End If If P1(16).BackColor = vbRed Then P1(16).BackColor = vbBlue Else P1(16).BackColor = vbRed End If If P1(21).BackColor = vbRed Then P1(21).BackColor = vbBlue Else P1(21).BackColor = vbRed End If '-------------------------------------------------------------------- ElseIf Index = 2 Or 7 Or 12 Or 17 Or 22 Then ~~~省略 ElseIf Index = 5 Or 10 Or 15 Or 20 Or 25 Then If P1(5).BackColor = vbRed Then P1(5).BackColor = vbBlue Else P1(5).BackColor = vbRed End If If P1(10).BackColor = vbRed Then P1(10).BackColor = vbBlue Else P1(10).BackColor = vbRed End If If P1(15).BackColor = vbRed Then P1(15).BackColor = vbBlue Else P1(15).BackColor = vbRed End If If P1(20).BackColor = vbRed Then P1(20).BackColor = vbBlue Else P1(20).BackColor = vbRed End If If P1(25).BackColor = vbRed Then P1(25).BackColor = vbBlue Else P1(25).BackColor = vbRed End If End If '--------------------------------------------------------------------- End Sub ※みにくくてすいません リンクを張るのは禁止らしいので・・・できないですね・・・ 関連URL:http://oshiete1.goo.ne.jp/kotaeru.php3?qid=418248 関連URL:http://oshiete1.goo.ne.jp/kotaeru.php3?qid=418250

  • うまくできない??NO2

    Private Sub P1_Click(Index As Integer) If Index = 1 Or 2 Or 3 Or 4 Or 5 Then If P1(1).BackColor = vbRed Then P1(1).BackColor = vbBlue Else P1(1).BackColor = vbRed End If If P1(2).BackColor = vbRed Then P1(2).BackColor = vbBlue Else P1(2).BackColor = vbRed End If If P1(3).BackColor = vbRed Then P1(3).BackColor = vbBlue Else P1(3).BackColor = vbRed End If If P1(4).BackColor = vbRed Then P1(4).BackColor = vbBlue Else P1(4).BackColor = vbRed End If If P1(5).BackColor = vbRed Then P1(5).BackColor = vbBlue Else P1(5).BackColor = vbRed End If '------------------------------------------------------------------- ElseIf Index = 6 Or 7 Or 8 Or 9 Or 10 Then ~~~~~ 省略 ElseIf Index = 21 Or 22 Or 23 Or 24 Or 25 Then If P1(21).BackColor = vbRed Then P1(21).BackColor = vbBlue Else P1(21).BackColor = vbRed End If If P1(22).BackColor = vbRed Then P1(22).BackColor = vbBlue Else P1(22).BackColor = vbRed End If If P1(23).BackColor = vbRed Then P1(23).BackColor = vbBlue Else P1(23).BackColor = vbRed End If If P1(24).BackColor = vbRed Then P1(24).BackColor = vbBlue Else P1(24).BackColor = vbRed End If If P1(25).BackColor = vbRed Then P1(25).BackColor = vbBlue Else P1(25).BackColor = vbRed End If End If '------------------------------------------------------------------ 続く・・・ 関連URL:http://oshiete1.goo.ne.jp/kotaeru.php3?qid=418248

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

    タイマーを使って,以下のような感じで PictureBox にCircleを動かす簡単なアニメーションを作成しているのですが,Timer.Interval=10で描画がかなりちらついてしまいます. この場合,ちらつきを無くすような方法はありませんでしょうか.よろしくお願いします. Private Sub Timer1_Timer() Picture1.Cls Picture1.Circle (x,y), 30, vbRed x = x + 1 y = y + 1 End Sub

  • VB6 ドラッグ&ドロップ

    Image1をPicture1(正方形)にドラッグ&ドロップするプログラム を作りたいと思っています。 このプログラムだとImage1全体がドラッグされるのではなく、 Image1の絵はその位置に残ってImage1の外枠だけがドラッグされてしまいます。 外枠だけでなくImage1の絵も一緒にドラッグできるようにするにはどうすればいいのでしょうか? また、このプログラムだとドロップする場所(Picture1_)以外で ドロップしてしまった場合でも画面上からImage1の絵と外枠が消えてしまいます。 ドロップする場所(Picture1_)以外でドロップしてしまった場合は、 Image1全体を画面上に残しておきたいのですがどうすればいいのでしょうか? Option Explicit Dim dx As Single, dy As Single Private Sub Form_Load() Image1.Picture = LoadPicture(App.Path & "picture.jpg") Image1.Stretch = True End Sub Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single) Source.Move X - dx, Y - dy End Sub Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Image1.Drag 1 dx = X: dy = Y 'マウスダウン位置 End Sub Private Sub Picture1_DragDrop(Source As Control, X As Single, Y As Single) Source.Visible = False 'ドロップオブジェクトを非表示にする Picture1.BackColor = RGB(255, 255, 255) End Sub Private Sub Picture1_DragOver(Source As Control, X As Single, Y As Single, _ State As Integer) If State = 0 Then Picture1.BackColor = RGB(0, 0, 255) If State = 1 Then Picture1.BackColor = RGB(255, 255, 255) End Sub

  • うまくできない??NO1

    ピクチャーを1~25までクローンで貼り付けています (P1に変えました) したいのは5*5のますがあります クリックするとたてと横がひっくり返る(色が変わる)ようなプログラムを作りたいのです。 がうまくできないのです。なにが間違っているのでしょうか? Private Sub Form_Load() Randomize For i = 1 To 25 co = Int(Rnd * 2) + 1 If co = 1 Then P1(i).BackColor = vbRed Else P1(i).BackColor = vbBlue End If Next i End Sub 続く・・・

  • VB 6.0でtimerをとselect caseを使ったプログラムで質問です。

    また質問です。 VBであらかじめ書いてあった三つの円を信号機のように青は2.5秒、黄色は0.5秒、赤は3秒で青→黄→赤→青 …と三十秒間動かしたいのですが、caseの後ろには何をいれればいいかわからず Private Sub Timer1_Timer() Timer.Tag = Timer1.Tag + 0.5 progressbar1.Value = progressbar1.Value + 0.5 Select Case Timer1.Tag Case Shape5.FillColor = vbGreen Shape5.FillStyle = 0 Case Shape6.FillColor = vbYellow Shape6.FillStyle = 0 Case Shape7.FillColor = vbRed Shape7.FillStyle = 0 end select End Sub としたのですがまったく動きません。タイマーを設定したのに時間の表示もでません。あと、progressbarというのもでてこないんです。 どうかお詳しい方お願いします。 m(_ _)m

  • Matlabについて質問2

    二分法とニュートン法について、どのようにプログラムを書けばいいのでしょうか? 具体的には、fortranでは、以下のように書かれているのですが、、、 y=-x^2+5x+2 (以下のページ http://www8.plala.or.jp/uemura/sim2.html を参照しています。) (二分法) DOUBLE PRECISION X,AX,X1,X2,Y1,Y2,YA,Y X=1 H=0.1 X1=0 !低い方のxの初期値 X2=5 !高い方のxの初期値 100 AX = (X1 + X2) / 2 !2つの初期値の平均 Y1 = Y(X1) Y2 = Y(X2) YA = Y(AX) IF (YA.EQ.Y1.AND.YA.EQ.Y2) GOTO 200 IF (Y1.GE.Y2) THEN  X2 = AX  GOTO 100 END IF IF (Y2.GE.Y1) THEN  X1 = AX  GOTO 100 END IF 200 WRITE(*,*) 'X*= ', X1 WRITE(*,*) 'Y*= ', Y1 END DOUBLE PRECISION FUNCTION Y(X) DOUBLE PRECISION X Y=-X**2+5*X+2 END これを実行すると以下のようになる。 X*= 2.499999981373549 Y*= 8.250000000000000 (ニュートン法) DOUBLE PRECISION X,H,DY1,DY2,DY3,Y1,Y,DY X=1 !xの初期値 H=0.1 !ステップ幅の初期値 100 DY1 = DY(X) DY2 = DY(X + H) DY3 = DY(X - H) IF (ABS(DY1).LT..000001) GOTO 200 !収束判定 IF (ABS(DY2).LT.ABS(DY1).AND.ABS(DY2).LT.ABS(DY3)) THEN  X = X + H  GOTO 100 END IF IF (ABS(DY3).LT.ABS(DY1).AND.ABS(DY3).LT.ABS(DY2)) THEN  X = X - H  GOTO 100 END IF IF (ABS(DY1).LE.ABS(DY2).AND.ABS(DY1).LE.ABS(DY3)) THEN  H = H / 10  GOTO 100 END IF 200 Y1 = Y(X) WRITE(*,*) 'X*= ',X WRITE(*,*) 'Y*= ',Y1 END DOUBLE PRECISION FUNCTION Y(X) DOUBLE PRECISION X Y=-X**2+5*X+2 END DOUBLE PRECISION FUNCTION DY(X) !微分式の定義 DOUBLE PRECISION X DY=-2*X+5 END これを実行すれば以下のようになる。 X*= 2.500000022351742 Y*= 8.250000000000000

  • オブジェクトがぶつかった時の処理

    <script type="text/javascript"> <!-- var imgStar ,imgMoon, timer; var dx = 6, dy = 4, x = 40, y = 160; function startMove(){ if (document.getElementById){ imgStar = document.getElementById("star"); imgMoon = document.getElementById("moon"); timer = setInterval("moveImg()",50); } } function moveImg(){ imgStar.style.left = x + "px"; imgStar.style.top = y + "px"; imgMoon.style.left = (440-x) + "px"; imgMoon.style.top = (320-y) + "px"; x = x + dx; y = y + dy; if (x<=40 || x >= 400) dx = -dx; if (y<=40 || y >= 280) dy = -dy; } function stopTimer() { if (window.clearInterval) clearInterval(timer); } //--> </script> 星と月がぶつかると、お互い逆方向にはね返るようにしたいのですが、この場合どうすれば良いでしょうか?

  • VBA と JIS Full BASIC

     下のJIS Full Basic スタイルとだいたい同じようなコードを VBA で書いたのですが   Z = Sqr(x^2 + y^2) のところでエラーが出ます。どこがおかしいのでしょうか。 Function gcd(a, b)   Do While b <> 0    r = a Mod b    a = b    b = r   Loop   gcd = a End Function Rem 既約なピタゴラス数を求める Sub Pythagoras()  LAST = 200   LAST = 200   For x = 1 To LAST    For y = x + 1 To LAST      Z = Sqr(x^2 + y^2)      'ここでコンパイルエラーが出る      If Int(Z) = Z Then       If gcd(x, y) = 1 And gcd(x, z) = 1 And gcd(y, z) = 1 Then         Debug.Print x & ", " & y & ", " & z       End If      End If    Next y   Next x End Sub ---------------------------- JIS Full Basic スタイルのコード REM ピタゴラス数 FUNCTION gcd(a,b)   DO WHILE b <> 0    LET r = MOD(a,b)    LET a = b    LET b = r   LOOP   LET gcd = a END FUNCTION LET LAST = 200 FOR x = 1 TO LAST   FOR y = x + 1 TO LAST    LET z = SQR(x^2+y^2)    IF INT(z) = z THEN      IF gcd(x,y) = 1 AND gcd(x,z) = 1 AND gcd(y,z) = 1 THEN       PRINT x,y,z      END IF    END IF   NEXT y NEXT x END

  • ボタンが押されたときの反応 Basic

    Active Basicでゲームプログラムを書いています。 ボタンを押したときの反応で、上下左右に画像を動かしたいのですが、 ボタンを押すと、いったん静止してから、連打処理(?)のように動きます。 やりたいことは、ボタンを押すとすぐに上下左右に一定間隔で画像を動かすことです。 Sub MainWnd_KeyDown(KeyCode As Long, flags As Long) If KeyCode=37 Then If x<=3 Then Exit Sub End If MyBmpInfo=2 x=x-5 Else If KeyCode=38 Then If y<=0 Then Exit Sub End If MyBmpInfo=1 y=y-5 Else If KeyCode=39 Then If x>=600 Then Exit Sub End If MyBmpInfo=3 x=x+5 Else If KeyCode=40 Then If y>=400 Then Exit Sub End If y=y+5 End If InvalidateRect(hMainWnd,ByVal 0,TRUE) End Sub と書きました。 すみませんが、どなたかご存知の方がいらっしゃいましたら、ご教授ください。 お願いします。

専門家に質問してみよう