質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

684閲覧

ボールがブロックに反射するようにしたい

Shizane

総合スコア1

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/11/27 07:56

前提

プログラミングを最近始めた者です。せっかく始めたので簡単なブロック崩しでも作ろうかと思いやってみたのですが、どうにもボールをブロックに反射させるのがうまくいきません。解決方法がわかる方いたら教えていただきたいです。

該当のソースコード

p5.js

1ソースコード(cx,cyはボールの中心の座標、vyはボールの移動速度です) 2```function Block2(){ 3 for(let i = 0; i < 160; i = i + 1){ 4 let rx = 67*(i%20)+100; 5 let ry = 40*floor(i/20)+20; 6 fill(150,255,156); 7 rect(rx, ry, 40, 20); 8 if(((cx > rx) && (cx < rx + 40) && (cy < ry + 20)) || ((cx > rx) && (cx < rx + 40) && (cy > ry + 20))){ 9 vy = -1*vy 10 } 11 }//二番目以降のブロック 12 13### 試したこと 14 15ブロックがこれの下にもう一つあって、そちらは同じように書いてうまく反射できています。 16他のコードが知りたいなどあれば遠慮なく言っていただきたいです。回答よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/11/27 09:59

forブロック以下の各行を日本語で説明してください rxは中心の座標とのことですが何か計算しています この計算の意味を説明してください 多分反射判定はifのところなのでしょうけど、何故このロジックなのか説明してください
Shizane

2022/11/27 10:34

コメントありがとうございます。 えっと、ボール(円)の中心の座標がcx,cyで、rx,ryはrectの座標で、rectを縦横8×20に並べたかったのでこういう計算になっています。ごちゃごちゃした定数はいい感じになった数字を入れているだけです。 if文は、ボールがrectの内側にあって、かつrectnの上側か下側に引っ付いた場合に移動の向きを反対にすればいけるかなと思ってこの式になっています。 いかがでしょうか?
pig_vba

2022/11/27 13:05

反射処理をさせたいならまずx方向の移動量とy方向の移動量を変数で独立管理するところからですね
Shizane

2022/11/27 13:19

コメントありがとうございます。 なるほど、移動量自体を変数で定義してそこからということですかね?やってみます!また詰まったら戻ってきます。
pig_vba

2022/11/28 01:51 編集

そうですね。各方向の移動量を変数にして移動処理は変数を足しこむだけにしておけば、反射処理自体は壁に当たった時に変数を*-1するだけで実装できます。あとはブロックの角に当たった時の挙動をどうするかですね。面倒なら壁のときと同じ処理でいいと思いますが、リアルさを出すなら三角関数を使用して複雑な処理を書く必要があります
Shizane

2022/11/28 22:01

返信遅れて申し訳ありません。 とりあえず移動量の変数を定義して反射できるようになりました。角は難しそうなので一旦無視しました。ありがとうございます
guest

回答1

0

ベストアンサー

衝突検出 - ゲーム開発 | MDN
https://developer.mozilla.org/ja/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Collision_detection

このあたりのページにテクニックがのっています。

MDNではややこしいことを行わずにy方向だけの反射にとどめていますが、
ここにボール半径の組み込むこと、
ボール速度から逆算して前回値を求めて、上下からぶつかったのか、左右からぶつかったのか、を判定すること
は、応用としてまあまあ簡単にできると思います。

斜め方向からのぶつかりによって、xとyの速度両方を変更しようとすると、ややこしいのは、ブロックが連続配置されている場合で、

リアルな世界ではブロックが連続していれば斜め方向からぶつかるということはないのですが、ゲームで斜め方向からのぶつかりを実装すると、跳ね返りが変になってしまう場合がありますので、そこは適当にしておくといいかもしれません。

投稿2022/11/28 10:27

standard-soft

総合スコア197

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shizane

2022/11/28 22:08

コメント遅れて申し訳ありません。 提示されたページを参考にしてコードをいじってみたら反射の体を成すようになりました! 皆さん回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問