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

わんくま同盟

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

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


(過去ログ 68 を表示中)
■39670 / )  Re[11]: PictureBoxを左右に往復するループ
□投稿者/ biac (149回)-(2009/08/12(Wed) 10:26:18)
biac さんの Web サイト
> だっから、PictureBox1.Left の値がどう変化するかを確認すればいい。

だよねぇ。
ひょっとして、「ブレークポイント」を知らなかったりするのかなぁ?

> If PictureBox1.Left > Me.Width - PictureBox1.Width Or PictureBox1.Left < 0 Then
>     idouryou *= -1 '上記の条件のときの移動方向を反転
>
> End If
>
> PictureBox1.Left += idouryou '←この行にブレークポイントを置いて、
        'idouryou の値が想定どおりになっているか調べてみるべし。 > へっぽこ さん
※ …って、このレスを書いてるあいだに、みきぬ さんが答えてくださっちゃいましたね f(^^;

# あと、初心者はこういう混乱によく陥るので、メンバーの参照には this / Me を付けろ、
# メンバー変数の名前は区別しやすい命名 (アタマにアンダースコア付けるとか) をしろ、
# って言うわけですよ f(^^;
# ※ 「★…★の部分を挿入すると」って話から、そう思える。


> なのでbiacさんは、「移動量と方向」の2つに分けた。移動量を変えても、方向は変わらないからね。

ですます。
2次元空間で移動させるとなれば、ベクトルを扱うことになるわけだけど。
それを、2つの成分を持つものと見るか、大きさと方向を持つものと見るか…?
乱数でベクトルの大きさを設定すると決めた瞬間に、後者で行くぞという暗黙の前提が。 f(^^;



さて。
どうしても大きさと方向を idouryou という変数ひとつでいっぺんに扱いたいらしいので、
コメントに突っ込みを。(追記分を 【】 で。 <del>〜</del> は削除。)

■No39648 (へっぽこ さん) に返信

> idouryou = rn.Next(10) '【右向きの】移動量を0〜9で発生★
    '【この場所では、idouryou は 0〜9 のいずれかになっている。つまり必ず右向き。】
>
> If PictureBox1.Left > Me.Width - PictureBox1.Width Or PictureBox1.Left < 0 Then
      '【この場所でも、idouryou は 0〜9 のいずれかのままである。つまり必ず右向き。】
>     idouryou *= -1 '上記の条件のときの移動方向を<del>反転</del>【左向きに変える】
>
      '【この場所では、idouryou は左向き。】
> End If
>
  '【1】
> PictureBox1.Left += idouryou

さらに。
1. 「上記の条件」というのを日本語で説明してください。
2. 「上記の条件」のとき、idouryou は左向きになるわけですが、それでよいですか?
3. 「上記の条件」以外のときは、【1】での idouryou は右向きになりますか、左向きになりますか?
   また、それでよいですか?


> 移動量がランダムに変化することとの関係がいまいち理解できません。(-_-;)

そういうときは、問題をシンプルにしましょう。
いま直面している問題に、「移動量がランダムに変化すること」が関係しているかどうか…?
次のようにコードを (仮に) 変更してみれば、関係しているかどうか分かるのではないかな?

> Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
>
>     PictureBox1.Top = rn.Next(400) 'Y座標を0〜399で発生
>     '★ 'idouryou = rn.Next(10) '移動量を0〜9で発生★
      idouryou = 5 '移動量を固定値5で発生 (「移動量がランダムに変化すること」を排除する)
>
>     If PictureBox1.Left > Me.Width - PictureBox1.Width Or PictureBox1.Left < 0 Then
>         idouryou *= -1 '上記の条件のときの移動方向を反転
>
>     End If
>
>     PictureBox1.Left += idouryou
>
> End Sub


それと。
行き詰ったときは、コードを捨てる勇気を持ちましょう。
(実際には、捨てる前にバックアップコピーを取っておくものですけれど。)

今回ですと、 Timer1_Tick() メソッドの中身全部と、 Timer1_Tick() メソッドだけで使っている
変数 (idouryou) を削除してしまって、心機一転ゼロから書き直したほうが良いです。
そうしないと、いつまでも既存の「おかしな」コードに引き摺られてしまいますよ。

返信 編集キー/


管理者用

- Child Tree -