C++ C++;游戏与装饰图案

C++ C++;游戏与装饰图案,c++,properties,decorator,C++,Properties,Decorator,我正在移植一个2D平台,我需要一个很好的方法来获得一些扩展性。我不确定这里的装潢师是否正确,但我没想到其他的。也许我需要一些独特的东西 不管怎样,假设我有一个基本的平铺,它有一些东西,比如它的图像,以及玩家是否可以通过它(背景或前景)。现在我想给它们添加一些属性,比如让一些瓷砖充当梯子,或者在接触时伤害或杀死玩家。也许有些会消失。某些属性可以组合 这听起来像是decorator,但我真的不喜欢它如何要求我的基类实现所有东西的虚拟版本,比如islader(),islandhal(),等等。有更好的

我正在移植一个2D平台,我需要一个很好的方法来获得一些扩展性。我不确定这里的装潢师是否正确,但我没想到其他的。也许我需要一些独特的东西

不管怎样,假设我有一个基本的平铺,它有一些东西,比如它的图像,以及玩家是否可以通过它(背景或前景)。现在我想给它们添加一些属性,比如让一些瓷砖充当梯子,或者在接触时伤害或杀死玩家。也许有些会消失。某些属性可以组合

这听起来像是decorator,但我真的不喜欢它如何要求我的基类实现所有东西的虚拟版本,比如
islader()
islandhal()
,等等。有更好的方法吗?我不会改变我的设计,让它看起来像是GoF书中的东西


很抱歉,如果这个问题以前被问过一百万次,我在相关的问题中没有找到它。

如何设计类方法可以极大地改变Decorator的实现难度-例如,代替
islader()
isllahal()
等等,为什么没有基于玩家与互动程序交互方式的方法(
enter(from_dir)
exit(to_dir)
),等等?致命磁贴可以覆盖
enter()
方法,发出玩家应该被杀的信号;梯形图平铺可以覆盖
enter()
exit()
,这取决于所需的功能。

好吧,如果它是关于一堆
is*()
函数,您可以选择类似
isIt(what)
函数的内容,返回
哦,不默认实现,将在派生类中用作回退。

是正确的。可能是这样的:

class Tile
{
    public bool allowsPassThrough()
    {}

    // couldn't find a better name for this method
    public void passThrough(Player player)
    {}
}

class LethalTile extends Tile
{
    public void passThrough(Player player)
    {
        player.kill();
    }
}

我会介绍一些类似TileTraits类的东西。每个磁贴都可以通过“getTraits()”方法返回其特征。TileTraits可以扩展以支持任意多个平铺功能。类似于:

class TileTraits
{
public: 
   enum TileTrait{ Walkable  = 1, 
                   Climbable = 1 << 1, 
                   Lethal    = 1 << 2 };
private:
   TileTrait m_TraitSet;
};

class BaseTile
{
public:
   virtual TileTraits getTraits() const;
};

class LadderTile : public BaseTile
{
public:
   TileTraits getTraits() const { 
      return TileTraits( TileTraits::Walkable | TileTraits::Climbable); 
    }
};
class TileTraits
{
公众:
枚举TileTrait{Walkable=1,

攀爬=1也许你应该看看基于组件的对象。
这里有一个例子:

非常有趣-我将使用它的方式是“如果(playerPressedClimbButton&&isLadder(tileImStandingOn))爬升”;那么它会变成“如果(playerPressedClimb){tile->pressClimb()}覆盖的函数是PressGramb,对于梯子,它返回攀爬行为?几乎是这样-虽然你可以对它进行更多的概括,并且该按钮可以简单地变成“向上移动”按钮-如果你尝试“向上移动”,其他瓷砖可能会有不同的动作“在他们身上。这只是一种灵活的处理方法。”黑客,实际上:我不知道C++,所以我提出了一些伪代码。