2012-04-06 11 views
0

私はかなり初心者のC++コーダーであり、私はコンソールアドベンチャーゲームを作り始めています。 私のアドベンチャーゲームは、現在、コンソールアプリケーションのウィンドウ内を80文字幅×40行で歩いているプレイヤーキャラクターで構成されています。コンソールゲームマップ用の巨大なキャラクターか複数のキャラクター?

私のゲーム用のマップの保管方法にはわかりません。各マップは、色属性を持つ80×40のASCII文字で構成されます。

各80 x 40マップを独自の文字で保存する必要がありますか?これは完全に文字を表示するための正しい方法ですが、私はそれが中にちょうどcoutのすべての文字は良いアイデアだったと思うしていない場合ので、単一のマップが

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ループ。

So ..私のコンソールウィンドウ(上記のコード内)は、幅10文字、高さ5行です。 上記のコードでは、Charに1つのマップがあるため、各マップをロードするときに、それぞれを独自の配列に配置します。

マップ全体を1つのCharにすることを考えていましたが、forループのxとyをオフセットして必要なものだけを表示しました。

mapA[x + cWidth * y].Char.AsciiChar = map[y+offset][x+offset]; 

このようにマップはこのようになります。私は5行の「ABCDEFGHIJ」とは別に5行に「1234567890」を表示することができオフセットと

char map[cHeight][cWidth+1] = { 
    "1234567890ABCDEFGHIJ", 
    "1234567890ABCDEFGHIJ", 
    "1234567890ABCDEFGHIJ", 
    "1234567890ABCDEFGHIJ", 
    "1234567890ABCDEFGHIJ", 
}; 

私は複数のチャーを持っていれば、これを行う最も効果的な方法を知りたいと思います。私はクラスを作成する必要がありますか?文字を色で保存できますか? (クラス 'はまだC++で私にとって新しくなっています)。

地形を地図に描画し、オブジェクト(家、木)を追加する必要がありますか? または地図上に手動で描画するだけですか?

私はちょうどこれについて長すぎると思ったと思う少しの方向が必要です ありがとう!私はそれがこれはあなたが*の要素をノードへのポインタであるマップを作成します意味

Node* map[height][width] 

のマップを作成することですだろうとあなたは*要素をノードのことを定義することができ

+1

この質問は、http://gamedev.stackexchange.com/で尋ねるほうがはるかに良いでしょう。 –

+0

それが存在するかどうかは知りませんでした。ありがとう。 – FallingReign

+0

私はあなたの大きな問題は、あなたがC(あるいは次善の手続き型言語)をあまりにも多く考えていることだと思います。この演習が教育的でなければならないとすれば、私は配列なしで、b)生ポインタを使わずにc)キーワードforとnoを使わずにそれをしようと提案する。可能であれば(多少効率は低いかもしれませんが、アプリケーションで害を与えてはいけません)、C++のコンストラクトやライブラリを使用して習得する必要があります。 – bitmask

答えて

2

方法..あなたが家を作成したい場合。

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(); 
     } 
    } 

} 

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

よろしくお願いします。

+0

これは確かに私にある方向性を与えてくれました。私はこのアプローチを取る可能性が最も高いでしょう。別々のノード/マップで世界地図の各画面(80x40)を作成する価値があるのでしょうか、世界全体に対して1つのノード/マップを作成し、関連する部分だけを表示するのでしょうか? – FallingReign

+0

最良の選択肢は、世界地図を作成してから、世界の関連する部分だけを移動するようにプログラムを作成することです。たとえば、プレイヤーの位置を取得し、+ 10を上下に移動して描画/表示する必要があります。これがあなたの質問に答えている場合は、その質問の横にあるティックオプションを選択してください。それはどこに1 –

+0

ありがとうクリス私はこれを行こうとします。 – FallingReign

関連する問題