C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 68 を表示中)
■39792 / )  Re[34]: PictureBoxを左右に往復するループ
□投稿者/ 魔界の仮面弁士 (1211回)-(2009/08/13(Thu) 13:45:28)
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 に変化します。
ようやくここで、右端から離れる事になります。


左端を越えた場合についても同様で、多少、画面の端に食い込んだ状態で
方向転換が始まることになりますね。



> 思った通りの動きをしているのですが、
画面の端ぴったりの位置で反転させたいのであれば、まだ修正の余地がありますが、
上記が目的の動作であるならば、今のままでも問題無いと思います。

返信 編集キー/


管理者用

- Child Tree -