ページ 11

横スクロールアクションゲームにおける消滅した敵の再出現のアルゴリズムについて

Posted: 2009年5月18日(月) 04:11
by けんたろうちゃん
横スクロールタイプの2Dアクションゲームを製作していますが、題名のアルゴリズムが思いつかず質問させてもらいます。
マリオ(3以降)やロックマンでは、進行上にいた敵が消滅しても、逆方向に戻ると復活しますよね。
この再現方法について教えてもらいたいです。
現在、画面上の敵の管理をSTLのlistで実現しており、新しい敵の出現は、そのlistに敵オブジェクトを投入という感じでやっています
ステージごとの敵の発生ポイントをtxtやcsvファイルに記録して、そこから読み出しで行おうと思っています
イメージとしては
敵1、座標(x,y)で
敵1、座標(x,y)で
敵2、座標(x,y)で
・・・・・・
のような感じです
これを上のようなことが可能なようにしたいのですが、うまい方法が思いつきません・・・
どなたか、教えてもらえませんか?

今、自分が考えている方法として、敵の発生について全てフラグを用意し、
敵A(座標(x、y)で発生)が消滅したら敵A(座標(x、y)で発生)を画面スクロールによる発生をONにする、といったものを考えています
しかし、これを綺麗にまとめることができない状態です・・・

非常にわかりにくい説明ですいません
一応簡単な図もつけておきました

Re:横スクロールアクションゲームにおける消滅した敵の再出現のアルゴリズムについて

Posted: 2009年5月18日(月) 12:12
by GPGA
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);
            }
        }
    }
}
 

Re:横スクロールアクションゲームにおける消滅した敵の再出現のアルゴリズムについて

Posted: 2009年5月19日(火) 00:38
by けんたろうちゃん
丁寧にコードつきでありがとうございます
非常に助かりました