四聖龍神録2プログラミングの館について2

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
にこよん
記事: 112
登録日時: 2年前
住所: 大阪府
連絡を取る:

四聖龍神録2プログラミングの館について2

#1

投稿記事 by にこよん » 4週間前

現在、四聖龍神録2プログラミングの館を見ながらゲームを作成しているのですが、オブジェクトを別々にばらしてプログラムしています
敵や弾などを別のクラスで作成し、それをオブジェクトの数だけ生成するような設計ですが、このような設計をした場合、弾とプレイヤーのあたり判定計算や、(あたり判定がある)マップとのあたり判定計算はどのようにして行えばいいのでしょうか?

グローバル変数を使ってしまってはこのような設計をした意味をなさないと思うので設計に適した方法を教えてくださいm(__)m
最近は東方風アクションゲームを少しずつ作ってる人です
東方翠風燐FreeDownload⇒http://dxlib.o.oo7.jp/cgi/patio/read.cgi?no=212

アバター
もるも
記事: 44
登録日時: 3年前
連絡を取る:

Re: 四聖龍神録2プログラミングの館について2

#2

投稿記事 by もるも » 3週間前

マネージャークラスにまかせるのが良いと思います。
それぞれのマネージャークラスに当たり判定処理を作って、チェックしてほしいオブジェクトの情報をGet~関数を使って引数で渡す。
というようにすればゲームシーン内でやりとりできます。
読み取り専用の関数で値を渡して当たったかどうかの判定をしてもらい、自クラスで処理させればカプセル化が維持できます。
当たり判定計算のクラスを作っておくと使いまわせるので、コードを書く量も減らせるかと思います。

アバター
にこよん
記事: 112
登録日時: 2年前
住所: 大阪府
連絡を取る:

Re: 四聖龍神録2プログラミングの館について2

#3

投稿記事 by にこよん » 2週間前

やってみようと思ったのですが、マネージャークラス同士で値を(相互に)渡す方法が分からなかったのでできませんでした
すみませんm(__)m
最近は東方風アクションゲームを少しずつ作ってる人です
東方翠風燐FreeDownload⇒http://dxlib.o.oo7.jp/cgi/patio/read.cgi?no=212

アバター
もるも
記事: 44
登録日時: 3年前
連絡を取る:

Re: 四聖龍神録2プログラミングの館について2

#4

投稿記事 by もるも » 2週間前

簡単な例を上げてみます。
プレイヤーと敵同士の当たり判定です。(敵マネージャにプレイヤーの情報を渡して判定してもらう)

マネージャ内にこんな感じのものを作って、

コード:

//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));
	}
	
}

当たり判定に関しては完全ではないですが、
値の渡し方の参考になればと思います。
色々試してみてください(^^)
スクリーンショット (187).png

アバター
にこよん
記事: 112
登録日時: 2年前
住所: 大阪府
連絡を取る:

Re: 四聖龍神録2プログラミングの館について2

#5

投稿記事 by にこよん » 2週間前

大変参考になるサンプルコードまでいただいてありがとうございます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
最近は東方風アクションゲームを少しずつ作ってる人です
東方翠風燐FreeDownload⇒http://dxlib.o.oo7.jp/cgi/patio/read.cgi?no=212

アバター
もるも
記事: 44
登録日時: 3年前
連絡を取る:

Re: 四聖龍神録2プログラミングの館について2

#6

投稿記事 by もるも » 2週間前

はい、座標更新の後でOKです。
プレイヤーと弾、敵と弾、敵とプレイヤー、マップと~などなど組み合わせが多くコードが長くなると思いますので、
draw()やupdate()同様、新たに関数を作ってまとめておいたほうが見やすいと思います。

返信

“C言語何でも質問掲示板” へ戻る