画像2つが動き回るスクリーンセーバーを作っていて、画面の端で跳ね返るようには出来たのですが、画像同士を跳ね返らせようとしても、うまくできません。どうすればいいのでしょうか?
掲示板の使用上の注意
1.それぞれの掲示板の趣旨にあったものをお書き下さい。
この掲示板はVisual Basicの初心者掲示板ですが、
上記質問は、趣旨にあったものですか?
私には、Visual Basicがどこで、どうかかわるのかがわかりません。
VBでスクリーンセーバーを作っているのだとして
画面の端で跳ね返るのはどうやって出来たのでしょうか?
座標で判断しているのなら、画像の端で跳ね返るように
すればいいと思います。
とりあえず開発環境を書きましょう
このようなアルゴリズムの場合、どんな環境でも「原理的には」同じですけどね
画像がふたつあるとして、それぞれが動いているということはそれぞれの座標は変数に格納されているはずですから、それがぶつかったかどうかを計算させればいいだけです
開発環境は、VisualBasic.NET Standard です。
変数は、Classの中に、Dim文でデータ型はIntegerで宣言しました。
If PictureBox1.Left = PictureBox2.Right Or PictureBox2.Left = PictureBox1.Right Then
VectorXa = -VectorXa ←画像1の横の移動が逆になる。
VectorXb = -VectorXb ←画像2の横の移動が逆になる。
End If
If PictureBox1.Top = PictureBox2.Bottom Or PictureBox2.Top = PictureBox1.Bottom Then
VectorYa = -VectorYa ←画像1の縦の移動が逆になる。
VectorYb = -VectorYb ←画像2の縦の移動が逆になる。
End If
としても、画像同士は跳ね返らず、重なって通り抜けてしまいます。
上手くいかないのですが。
開発環境は、VisualBasic.NET Standard です。
変数は、Classの中に、Dim文でデータ型はIntegerで宣言しました。
If PictureBox1.Left = PictureBox2.Right Or PictureBox2.Left = PictureBox1.Right Then
VectorXa = -VectorXa ←画像1の横の移動が逆になる。
VectorXb = -VectorXb ←画像2の横の移動が逆になる。
End If
If PictureBox1.Top = PictureBox2.Bottom Or PictureBox2.Top = PictureBox1.Bottom Then
VectorYa = -VectorYa ←画像1の縦の移動が逆になる。
VectorYb = -VectorYb ←画像2の縦の移動が逆になる。
End If
としても、画像同士は跳ね返らず、重なって通り抜けてしまいます。
上手くいかないのですが。
↑すいません。2つ入ってしまいました。
ん、普通に判定が厳しすぎるからでは?
> If PictureBox1.Left = PictureBox2.Right Or PictureBox2.Left = PictureBox1.Right Then
> If PictureBox1.Top = PictureBox2.Bottom Or PictureBox2.Top = PictureBox1.Bottom Then
これでは、「1ピクセルの線(=壁?)上」に「画像の端が存在する」ときだけ、反応します。
そうではなく、「壁より先に画像の端が存在する」という風にしてみては?
やっぱりな、という感じ
キャラクタには高さと幅がありますよね?それを無視しちゃってます
100x100のキャラクタだとすれば、横の判定はLeft+100、縦の判定はTop+100までの猶予が必要です
以上を踏まえた上で判定を = ではなく、 = <もしくは => にして考えてみてくださいな
数の範囲をどのように指定すればいいのですか?
> 数の範囲をどのように指定すればいいのですか?
まず、どなたの質問に対する言葉なのかが分かりません。
また自分なりに解決しようとしていますか?
※たとえば、画面=A4判1枚と、画像=長方形に切り取った紙1枚を用意して、
画面内で画像が跳ね返るには、どういった処理が必要なのか?
一度でも試せばすぐに分かるはずですけど…
すいません。通ってみた さんです。
>数の範囲をどのように指定すればいいのですか?
>すいません。通ってみた さんです。
とりあえず
>以上を踏まえた上で判定を = ではなく、 = <もしくは => にして考えてみてくださいな
のように指定してみて下さい。…全角だから読み難い?
= を =< もしくは => にして考えて…
[VB.NET]だと <= か >= になりますか(汗)…でも自動で
修正してくれるから関係ないけどね。
…多分その後に Or を And に変える事になると思います。
OrElse や AndAlso という演算子も用意されてます。参考にどうぞ。
[AndAlso 演算子]
http://www.microsoft.com/japan/msdn/library/ja/vblr7/html/valrfandalsooperator.asp
>>まるるうさん
>>[VB.NET]だと <= か >= になりますか
そうなんですか・・・申し訳ないですorz
という訳で、ヒントとしてはこんな感じかと
If PictureBox1.Left >= PictureBox2.Right And PictureBox1.Right <= PictureBox2.Left Then
'横座標だけみたらぶつかっている
Enf If
この場合横座標だけを判定しているので、これに加えて縦座標もチェックして両方ともぶつかっている判定なら、本当にぶつかっています
※実際動かしていないのでおかしかったらゴメンなさい
みなさん、有難うございます。
明日、作ってみます。
ツイート | ![]() |