#4
by もるも » 5年前
簡単な例を上げてみます。
プレイヤーと敵同士の当たり判定です。(敵マネージャにプレイヤーの情報を渡して判定してもらう)
マネージャ内にこんな感じのものを作って、
コード:
//Enemyとの当たり判定チェック
bool EnemyManager::CheckHit(float target_x, float target_y) {
for (auto it = _list.begin(); it != _list.end();++it) {
//「(*it)->」で個別にアクセスできます
if (Collision_Circle((*it)->getX(), (*it)->getY(), 20, target_x, target_y, 20)) {//サイズ取得が不明なので半径20として適当に入れました
return true;
}
}
return false;
}
//↓使いまわせる用にクラス化しておくと楽です
bool EnemyManager::Collision_Circle(float x, float y, int r, float target_x, float target_y, int target_r) {
double X = x - target_x;
double Y = y - target_y;
int R = r + target_r;
if (X*X + Y * Y < R*R) { //円同士の当たり判定
//当たり判定可視化用の描画
DrawCircle(x, y, r, GetColor(255, 255, 255), true);
DrawCircle(target_x, target_y, target_r, GetColor(255, 255, 255), true);
return true;//Hit!
}
return false;
}
次にゲームシーンクラス。
当たったかどうか可視化したかったのでdraw()の後ろに置きました。
実際は見えなくてもいいものなので、別のところで作ってまとめてくださいね。
コード:
void GameScene::draw() const
{
_background->draw();
_player->draw();
_board->draw();
_enemyMgr->draw();
//プレイヤーが敵とぶつかったかどうか調べるため、プレイヤーの情報を渡す。
//プレイヤーにもAbstractEnemyクラス同様、player.hにgetX、getY関数を追加しました。
if (_enemyMgr->CheckHit(_player->getX(), _player->getY())) {
//_player->当たったときの処理();など
DrawString(0, 100, "Hitしました", GetColor(255, 255, 0));
}
}
当たり判定に関しては完全ではないですが、
値の渡し方の参考になればと思います。
色々試してみてください(^^)
簡単な例を上げてみます。
プレイヤーと敵同士の当たり判定です。(敵マネージャにプレイヤーの情報を渡して判定してもらう)
マネージャ内にこんな感じのものを作って、
[code=Cpp]
//Enemyとの当たり判定チェック
bool EnemyManager::CheckHit(float target_x, float target_y) {
for (auto it = _list.begin(); it != _list.end();++it) {
//「(*it)->」で個別にアクセスできます
if (Collision_Circle((*it)->getX(), (*it)->getY(), 20, target_x, target_y, 20)) {//サイズ取得が不明なので半径20として適当に入れました
return true;
}
}
return false;
}
//↓使いまわせる用にクラス化しておくと楽です
bool EnemyManager::Collision_Circle(float x, float y, int r, float target_x, float target_y, int target_r) {
double X = x - target_x;
double Y = y - target_y;
int R = r + target_r;
if (X*X + Y * Y < R*R) { //円同士の当たり判定
//当たり判定可視化用の描画
DrawCircle(x, y, r, GetColor(255, 255, 255), true);
DrawCircle(target_x, target_y, target_r, GetColor(255, 255, 255), true);
return true;//Hit!
}
return false;
}
[/code]
次にゲームシーンクラス。
当たったかどうか可視化したかったのでdraw()の後ろに置きました。
実際は見えなくてもいいものなので、別のところで作ってまとめてくださいね。
[code=Cpp]
void GameScene::draw() const
{
_background->draw();
_player->draw();
_board->draw();
_enemyMgr->draw();
//プレイヤーが敵とぶつかったかどうか調べるため、プレイヤーの情報を渡す。
//プレイヤーにもAbstractEnemyクラス同様、player.hにgetX、getY関数を追加しました。
if (_enemyMgr->CheckHit(_player->getX(), _player->getY())) {
//_player->当たったときの処理();など
DrawString(0, 100, "Hitしました", GetColor(255, 255, 0));
}
}
[/code]
当たり判定に関しては完全ではないですが、
値の渡し方の参考になればと思います。
色々試してみてください(^^)
[attachment=0]スクリーンショット (187).png[/attachment]