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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

3335閲覧

ブロック崩しでの跳ね返り

nachann

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2020/07/07 01:27

visual studio のC#でブロック崩しのゲームを作成しているのですが、ブロックにボールが当たったときにブロックが消えるコードは書けたのですが、跳ね返る動作のコードがわかりません。
エラーではないですが教えていただきたいです。

C#

1 class Block : ParentClass 2 { 3 public Block(Rectangle position,int r, int g, int b):base(position,r,g,b) 4 { 5 preHit = false; 6 } 7 8 public override bool Hit(Rectangle obstaclePosition) 9 { 10 if (position.IntersectsWith(obstaclePosition) && visible) 11 { 12 visible = false; 13 return true; 14 } 15 else 16 return false; 17 18 19 } 20 } 21

C#

1class Ball : ParentClass 2 { 3 bool preHit; 4 Point speed; 5 6 public Ball(Rectangle position,int r, int g, int b,Point speed):base(position,r,g,b) 7 { 8 this.position = position; 9 this.speed = speed; 10 preHit = false; 11 } 12 13 public void CalcSpeed(Point pictureBooxSize,Rectangle obstaclePosition) 14 { 15 if (position.IntersectsWith(obstaclePosition) && !preHit) 16 { 17 double degree = Math.Atan2(position.Y + position.Height / 2 - speed.Y - (obstaclePosition.Y + obstaclePosition.Height / 2), position.X + position.Width / 2 - speed.X - (obstaclePosition.X + obstaclePosition.Width / 2)); 18 double racketDegree = Math.Atan2(obstaclePosition.Height, obstaclePosition.Width); 19 20 21 if ((degree >= -racketDegree && degree <= racketDegree)) 22 speed.X = -speed.X; 23 else 24 speed.Y = -speed.Y; 25 26 preHit = true; 27 28 } 29 else 30 preHit = false; 31

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

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

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

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

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

guest

回答2

0

ベストアンサー

ボールに加わる力 → ボールの加速度 → ボールの速度 → ボールの位置
みたいな処理であれば,衝突したら適切な反発力をボールに加えてやればOKでしょうけど,
雰囲気的にそんな感じではなさそうなので,簡単に,

「ボール」が「ブロック」のどこに当たったかを求め,
ボールの移動速度ベクトルのうち,その当たった箇所の法線方向の成分を反転させればよいのではないでしょうか.
(ブロックが矩形のとき,4辺(あるいは4つ角の場合もあるだろうけど)のどこにボールがぶつかったのかによって,跳ね返る方向を適切に決めればよいという話)

「ボール」が同時に衝突し得る対象が複数存在する場合には,
「ボール」と「何か」の衝突判定を行うごとに"その場で"速度をいじくってしまうのではなく,全対象との判定を行った後で,その結果を鑑みて,ボールの速度をいじくるようにすると良いかと.
(でないと,例えば2つの対象に衝突した際に,「反転の反転=何もしない」とかいう話になってしまうかもしれない.)

投稿2020/07/07 08:22

編集2020/07/07 08:23
fana

総合スコア11996

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

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

0

入射角 反射角についての話でしょうか。
角度(angle)の定義が大事になるかと思います。

jsですが参考にしてみてください。ほぼ一緒なので。
https://noumenon-th.net/programming/2017/04/09/reflection/

投稿2020/07/07 05:35

U_U_Jenkins

総合スコア110

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問