■No39787 (へっぽこ さん) に返信
> ところで早速、修正して作ってみました。
大分良くなってきたと思います。あと少し。
No39675 で、「右端を越えそうなとき」に方向反転させたい、と書かれていましたが、
これだと、「右端を越えてしまった後」で方向反転させていますよね。
今のコードは、
(1) PictureBox1.Left に idouryou を加算する。
(2) 加算した結果を、右端の座標と比較し、右端を越えていたら:
(2.1) idouryou にマイナスの乱数値をセット。
(2.2) PictureBox1.Left に idouryou を再度加算しなおす。
という処理手順になっていますが、これを
(1) 「PictureBox1.Left + idouryou」を右端の座標と比較し、右端を越えていたら:
(1.1) idouryou にマイナスの乱数値をセット。
(2) PictureBox1.Left に idouryou を加算する。
のようにして、『右端を超えるかどうかを、先に検証する』ようにした方が良いと思います。
> いかがなものでしょうか?
へっぽこさんが今回書かれたコードの動きを追ってみましょう。
>1: PictureBox1.Left += idouryou '移動量10ずつ右へ進む
>2: If PictureBox1.Left > Me.Width - PictureBox1.Width Then 'もし右端を越えたら
>3: idouryou = -rn.Next(10) '負の数の移動量を生成し
>4: PictureBox1.Left += idouryou '生成した移動量で左へ進む
>5: End If
たとえば、この部分を実行する直前の値が
・idouryou = 10
・「Me.Width - PictureBox1.Width」= 250
・PictureBox1.Left = 245
であったと仮定して、上記を一行ずつ追いかけてみます。
>1: PictureBox1.Left += idouryou '移動量10ずつ右へ進む
ここで、PictureBox1.Left は 245 から 255 になりますよね。
>2: If PictureBox1.Left > Me.Width - PictureBox1.Width Then 'もし右端を越えたら
ここで、[If 255 > 250 Then] が成り立つので、If 文の中身が実行されます。
>3: idouryou = -rn.Next(10) '負の数の移動量を生成し
rn.Next(10) の結果は、「0〜9」という範囲になります。
たとえば乱数の結果が 2 だっとしたら、idouryou は -2 になりますね。
>4: PictureBox1.Left += idouryou '生成した移動量で左へ進む
idouryou が -2 なので、PictureBox1.Left は 255 から 253 になります。
>5: End If
この場合、右端を微妙に越えてしまったままになりますね。
そして次回の処理では、
・idouryou = -2
・「Me.Width - PictureBox1.Width」= 250
・PictureBox1.Left = 253
の状態から開始されますが、実行すると PictureBox1.Left += idouryou により、
その座標は 253 から 251 に変化することになります。
左に進んではいますが、それでもまだ微妙に右端の座標(250)を越えたままですね。
そしてさらに次の回では、251 から 249 に変化します。
ようやくここで、右端から離れる事になります。
左端を越えた場合についても同様で、多少、画面の端に食い込んだ状態で
方向転換が始まることになりますね。
> 思った通りの動きをしているのですが、
画面の端ぴったりの位置で反転させたいのであれば、まだ修正の余地がありますが、
上記が目的の動作であるならば、今のままでも問題無いと思います。
|