ハッカーじゃないけど面白そうなので、色々考えました。
案1 最近のC++は日本語識別子が使える→enumかconst intにする
結論:あまりうれしくない。enumはC#と違って名前が被りやすいのでウザくなる可能性大
案2 マクロを使う
結論:ファイル構成が分かりづらくなる。自己満足の誰得システムになると思われる。
案3 配列とmapとchar*とstringを全部使う。
この案は割と気に入っています。コード例を以下に載せておきます。
コード:
#include <iostream>
#include <map>
#include <string>
using namespace std;
#define TRUE 1
#define FALSE 0
typedef struct { const char *key; const char *filename; } IMAGE_DATA;
const IMAGE_DATA IMAGE_LIST[] = {
{"主人公" , "画像/キャラクタ00.png"},
{"ヒロイン" , "画像/キャラクタ01.png"},
{"雑魚敵1" , "画像/キャラクタ02.png"},
{"雑魚敵2" , "画像/キャラクタ03.png"},
{"雑魚敵3" , "画像/キャラクタ04.png"},
{"ラスボス" , "画像/キャラクタ05.png"},
};
const int MAX_IMAGE = sizeof(IMAGE_LIST) / sizeof(IMAGE_DATA);
map<string, int> images;
// スタブのための関数
int LoadGraph(string fn) {
static int cnt = 100;
cout << "LoadGraph(" << fn << ")がロードされました.\n";
return cnt++;
}
void DrawGraph(int i, int j, int h, int b) {
cout << "DrawGraph: " << IMAGE_LIST[h-100].filename << "を表示しています.\n";
}
int main() {
// 初期化
for (int i = 0; i < MAX_IMAGE; ++i)
images[IMAGE_LIST[i].key] = LoadGraph(IMAGE_LIST[i].filename);
// 表示
cout << "シーン1" << endl;
DrawGraph(0, 0, images["主人公"], TRUE);
DrawGraph(0, 0, images["雑魚敵1"], TRUE);
DrawGraph(0, 0, images["雑魚敵2"], TRUE);
cout << "シーン2" << endl;
DrawGraph(0, 0, images["主人公"], TRUE);
DrawGraph(0, 0, images["ラスボス"], TRUE);
DrawGraph(0, 0, images["雑魚敵3"], TRUE);
cout << "シーン3" << endl;
DrawGraph(0, 0, images["主人公"], TRUE);
DrawGraph(0, 0, images["ヒロイン"], TRUE);
return 0;
}
実行結果
コード:
$ ./a.exe
LoadGraph(画像/キャラクタ00.png)がロードされました.
LoadGraph(画像/キャラクタ01.png)がロードされました.
LoadGraph(画像/キャラクタ02.png)がロードされました.
LoadGraph(画像/キャラクタ03.png)がロードされました.
LoadGraph(画像/キャラクタ04.png)がロードされました.
LoadGraph(画像/キャラクタ05.png)がロードされました.
シーン1
DrawGraph: 画像/キャラクタ00.pngを表示しています.
DrawGraph: 画像/キャラクタ02.pngを表示しています.
DrawGraph: 画像/キャラクタ03.pngを表示しています.
シーン2
DrawGraph: 画像/キャラクタ00.pngを表示しています.
DrawGraph: 画像/キャラクタ05.pngを表示しています.
DrawGraph: 画像/キャラクタ04.pngを表示しています.
シーン3
DrawGraph: 画像/キャラクタ00.pngを表示しています.
DrawGraph: 画像/キャラクタ01.pngを表示しています.