現在、四聖龍神録2プログラミングの館を見ながらゲームを作成しているのですが、オブジェクトを別々にばらしてプログラムしています
敵や弾などを別のクラスで作成し、それをオブジェクトの数だけ生成するような設計ですが、このような設計をした場合、弾とプレイヤーのあたり判定計算や、(あたり判定がある)マップとのあたり判定計算はどのようにして行えばいいのでしょうか?
グローバル変数を使ってしまってはこのような設計をした意味をなさないと思うので設計に適した方法を教えてくださいm(__)m
四聖龍神録2プログラミングの館について2
Re: 四聖龍神録2プログラミングの館について2
やってみようと思ったのですが、マネージャークラス同士で値を(相互に)渡す方法が分からなかったのでできませんでした
すみませんm(__)m
すみませんm(__)m
Re: 四聖龍神録2プログラミングの館について2
簡単な例を上げてみます。
プレイヤーと敵同士の当たり判定です。(敵マネージャにプレイヤーの情報を渡して判定してもらう)
マネージャ内にこんな感じのものを作って、
次にゲームシーンクラス。
当たったかどうか可視化したかったのでdraw()の後ろに置きました。
実際は見えなくてもいいものなので、別のところで作ってまとめてくださいね。
当たり判定に関しては完全ではないですが、
値の渡し方の参考になればと思います。
色々試してみてください(^^)
プレイヤーと敵同士の当たり判定です。(敵マネージャにプレイヤーの情報を渡して判定してもらう)
マネージャ内にこんな感じのものを作って、
//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));
}
}
値の渡し方の参考になればと思います。
色々試してみてください(^^)
Re: 四聖龍神録2プログラミングの館について2
大変参考になるサンプルコードまでいただいてありがとうございますm(__)m
上の計算部分は本来は(下のココ)の部分に書くという意味ですよね 結局失敗したコードは消してしまったので実際に書くのはまた時間がかかりそうですm(__)m
マネージャークラスの中に作ろうとしていたのでそもそも考え方が違っていました( ̄▽ ̄;)
//プレイヤーが敵とぶつかったかどうか調べるため、プレイヤーの情報を渡す。
//プレイヤーにもAbstractEnemyクラス同様、player.hにgetX、getY関数を追加しました。
if (_enemyMgr->CheckHit(_player->getX(), _player->getY())) {
//_player->当たったときの処理();など
DrawString(0, 100, "Hitしました", GetColor(255, 255, 0));
}
上の計算部分は本来は(下のココ)の部分に書くという意味ですよね 結局失敗したコードは消してしまったので実際に書くのはまた時間がかかりそうですm(__)m