代码之家  ›  专栏  ›  技术社区  ›  Tesserex

C++游戏与装饰模式

  •  2
  • Tesserex  · 技术社区  · 15 年前

    我移植了一个2d平台,我需要一个很好的方法从我的水平图块中获得一些扩展性。我不确定这里的装饰是否正确,但没有其他的想法。也许我需要一些独特的东西。

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

    这听起来像decorator,但我真的不喜欢这样要求我的基类实现所有东西的虚拟版本,比如 isLadder() ,请 isLethal() 等等。有更好的方法吗?我不会是那个改变我设计的人,只是让它看起来像是从Gof的书中拿出来的。

    对不起,如果这个问题以前被问过无数次,我在相关问题中没有找到。

    5 回复  |  直到 15 年前
        1
  •  4
  •   Amber    15 年前

    你如何设计你的类方法可以在实现decorator有多困难上产生巨大的差异-例如,而不是 isLadder() isLethal() 等等,为什么没有基于玩家可以与一个方块交互的方式的方法呢?( enter(from_dir) ,请 exit(to_dir) )等等?致命的瓷砖可以覆盖 enter() 表示玩家应该被杀的方法;梯形图块可以覆盖 () exit() 取决于所需的功能。

        2
  •  2
  •   Community CDub    7 年前

    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();
        }
    }
    
        3
  •  2
  •   SadSido    15 年前

    我会介绍一些像tiletraits类的东西。每个图块都可以通过gettraits()方法返回其特性。可以扩展tiletraits以支持任意多个tile功能。类似于:

    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); 
        }
    };
    
        4
  •  1
  •   Michael Krelin - hacker    15 年前

    如果是关于一堆 is*() 功能,你可以选择 isIt(what) 函数,返回 oh no! 默认实现,将在派生类中用作回退。

        5
  •  1
  •   Adis H    15 年前

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