0

私はかなり初心者の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++では新しいものです)。

マップにのみ地形を描画してから、オブジェクト(家、木)を追加する必要がありますか?または、すべてを手動でマップに描画しますか?

私はこれについて考えすぎたので、少し方向性が必要だと思います。ありがとう!

4

1 に答える 1

2

私がそれをする方法は、の地図を作成することです

Node* map[height][width]

これは、Node *要素へのポインターであるマップを作成し、Node*要素を次のように定義できることを意味します...

class Node{
char displayCharacter;
int posx,poxy
unsigned int r;  //red
unsigned int g;  //green
unsigned int b;  //blue
unsigned int a;  //alpha
display(); // This function will know how to display a node using the colour etc
};

次に、たとえば、家を作成したい場合は、モデルの中心点などを指定して、関数に描画することができます。

void createHouse(Node* center)
{
    if((center->posh > 0)&&(center->posh< maxheight))
    {
        if(map[center->posy-1][center->posx]!=NULL)
        {
             map[center->posy-1][center->posx]->displayCharacter = '_';
             map[center->posy-1][center->posx]->r = 255;
        }
    }

}

次に、主にあなたは次のようなものを持っているでしょう...

while(true)
{
     for(int i=0; i<maxheight; i++)
    {
        for(int j=0; j< maxwidth; j++)
        {
            map[i][j]->Display();
        }
    }

}

このサンプルコードがすべてあなたの助けになり、あなたの質問に答えてくれることを願っています。デバッグしたり、構文エラーを探したりしていません。コードにエラーがある場合は、修正する必要があります。

頑張って!

于 2012-04-06T03:33:15.007 に答える