3.1 シューティングゲームの当たり判定 当たったら死亡
当たり判定とは ゲーム上の物体同士が衝突しているかの判定 自機に弾が当たったかどうか 敵機に弾が当たったかどうか 自機が地面に接しているかどうか 自機とアイテムが重なっているかどうか などの判定のこと 3.1 シューティングゲームの当たり判定
どうやって判定するのか ほとんどの場合、図形を用いて判定する 図形以外の方法も存在するが、紹介はまた今度 実際に描画するのではなく、裏で計算するだけ 図形以外の方法も存在するが、紹介はまた今度 3.1 シューティングゲームの当たり判定
今回作る当たり判定 今回はシューティングゲームの当たり判定 円×円の当たり判定がよく用いられる 重なっているので 当たり 3.1 シューティングゲームの当たり判定
なぜ円×円を使うのか 弾の画像には長方形の方がフィットする でも回転したら? 回転するほどズレる 回転してもズレない ※回転した長方形の判定は大変 回転してもズレない 3.1 シューティングゲームの当たり判定
当たり判定構造体の設計 平面上に円を定義するのに必要な変数は・・・ 構造体に必要な関数は・・・ こうなる 座標 半径 当たり判定の実行 struct COLLISION POINT location bool isHit(COLLISION) double radius こうなる 3.1 シューティングゲームの当たり判定
判定関数の実装 2つの円が重なっているかどうか調べるには? ピタゴラスの定理を使おう 緑の線分 < 半径の和 なら重なっている location.y - 相手.location.y location.x - 相手.location.x 3.1 シューティングゲームの当たり判定
判定関数の実装 実際に書くとこうなる 平方根を取得する処理は非常に重いので使わない ( A + B < R ならば A^2 + B^2 < R^2 ) struct COLLISION { POINT location; double radius; bool isHit(COLLISION opponent) { return pow(location.x - opponent.location.x, 2) + pow(location.y - opponent.location.y, 2) < pow(radius + opponent.radius, 2); } }; 3.1 シューティングゲームの当たり判定
使い方 ACTOR に COLLISION を持たせれば良い ACTOR と COLLISION の座標は一致させる 移動の度に collision.location = location 3.1 シューティングゲームの当たり判定
使い方 実際に書くとこうなる(あくまで一例) struct ACTOR { POINT location; COLLISION collision; bool isHit(ACTOR opponent) { return collision.isHit(opponent.collision); } void move(int x, int y) { location.x += x; location.y += y; collision.location = location; }; 3.1 シューティングゲームの当たり判定
使い方 実際の処理はこんな感じになるね // // コードがたくさん // 自機と敵弾の当たり判定 for (int i = 0; i < BULLET_LIMIT; i++) { if ( player.isHit(enemyBullets[i]) ) { player.kill(); } 3.1 シューティングゲームの当たり判定
補足事項 高速すり抜け現象の回避 Wikiを見てね http://nanzanmmc.net/pc/lecture/game/add 他にもデバッグの手法はいろいろあるので是非見ておくように促しておく。 3.1 シューティングゲームの当たり判定