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