アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

> 当たった瞬間、その場で右往左往してしまいます。



質問と、ソースが違うではないの!

であれば、こうでしょう。

> 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 は、グローバル変数にして、初期値を設定してね。
    • good
    • 1
この回答へのお礼

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

お礼日時:2003/01/19 01:06

ソースの表示が少なかった用です。


グローバル変数のところと、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
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/01/19 01:07

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

この回答への補足

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

補足日時:2003/01/16 21:59
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/01/19 01:04

> 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 方向も同様に直してね。

この回答への補足

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

補足日時:2003/01/16 00:43
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/01/19 01:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!