ページ 1 / 1
四聖龍神録2プログラミングの館について2
Posted: 2019年1月23日(水) 02:14
by にこよん
現在、四聖龍神録2プログラミングの館を見ながらゲームを作成しているのですが、オブジェクトを別々にばらしてプログラムしています
敵や弾などを別のクラスで作成し、それをオブジェクトの数だけ生成するような設計ですが、このような設計をした場合、弾とプレイヤーのあたり判定計算や、(あたり判定がある)マップとのあたり判定計算はどのようにして行えばいいのでしょうか?
グローバル変数を使ってしまってはこのような設計をした意味をなさないと思うので設計に適した方法を教えてくださいm(__)m
Re: 四聖龍神録2プログラミングの館について2
Posted: 2019年1月25日(金) 17:50
by もるも
マネージャークラスにまかせるのが良いと思います。
それぞれのマネージャークラスに当たり判定処理を作って、チェックしてほしいオブジェクトの情報をGet~関数を使って引数で渡す。
というようにすればゲームシーン内でやりとりできます。
読み取り専用の関数で値を渡して当たったかどうかの判定をしてもらい、自クラスで処理させればカプセル化が維持できます。
当たり判定計算のクラスを作っておくと使いまわせるので、コードを書く量も減らせるかと思います。
Re: 四聖龍神録2プログラミングの館について2
Posted: 2019年2月04日(月) 15:59
by にこよん
やってみようと思ったのですが、マネージャークラス同士で値を(相互に)渡す方法が分からなかったのでできませんでした
すみませんm(__)m
Re: 四聖龍神録2プログラミングの館について2
Posted: 2019年2月04日(月) 18:30
by もるも
簡単な例を上げてみます。
プレイヤーと敵同士の当たり判定です。(敵マネージャにプレイヤーの情報を渡して判定してもらう)
マネージャ内にこんな感じのものを作って、
コード:
//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
Posted: 2019年2月05日(火) 03:41
by にこよん
大変参考になるサンプルコードまでいただいてありがとうございますm(__)m
//プレイヤーが敵とぶつかったかどうか調べるため、プレイヤーの情報を渡す。
//プレイヤーにもAbstractEnemyクラス同様、player.hにgetX、getY関数を追加しました。
if (_enemyMgr->CheckHit(_player->getX(), _player->getY())) {
//_player->当たったときの処理();など
DrawString(0, 100, "Hitしました", GetColor(255, 255, 0));
}
マネージャークラスの中に作ろうとしていたのでそもそも考え方が違っていました( ̄▽ ̄;)
上の計算部分は本来は(下のココ)の部分に書くという意味ですよね
コード:
_background->update();
_player->update();
_board->update();
_enemyMgr->update();
// ←ココ
結局失敗したコードは消してしまったので実際に書くのはまた時間がかかりそうですm(__)m
Re: 四聖龍神録2プログラミングの館について2
Posted: 2019年2月05日(火) 12:50
by もるも
はい、座標更新の後でOKです。
プレイヤーと弾、敵と弾、敵とプレイヤー、マップと~などなど組み合わせが多くコードが長くなると思いますので、
draw()やupdate()同様、新たに関数を作ってまとめておいたほうが見やすいと思います。