ページ 11

複数の派生クラスのソート

Posted: 2010年9月19日(日) 17:04
by SG
いつも大変お世話になっております。
SGと申します。

Cレベル(苦Cさん一通り)
C++レベル(やさしいC++一通り)

標記の件での質問です。
class Map_Manager から派生してclass Unitとclass Mapchipとしました。
UnitのオブジェクトとMapchipのオブジェクトをclass Map_Managerのメンバ変数(座標)でソートして
描画したいのですが手詰まりになっています。

クラスの設計が間違っているような気が徐々にしていますが
ご指導いただけますと幸いです。よろしくお願い致します。

ちなみにまずソートを抜きにして下のようにトライしてみたのですが
AddSprite(&Unit)としても
it->AnimePattern()
でUnit.AnimePattern()ではなくMap_Manager.AnimePattern()
が呼び出されているようです。

int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    GetHitKeyStateAll_2();//現在のキー入力処理を行う
    return 0;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
     
     Unit Unit;
     Map_Manager Map_Manager;

    while(ProcessLoop()==0){//メインループ
        
        Map_Manager.AddSprite(&Unit);

        if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
        ScreenFlip();//裏画面反映
    }

    DxLib_End();//DXライブラリ終了処理
    return 0;
}    

class Map_Manager{
    public:
        int Obj_x;//3次元座標。この3つの要素でソートしたい
        int Obj_y;
        int Obj_h;
        int image[24];
        
        Map_Manager();
        virtual ~Map_Manager();
        std::list<Map_Manager> Object_list;

        virtual int AnimePattern();    
        void AddSprite(Map_Manager* _MapManager);        
};

Map_Manager::Map_Manager(){}
Map_Manager::~Map_Manager(){}

void Map_Manager::AddSprite(Map_Manager* _Map_Manager){
    Object_list.push_back(*_Map_Manager);
    std::list<Map_Manager>::iterator it = Object_list.begin(); // イテレータ
    while( it != Object_list.end() )  // listの末尾まで
    {
        DrawGraph(it->Obj_x, it->Obj_y, it->image[it->AnimePattern()], TRUE);  // 要素を出力
        ++it;  // イテレータを1つ進める
    }
}

int Map_Manager::AnimePattern(){return 0;}    

class Unit: public Map_Manager{
    public:            
            int img;
            int cnt;
    public:
            Unit();
            int AnimePattern();
        };

Unit::Unit(){
    Obj_x=320;
    Obj_y=240;
    cnt=0;
    img=0;
    
    LoadDivGraph( "data/grf/***.png" , 24 , 6 , 4 , 64 , 64 , image ) ;
    }
}

int Unit::AnimePattern(){
    cnt++;
    img=(cnt%60)/10;
    return img;
}

class Mapchip: public Map_Manager{
    public:
            int chip_number;
    public:
            int AnimePattern();
        };

Mapchip::Mapchip(){
        LoadDivGraph( "data/grf/***.png" , 24 , 6 , 4 , 64 , 48 , image ) ;
}

int Mapchip::AnimePattern(){return 0;}
画像

Re:複数の派生クラスのソート

Posted: 2010年9月19日(日) 18:09
by Poco
Object_listに格納する際に、Map_Managerクラスに丸めているため、
期待するメンバ変数が呼ばれていないのでは?

×std::list<Map_Manager> Object_list;
○std::list<Map_Manager*> Object_list;

Re:複数の派生クラスのソート

Posted: 2010年9月19日(日) 18:56
by SG
ぽこさん

お返事ありがとうございます。
はやい・・・一日悩んでたのに・・・^^;

なるほど…各クラスのポインタを格納するリスト、ということですか。
(*it)->Obj_x
の様にすることで一応動いたのですが、使い方はこれで合っていますか?
こんがらかってきました。

この場合(*it)が指すのが派生クラスのポインタということですか?
ということはitはポインタのポインタ?
何を弄っているのかわからなくなってしまいました。

動いたので”解決”とさせていただこうかと思ったのですが
理屈がわからずに動いている状態なので
お手数ですがご教示いただけますでしょうか?

Re:複数の派生クラスのソート

Posted: 2010年9月19日(日) 23:04
by Poco
> この場合(*it)が指すのが派生クラスのポインタということですか?
> ということはitはポインタのポインタ?

そう思っていただいて構いません。

Re:複数の派生クラスのソート

Posted: 2010年9月20日(月) 00:51
by SG
ぽこさん

ご回答ありがとうございました。