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