2012-04-06 71 views
0

我是一个漂亮的新手c + +编码器,我开始做一个控制台冒险游戏。 我的冒险游戏目前由一个玩家角色组成,玩家角色在控制台应用程序窗口内走动,角色宽度为80字符x 40行。控制台游戏地图的巨型字符或多个字符?

我不知道如何处理存储我的游戏地图。每张地图将包含80 x 40个带有颜色属性的ASCII字符。

我应该存储每个80 x 40地图在自己的char?所以在一张地图看起来像......

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

林不知道这是否是完全显示字符正确的方式,但我不认为这是一个好主意,只是COUT在每一个字符for循环。

所以..让我说我的控制台窗口(在上面的代码)是10个字符宽和5行高。 在上面的代码中,我在Char中有一个映射,所以当加载每个映射时,我会将每个映射放到它们自己的数组中。

我想整个地图放入一个单一的字符,但只显示我需要通过抵消循环中的x和y。

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

所以地图看起来更像这样;

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

带有偏移量我可以在5行上分别显示'1234567890'5行上的'ABCDEFGHIJ'。

所以总之我想知道最有效的方法来做到这一点,我应该有多个字符?我应该创建一个班级吗?那么我可以存储字符的颜色? (在C++中,类'对我来说仍然是新的)。

我应该只在地图上绘制地形,然后添加对象(房屋,树木)吗? 或者只是手动将它全部绘制在地图上?

我想我只是想过这个太长,需要一点点方向 谢谢!

+1

这个问题最好在http://gamedev.stackexchange.com/上提问! – 2012-04-06 00:19:01

+0

甚至不知道它存在。谢谢。 – FallingReign 2012-04-06 00:20:07

+0

我认为你更大的问题在于你在C(或者下一个最好的过程语言)中思考得太多。所以,如果这个练习应该是教育性的,我建议你尝试这样做:a)没有数组b)不使用原始指针; c)没有关键字'for'和'while'。这是可能的(虽然效率可能稍低,但在应用程序中不应该受到伤害),并且会迫使您使用和学习一些C++构造和库。 – bitmask 2012-04-06 00:24:21

回答

2

我会做这将是创建地图的

Node* map[height][width] 

一个这意味着您将创建的地图,是指向节点*元素,你可以定义节点*元素是方式.. 。

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)还是为整个世界创建一个节点/地图并仅显示相关部分值得? – FallingReign 2012-04-06 07:26:45

+0

最好的选择是在程序开始时创建一个世界地图,然后当你移动只显示世界的相关部分。因此,例如,让玩家的位置和+ - 10上下是你应该渲染/绘制/显示。如果这回答了您的问题,请选择问题旁边的勾号选项。它说什么1 – 2012-04-06 07:57:08

+0

谢谢克里斯我会放弃这一点。 – FallingReign 2012-04-06 08:04:20