#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,
int yNum,
int vxSize,
int vySize
)
{
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,
int ySize
)
{
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.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);
do {
if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
DivGraph divGraph;
string key = findData.cFileName;
key.erase(key.size() - 4, 4);
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