横スクロールタイプの2Dアクションゲームを製作していますが、題名のアルゴリズムが思いつかず質問させてもらいます。
マリオ(3以降)やロックマンでは、進行上にいた敵が消滅しても、逆方向に戻ると復活しますよね。
この再現方法について教えてもらいたいです。
現在、画面上の敵の管理をSTLのlistで実現しており、新しい敵の出現は、そのlistに敵オブジェクトを投入という感じでやっています
ステージごとの敵の発生ポイントをtxtやcsvファイルに記録して、そこから読み出しで行おうと思っています
イメージとしては
敵1、座標(x,y)で
敵1、座標(x,y)で
敵2、座標(x,y)で
・・・・・・
のような感じです
これを上のようなことが可能なようにしたいのですが、うまい方法が思いつきません・・・
どなたか、教えてもらえませんか?
今、自分が考えている方法として、敵の発生について全てフラグを用意し、
敵A(座標(x、y)で発生)が消滅したら敵A(座標(x、y)で発生)を画面スクロールによる発生をONにする、といったものを考えています
しかし、これを綺麗にまとめることができない状態です・・・
非常にわかりにくい説明ですいません
一応簡単な図もつけておきました
横スクロールアクションゲームにおける消滅した敵の再出現のアルゴリズムについて
Re:横スクロールアクションゲームにおける消滅した敵の再出現のアルゴリズムについて
1.敵キャラクターそれぞれに固有のIDを付ける 2.敵の発生位置に達した時に、その敵のIDが既に発生しているかどうかを確認する。 3.発生していれば何もせず、発生していなければ発生させる。 以下プログラム #include <vector> #include <list> #include <algorithm> // 敵出現データ struct EnemyAppearance { int type; // 敵のタイプ int x; // 敵の出現X座標 }; std::vector<EnemyAppearance> g_EnemyAppearance; // csvファイルから読み込む // 敵のデータ struct EnemyData { int id; // 固有ID int type; // 敵のタイプ ・・・ // その他データ }; std::list<EnemyData> g_EnemyData; // ゲーム内の敵情報 int g_nScrollX, g_nScrollXBack; // 現在のスクロール座標と、1フレーム前のスクロール座標 // IDサーチ用のクラス class CheckAppearance { int id_; public : CheckAppearance(int id) : id_(id){} bool operator ()(EnemyData data) { return data.id == id_; } }; // 敵の出現チェック void EnemyAppearanceCheck() { // g_EnemyAppearanceは、csvからデータを読み込んだものとする // 固有IDはg_EnemyAppearanceのインデックスを使用する for (unsigned int i = 0; i < g_EnemyAppearance.size(); ++i) { if (g_EnemyAppearance.x <= g_nScrollX && g_EnemyAppearance.x >= g_nScrollXBack) { // 敵出現領域に入った場合 std::list<EnemyData>::iterator it; #if 1 // std::find_ifを使用した場合のIDサーチ CheckAppearance checkAppearance(i); it = std::find_if(g_EnemyData.begin(), g_EnemyData.end(), checkAppearance); #else // 普通にイテレータを回した場合のIDサーチ for (it = g_EnemyData.begin(); it != g_EnemyData.end(); ++it) { if (it->id == i) { break; } } #endif if (it == g_EnemyData.end()) { // 出現位置に入った敵がまだ発生していないので、発生させる EnemyData data; data.id = i; data.type = g_EnemyAppearance.type; g_EnemyData.push_back(data); } } } }