我正在使用 DirectX 用 C++(一种对我来说仍然很新的语言)编写一个简单的 2D 游戏,该游戏涉及以类似于笛卡尔的方式排序的 26x26 瓷砖网格 - 原点是最左边的空间0,0。每个图 block 都需要包含以下值:
- int
tileX
(从 0 到 25) - int
tileY
(从 0 到 25) - int
tileType
(0为空) - int
tileState
这些值将存储在文本文件 stage_n.txt
(228 行长)中,格式如下:
2 2 1
3 2 1
6 2 1
7 2 1
10 2 1
11 2 1
...
每组图 block 值由换行分隔,而每个值由空格分隔。第一个值是 tileX
,第二个值是 tileY
,第三个值是 tileType
。最初假定所有图 block 的 tileState
为 8
。
这些值将在游戏开始时循环绘制舞台,并且会在代码中经常更改。请注意,文件中仅列出被占用的图 block 。没有列出空的磁贴。
我的第一个想法是使用多维数组 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,我应该将文本文件放在哪里?
最佳答案
我怀疑在性能上会有什么不同,因为访问数组和访问结构成员都只涉及从某个地址访问一些内置偏移量。如果它真的很重要,因为您发现这段代码是一个瓶颈,那么您将需要进行一些性能测量。我几乎可以保证在任何一种情况下编译后的代码都是相同的。
无论如何,在我看来使用结构是最合适的。虽然结构的所有成员都是同一类型,但它们的含义并不相同。他们当然有可能有不同的类型。一个结构很好地将这些不同但相关的值组合在一起。
读取一维数组应该像这样简单:
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;
}
不过,您没有理由不能拥有二维结构数组。那会更好地代表您的网格。在这种情况下,您只需要在读取文件时跟踪 x
和 y
位置(而不是 i
)。
上面的文件读取代码在错误检查方面没有做太多工作。如果你想精确,你应该考虑到底什么是有效的。例如,即使所有数据都在一行中,上面的代码仍会接受数据。如果您想逐行读取文件,则需要使用 std::getline
然后解析每一行。
关于c++ - 在 C++ 中按文件填充数组或结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22046785/