我正在用 C++ 构建一个图 block 引擎。存储游戏中各个图 block 的逻辑属性的最有效方法是什么?我了解程序的渲染方面,但我无法获取一个简单的 ID 号并将其转换为一组实际的属性(例如瓷砖是否适合步行或易燃或是否可以触发事件等)
一个想法是拥有一个可能是任何类型的图 block 的图 block 对象,并根据类型打开某些 bool “开关”(请注意,以下大部分只是伪代码,并不意味着实际编译) :
class Tile
{
private:
int m_type;
bool m_walkable;
// etc...
public:
Tile( int type ) : m_type( type)
{
if( type == 0 )
{
m_walkable = true;
} else if( type == 1 ) {
m_walkable = false;
}
// etc etc would probably be a switch
// statement but you get the idea
}
};
就我个人而言,我不喜欢这个想法;我认为每种类型的图 block 都有自己的数据结构会更加优雅。我想象使用某种基于继承的系统,但我似乎无法将它们放在一起。从根本上说,我认为它应该看起来像这样:
enum class TileType
{
TILE_TYPE null, // 0
TILE_TYPE floor, // 1
TILE_TYPE wall, // 2
// etc ...
};
class BTile
{
private:
// Location and dimensions of tile
int m_xOffset;
int m_yOffset;
int m_width;
int m_height;
// Type of tile, initialized to 0 for base class
TileType m_type;
public:
// ...
};
class Floor : public BTile
{
private:
TileType = 1;
bool walkable = true;
// etc...
};
class Wall : public BTile
{
private:
TileType = 2;
bool walkable = false;
};
像这样的东西会感觉更有条理和灵活,同时还允许我将 Floor
和 Wall
对象插入到任何类型的函数中,期望 Tile
对象。问题是我似乎无法以实际有效的方式将所有这些放在一起 - 例如,我如何才能提供特定的图 block 类型及其关联的图 block ?例如,如果我正在将一个文本文件读入我的程序,我怎样才能从 001
到 Tile->Floor
?非常感谢有关此主题的任何建议或意见。
最佳答案
尝试使用 factory method .
最简单的方法是使用开关。
Tile* createTile(TileType tileType) {
switch(tileType) {
case TileType.floor: return new Floor;
case TileType.wall: return new Wall;
}
return nullptr;
}
通常不推荐这样做,因为每次添加新类型时都必须更新工厂。
或者,您可以使用一些技巧将类型注册到工厂。 一种方法是描述的方法 here .还有更多策略。
关于c++ - 在 C++ 中存储和访问图 block 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51515378/