c++ - 在 C++ 中存储和访问图 block 属性

标签 c++ 2d game-engine

我正在用 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;
};

像这样的东西会感觉更有条理和灵活,同时还允许我将 FloorWall 对象插入到任何类型的函数中,期望 Tile 对象。问题是我似乎无法以实际有效的方式将所有这些放在一起 - 例如,我如何才能提供特定的图 block 类型及其关联的图 block ?例如,如果我正在将一个文本文件读入我的程序,我怎样才能从 001Tile->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/

相关文章:

c++ - 从导入的二维数组计算平均值

java - 使用处理在双 for 循环中旋转每个单独的元素时遇到问题

C++ DLL 卸载析构函数?

c++ - 指向模板函数的空指针

c# - 用于碰撞检测的边界框重叠并导致问题

c++ - 为什么不能在 2D vector 中 push_back? C++

ios - "How To Make a Tile-Based Game with Cocos2D 2.X"使用cocos2d V3制作本教程

parsing - 从《星际争霸 2》重播中获取具体指标

c++ - OpenAL 失真的常见来源?

C++ 成员函数和类大小