LuaTest - graph.h

// Project      LuaTest
// Source       graph.h
// Date         08/03/18
// Author       yamahara
// Environment  Bcc++ & DXライブラリ & Lua
// Etc          Copyright(C) 2008 sansuido. All rights reserved.

#ifndef         GRAPH_DEF
#define         GRAPH_DEF

#include        "data.h"

using namespace std;

class Graph {

private:
        int             handle_;
        int             width_, height_;
public:
        
        Graph() : handle_(0), width_(0), height_(0) {}
        virtual ~Graph() {}
        
        virtual int     load(
                        // 読み込み
        const char *    fileName
        )
        {
                handle_ = LoadGraph(fileName);
                if (handle_) GetGraphSize(handle_, &width_, &height_);
                return handle_;
        }
        
        virtual int     set(int handle, int width, int height) { handle_ = handle; width_ = width; height_ = height; }
        virtual int     getHandle(void) { return handle_; }
        virtual int     getWidth(void) { return width_; }
        virtual int     getHeight(void) { return height_; }
        virtual void    del(void) { DeleteGraph(handle_); }
};

class DivGraph {

private:
        int             num_;           // 総数
        int             xNum_, yNum_;   // 縦横
        vector<Graph>   vgraph_;        // 積み込み用
        Graph           graph_;         // 作業用
        
public:
        
        // コンストラクタ・デストラクタ
        DivGraph () : num_(0), xNum_(0), yNum_(0), vgraph_(), graph_() {}
        virtual ~DivGraph() {}
        
        virtual int     load(
                        // 読み込み
        const char *    fileName,       // ファイル名
        int             num,            // トータル数
        int             xNum,           // x
        int             yNum,           // y
        int             vxSize,         // x分割サイズ
        int             vySize          // y分割サイズ
        )
        {
                int *   handlePtr;
                handlePtr = new int[num];
                int     stat;
                stat = LoadDivGraph(fileName,
                        num_ = num,
                        xNum_ = xNum, yNum_ = yNum,
                        vxSize, vySize, handlePtr);
                
                for (int i = 0; i < num; i++) {
                        graph_.set(handlePtr[i], vxSize, vySize);
                        vgraph_.push_back(graph_);
                }
                delete handlePtr;
                return stat;
        }
        
        virtual int     load(
                        // 読み込み(分割数など自動計算)
        const char *    fileName,       // ファイル名
        int             xSize,          // x分割サイズ
        int             ySize           // y分割サイズ
        )
        {
                int     xNum;
                int     yNum;
                int     stat = graph_.load(fileName);
                
                xNum = graph_.getWidth() / (xSize ? xSize : 1);
                yNum = graph_.getHeight() / (ySize ? ySize : 1);
                graph_.del();
                
                return load(fileName, xNum * yNum, xNum, yNum, xSize, ySize);
        }
        
        virtual BOOL    checkNo(int v) { return (v >= 0 && v < num_); } // 範囲内かをチェック
        virtual int     getNum(void) { return num_; }
        virtual Graph   getGraph(int v) { if (checkNo(v) == TRUE) { graph_ = vgraph_.at(v); } return graph_; }
        virtual Graph   *getGraphPtr(int v) { if (checkNo(v) == FALSE) return NULL; graph_ = vgraph_.at(v); return &graph_; }   // コピーして渡す(安全のため)
        virtual int     getHandle(int v) { if (checkNo(v) == FALSE) return -1; getGraph(v); return graph_.getHandle(); }
        virtual int     getWidth(int v) { if (checkNo(v) == FALSE) return 0; getGraph(v); return graph_.getWidth(); }
        virtual int     getHeight(int v) { if (checkNo(v) == FALSE) return 0; getGraph(v); return graph_.getHeight(); }
        virtual int     getX(void) { return xNum_; }
        virtual int     getY(void) { return yNum_; }
        
        virtual void    del(
        void
        )
        {
                
                for (int i = 0; i < num_; i++) {
                        getGraph(i);
                        graph_.del();
                }
                vgraph_.clear();
        }
};


class MapGraph {

private:
        int     num_;
        
public: 
        
        map<string, DivGraph>   mgraph_;
        
        virtual int     load(
        const char      *path
        )
        
        {
                WIN32_FIND_DATA findData;
                HANDLE  hFind;
                string  rootPath;       // 作業用だよー
                
                rootPath = path;
                
                // イテレータ参照して比較って怖いのかな……どっちでもよさげだけど
//              if (*rootPath.end() != '\\') {
                if (rootPath.at(rootPath.size() - 1) != '\\') {
                        rootPath += '\\';
                }
                rootPath += "*.ini";
                
                num_ = 0;
                hFind = FindFirstFile(rootPath.c_str(), &findData);
                if (hFind == INVALID_HANDLE_VALUE) return -1;
                rootPath.erase(rootPath.size() - 5, 5); // "*.ini"を削除
                
                do {
                        if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
                                DivGraph        divGraph;
                                
                                // キー
                                string  key = findData.cFileName;
                                key.erase(key.size() - 4, 4);   // ".ini"を削除
                                
                                string  fileName = rootPath + findData.cFileName;
                                int     x = GetPrivateProfileInt("info", "x", 32, fileName.c_str());
                                int     y = GetPrivateProfileInt("info", "y", 32, fileName.c_str());
                                
                                fileName = rootPath + key + ".bmp";
                                int     stat = divGraph.load(fileName.c_str(), x, y);
                                
                                mgraph_.insert(map<string, DivGraph>::value_type(key, divGraph));
                                
                                num_++;
                        }
                        
                } while (FindNextFile(hFind, &findData));
                
                return 0;
        }
        
                        // ゲッター
        virtual int     getNum() { return num_; }
        virtual int     getKeyHandle(string key, int no) { return mgraph_[key].getHandle(no); }
        virtual DivGraph *      getDivGraphPtr(string key) { return &mgraph_[key]; }
        virtual DivGraph        getDivGraph(string key) { return mgraph_[key]; }
};

#endif