150 likes | 497 Views
3.1 シューティングゲームの当たり判定. 当たったら 死亡. 当たり判定とは. ゲーム上の 物体同士が 衝突 しているか の判定 自機 に 弾 が当たったかどうか 敵機 に 弾 が当たったかどうか 自機 が 地面 に接しているかどうか 自機 と アイテム が重なっているかどうか などの判定のこと. どうやって判定するのか. ほとんどの場合、 図形 を用いて判定する 実際に描画するのではなく、 裏で計算するだけ 図形以外の方法も存在するが、紹介はまた今度. 今回作る当たり判定. 今回は シューティングゲーム の当たり判定
E N D
3.1シューティングゲームの当たり判定 当たったら死亡
当たり判定とは • ゲーム上の物体同士が衝突しているかの判定 • 自機に弾が当たったかどうか • 敵機に弾が当たったかどうか • 自機が地面に接しているかどうか • 自機とアイテムが重なっているかどうか などの判定のこと 3.1 シューティングゲームの当たり判定
どうやって判定するのか • ほとんどの場合、図形を用いて判定する • 実際に描画するのではなく、裏で計算するだけ • 図形以外の方法も存在するが、紹介はまた今度 3.1 シューティングゲームの当たり判定
今回作る当たり判定 • 今回はシューティングゲームの当たり判定 • 円×円の当たり判定がよく用いられる 重なっているので 当たり 3.1 シューティングゲームの当たり判定
なぜ円×円を使うのか • 弾の画像には長方形の方がフィットする • でも回転したら? 回転するほどズレる ※回転した長方形の判定は大変 回転してもズレない 3.1 シューティングゲームの当たり判定
当たり判定構造体の設計 • 平面上に円を定義するのに必要な変数は・・・ • 座標 • 半径 • 構造体に必要な関数は・・・ • 当たり判定の実行 struct COLLISION POINT location こうなる double radius bool isHit(COLLISION) 3.1 シューティングゲームの当たり判定
判定関数の実装 • 2つの円が重なっているかどうか調べるには? • ピタゴラスの定理を使おう 緑の線分 < 半径の和 なら重なっている location.y - 相手.location.y location.x- 相手.location.x 3.1 シューティングゲームの当たり判定
判定関数の実装 • 実際に書くとこうなる • 平方根を取得する処理は非常に重いので使わない ( A + B < R ならば A^2 + B^2 < R^2) structCOLLISION { 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同士で当たり判定を実行する関数も作ろう • ACTORと COLLISIONの座標は一致させる • 移動の度にcollision.location = location 3.1 シューティングゲームの当たり判定
使い方 • 実際に書くとこうなる(あくまで一例) structACTOR { POINT location; COLLISION collision; bool isHit(ACTOR opponent) { returncollision.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 シューティングゲームの当たり判定