C ++游戏和装饰模式

时间:2009-08-28 11:12:07

标签: c++ properties decorator

我正在移植2D平台游戏,我需要一种从我的关卡中获得一些可扩展性的好方法。我不确定装饰师是否在这里是正确的,但没有其他想到的。也许我需要一些独特的东西。

无论如何,说我有一个基本的平铺,它有像它的图像,以及玩家是否可以通过它(背景或前景)。现在我想为它们添加属性,比如让一些瓷砖充当梯子,或者在接触时制造一些伤害或杀死玩家。也许有些人可能会消失。有些属性可以合并。

这听起来像装饰者,但我真的不喜欢这需要我的基类如何实现所有内容的虚拟版本,例如isLadder()isLethal()等。有更好的方法吗?我不会成为改变我的设计的人,因为它看起来像GoF书中的东西。

很抱歉,如果之前已经被问了一百万次,我在相关问题中找不到它。

5 个答案:

答案 0 :(得分:4)

如何设计类方法可以对Decorator的实现难度产生巨大影响 - 例如,不是isLadder()isLethal()等等,为什么不根据方法设置方法其中玩家可以与图块(enter(from_dir)exit(to_dir))等进行互动?致命的牌可以覆盖enter()方法来表示玩家应该被杀死;根据所需的功能,梯形图块可以覆盖enter()exit()

答案 1 :(得分:2)

Dav是对的。它可能是这样的:

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();
    }
}

答案 2 :(得分:2)

我会介绍类似TileTraits类的东西。每个tile都可以通过,well ...,“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); 
    }
};

答案 3 :(得分:1)

好吧,如果它是关于一堆is*()函数,你可以选择类似isIt(what)函数的函数,默认实现返回oh no!,它将用作派生的后备函数类。

答案 4 :(得分:1)

也许你应该看一下基于组件的对象。 以下是一个示例:http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/