3.1 シューティングゲームの当たり判定

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