gpt4 book ai didi

c++ - 在C++中,不同的游戏实体应该有不同的类吗?或者它应该在一个包含所有行为的类中吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:58 26 4
gpt4 key购买 nike

我正在开发一个包含许多不同实体的游戏环境。每一个都有一些共同的功能(绘制、更新等),但有时游戏必须根据敌人的类型对它们进行不同的处理。到目前为止,我已经在他们的实例类中编码了敌人的“类型”。所以,我们有这样的情况:

class MotionObject { ... };

class Entity : public MotionObject { ... };

class Coin : public Entity { ... };

class TextSign : public Entity { ... };

class ShapeEnemy : public Entity { ... };

class Attractor : public ShapeEnemy { ... };

class Bumper : public ShapeEnemy { ... };

所以类 Coin、TextSign、Attractor 和 Bumper 是游戏中实例化的实体类型。为不同类型的实体设置不同的类感觉不错,但我无法摆脱这样一种感觉,即如果我只有一个实体类,可能会避免一些麻烦,其中包含一个 switch 语句,该语句根据其“实体类型”控制其行为,存储在变量中的东西。玩家根据它们的类型以不同的方式与这些实体交互,我每次都使用 dynamic_cast 和空测试来确定应用了哪种行为。需要明确的是,这些是针对我无法在每个实体上调用简单的 Update() 的行为;玩家将以特定方式响应,或者他们将进行实体间交互,所有这些都基于实体类型。我的代码如下所示:

void Game::Update(float deltaT) {

for (int i =0; i < DrawChildren.size(); i++) {
//each entity has its Update called
DrawChildren[i].Update(deltaT);

//What follows is code that the Game class needs to run based on the entity type.
Coin * coin = dynamic_cast<Coin*>(DrawChildren[i]);
if (coin != nullptr) {
...
continue; //so no other type's code executes, in case I have inherited types.
}

TextSign * textSign = dynamic_cast<TextSign*>(DrawChildren[i]);
if (textSign != nullptr) {
...
continue; //so no other type's code executes, in case I have inherited types.
}

Attractor * attractor = dynamic_cast<Attractor*>(DrawChildren[i]);
if (attractor != nullptr) {
...
continue; //so no other type's code executes, in case I have inherited types.
}

Bumper * bumper = dynamic_cast<Bumper*>(DrawChildren[i]);
if (bumper != nullptr) {
...
continue; //so no other type's code executes, in case I have inherited types.
}

}

...

}

有没有更简单的方法来做到这一点?

最佳答案

另一种方法是拥有一个“浅”类层次结构和独立的“行为”抽象类,您可以使用它们来装饰您的主层次结构。

所以你可以:

Entity

-> Character -> NPC ->....

-> Object -> Container -> .... Renderable

可移动

可杀

装备...

您将使用多重继承来修饰类。

当特性在不同的“子树”之间共享时,拥有单一层次结构会迫使您将特性向上移动,这意味着您将特性添加到可能不使用它们的类中,从而使整个设计复杂化;否则,您最终不得不重复代码(DRY 原则?)。在这两种情况下,这都变得更难维护和扩展。

关于c++ - 在C++中,不同的游戏实体应该有不同的类吗?或者它应该在一个包含所有行为的类中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18901507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com