私はかなり初心者のc++コーダーであり、コンソールアドベンチャーゲームを作り始めています。私のアドベンチャーゲームは現在、80文字幅x40行のコンソールアプリケーションウィンドウ内を歩き回るプレイヤーキャラクターで構成されています。
ゲームのマップを保存する方法がわかりません。各マップは、色属性を持つ80x40のASCII文字で構成されます。
80 x 40の各マップを独自のcharに保存する必要がありますか?したがって、1つのマップは次のようになります...
int cHeight = 5; // Reduced size for this example
int cHeight = 10; // Reduced size for this example
// Set up the characters:
char map[cHeight][cWidth+1] = {
"1234567890",
"1234567890",
"1234567890",
"1234567890",
"1234567890",
};
CHAR_INFO mapA[cWidth * cHeight];
for (int y = 0; y < cHeight; ++y) {
for (int x = 0; x < cWidth; ++x) {
mapA[x + cWidth * y].Char.AsciiChar = map[y][x];
mapA[x + cWidth * y].Attributes = FOREGROUND_BLUE | Black; //I have an enum setup with background colours.
}
}
// Set up the positions:
COORD charBufSize = {cWidth,cHeight};
COORD characterPos = {0,0};
SMALL_RECT writeArea = {0,0,cWidth-1,cHeight-1};
// Write the characters:
WriteConsoleOutputA(wHnd, mapA, charBufSize, characterPos, &writeArea);
これが文字を表示するための完全に正しい方法であるかどうかはわかりませんが、forループ内のすべての文字を単にcoutするのは良い考えではないと思いました。
つまり、私のコンソールウィンドウ(上記のコード)が幅10文字、高さ5行であるとしましょう。上記のコードでは、Charに単一のマップがあるため、各マップをロードするときに、それぞれを独自の配列に配置します。
マップ全体を1つのCharに入れることを考えていましたが、forループでxとyをオフセットすることによって必要なものだけを表示しました。
mapA[x + cWidth * y].Char.AsciiChar = map[y+offset][x+offset];
したがって、マップは次のようになります。
char map[cHeight][cWidth+1] = {
"1234567890ABCDEFGHIJ",
"1234567890ABCDEFGHIJ",
"1234567890ABCDEFGHIJ",
"1234567890ABCDEFGHIJ",
"1234567890ABCDEFGHIJ",
};
オフセットを使用すると、5行の「ABCDEFGHIJ」とは別に「1234567890」を5行に表示できます。
つまり、これを行うための最も効果的な方法を知りたいのですが、複数の文字を使用する必要がありますか?クラスを作成する必要がありますか?それなら私はキャラクターを色で保存することができますか?(クラス'はまだc++では新しいものです)。
マップにのみ地形を描画してから、オブジェクト(家、木)を追加する必要がありますか?または、すべてを手動でマップに描画しますか?
私はこれについて考えすぎたので、少し方向性が必要だと思います。ありがとう!