我用C ++编写一个简单的2D游戏(一种对我来说还很新的语言)使用DirectX,它涉及以类似笛卡儿的方式排序的26x26个图块的网格 - 原点是最左边的0,0的空间。每个磁贴都需要包含值:
tileX
(从0到25)tileY
(从0到25)tileType
(0为空)tileState
这些值将存储在文本文件stage_n.txt
(228行)中,其格式如下:
2 2 1
3 2 1
6 2 1
7 2 1
10 2 1
11 2 1
...
每组图块值由新行分隔,而每个值由空格分隔。第一个值为tileX
,第二个值为tileY
,第三个值为tileType
。最初假设所有图块的tileState
都为8
。
这些值将循环通过在游戏开始时绘制舞台,并且将在代码中经常更改。请注意,仅占用的图块列在文件中。没有列出空的瓷砖。
我的第一个想法是使用多维数组tileMap[25][25][1]
,如下所示:
tileMap[0] = 0 (X value) // All tiles on line X0
tileMap[0][0] = 0 (Y value) // First tile on line 0 (at Y0)
tileMap [0][0][0] // Tile type
tileMap [0][0][1] // Tile state
tileMap[0][1] = 1 (Y value) // Second tile on line 0 (at Y1)
tileMap [0][1][0] // Tile type
tileMap [0][1][1] // Tile state
... through to 25 (the last tile on line 0)
tileMap[1] = 1 (X value) // All tiles on line X1
tileMap[1][0] = 0 (Y value)
...
tileMap[1][0] = 1 (Y value)
...
...
... through to 25 (the last line)
但我也在考虑使用结构:
struct tileData{
int tileX;
int tileY;
int tileType;
int tileState;
} tile[676]; // 676 is the total amount of tiles.
回到我的问题;在这种情况下,使用结构或数组会更有效吗?如何使用上述文本文件中的数据初始化/填充更简单的选项?我试图在网上模仿很多例子(使用过ifstream),但它们似乎都没有效果。
这个问题可能已经得到了很多回答,但我无法理解如何做到这一点。我希望这足够了。谢谢!
编辑:此外,如果我使用VS2013,我应该在哪里放置我的文本文件?
答案 0 :(得分:2)
我怀疑性能会有什么不同,因为访问数组和访问结构的成员只涉及从某个地址访问某些烘焙偏移量。如果真的很重要,因为你发现这个代码是瓶颈,那么你需要做一些性能测量。我几乎可以保证在任何一种情况下编译的代码都是相同的。
无论如何,在我看来,使用结构最合适。虽然结构的所有成员都是相同的类型,但它们的含义不同。它们当然可能有不同的类型。一个结构很好地将这些不同但相关的值组合在一起。
读入你的1D数组应该简单:
std::ifstream file("stage_n.txt");
int i = 0;
while (file >> tile[i].tileX
>> tile[i].tileY
>> tile[i].tileType) {
tile[i].tileState = 0;
++i;
}
但是没有理由你不能拥有2D数组结构。这样可以更好地代表你的网格。在这种情况下,您只需要在从文件中读取时跟踪x
和y
位置(而不是i
)。
上面的文件读取代码在错误检查方面没有太大作用。如果你想要精确,你应该考虑究竟应该有效的是什么。例如,即使数据全部在一行上,上述代码仍会接受数据。如果您想逐行阅读文件,则需要使用std::getline
然后解析每一行。
答案 1 :(得分:1)
我会使用2d Tile对象数组(或者std :: vector或std :: array,总是优先于裸数组)
struct Tile
{
int tileType;
int tileState;
}
Tile grid[25][25];
不要将tile的X / Y放在struct中。这种知识隐含地编码在数组中的位置
答案 2 :(得分:0)
我认为数组和结构之间的性能没有区别。但是更好的代码存在差异 - 使用struct tilData并为它编写一个istream-operator。
std::istream& operator>>( std::istream& in, tileData& td )
{
if( in >> td.tileX >> td.tileY >> td.tileType )
td.tileState = 8;
return in;
}
您可以这样阅读:
size_t n = 0;
for( ; file >> tile[n]; ++n )
;
if( file.eof() ) // check whether End Of File is reached
{
cout << "Ok " << n << "Tiles read\n";
}