はじめに
canvas を使ったブロック崩しゲームを作ってるのですが、物理的なボール同士の当たり判定ロジックを考える際にピタゴラスの定理をAIに聞いて学習したので、その内容を備忘録で残しておきます。
衝突判定 と 距離計算
ゲーム開発で、物体同士の衝突判定は非常に重要な部分です。
ボールが動き回るシーンや、キャラクター同士が接触するシーンなど、物理的なインタラクションを実現するために不可欠な要素です。
この記事では、JavaScriptを使った衝突判定と距離計算の基礎について解説します。
1. 距離計算の基礎
衝突判定を行う前に、2つのオブジェクト(例えばボールやキャラクター)の距離を計算する必要があります。 距離計算にはピタゴラスの定理を使います。
ピタゴラスの定理 - Wikipedia
初等幾何学におけるピタゴラスの定理(ピタゴラスのていり、(英: Pythagorean theorem)は、直角三角形の3辺の長さの間に成り立つ関係について述べた定理である。その関係は、斜辺の長さを c, 他の2辺の長さを a, b とすると、c2=a2+b2{\displaystyle c^{2}=a^{2}+b^{2}}という等式の形で述べられる
https://w.wiki/3gN4ピタゴラスの定理では、直角三角形の2辺と斜辺の関係を表します。
c² = a² + b²
ここで、a と b は直角を挟む2辺、 c は斜辺です。
2つのボールの距離を計算する場合、 a と b はそれぞれボールの x座標の差 と y座標の差 です。
2. JavaScriptでの距離計算
JavaScriptを使って、2つのボールの距離を計算する方法は次の通りです:
const dx = ball1.x - ball2.x; // x座標の差
const dy = ball1.y - ball2.y; // y座標の差
const distance = Math.sqrt(dx * dx + dy * dy); // 距離を計算
dxとdyは、2つのボールの位置の差です。Math.sqrt(dx * dx + dy * dy)で、2つのボール間の実際の距離を計算しています。
3. 衝突判定
距離計算ができたら、次は衝突判定です。
2つの物体が接触したかどうかを判定するためには、距離が物体の半径の合計より小さいかどうかをチェックします。
// 衝突判定
function checkBallCollision(ball1, ball2) {
const dx = ball1.x - ball2.x;
const dy = ball1.y - ball2.y;
const distance = Math.sqrt(dx * dx + dy * dy);
// もしボール同士が接触していたら
if (distance < ball1.radius + ball2.radius) {
// ここで反発や動きの処理をする
console.log("衝突しました!");
}
}
distance < ball1.radius + ball2.radiusという条件で、ボールが接触したかどうかを判定しています。
4. まとめ
距離計算はピタゴラスの定理を使って簡単に求めることができ、ゲーム開発において非常に重要なステップです。
衝突判定では、距離を使って物体同士が接触したかどうかを判断し、次に起こるべき動作を決定します。
このような基本的な物理シミュレーションを理解していくことで、ゲーム内での動きやインタラクションをよりリアルに再現することができます。
最後に
もし、他の物理シミュレーションや高度なゲームロジックに興味があれば、次は摩擦や重力、衝突後の反発なども学んでいくと、さらに面白いゲームが作れるようになります。
関連リンク
[ブロック崩しゲーム] ブロック☆パレット 魔法で描く不思議な世界
このゲームは、シンプルなブロック崩しに魔法的な演出とアニメーションが加わり、ブロックを崩すたびに新しい発見が待っています。遊びながら進化するゲームシステムと、アニメーション効果を楽しんでください。
/featured/project4/[JavaScript] スプライトシートアニメーション入門:JavaScriptでキャラクターアニメーションを実装
ゲームやウェブアプリケーションで使われるスプライトシートアニメーションの基礎を学び、JavaScriptを使ってキャラクターアニメーションを実装する方法を解説します。
/posts/javascript-sprite-sheet-animation/
[JavaScript] Canvasでのフレームレート制御とアニメーション処理の基本
Canvasでのアニメーション処理とフレームレートの管理方法について詳しく解説します。requestAnimationFrameやperformance.now()を使用したスムーズな動作の実現方法や、開発中の躓きやテクニックについても紹介。
/posts/javascript-canvas-frame-rate-animation/
💬 コメント