gpt4 book ai didi

c++ - 为继承设计类

转载 作者:行者123 更新时间:2023-11-28 08:03:56 25 4
gpt4 key购买 nike

假设我有一个实体类。
然后我有 n 个派生自 Entity
的类例如:

class Snake : public Entity{...};  
class Mouse : public Entity{...};

现在我有一个类玩家,它是一个实体。
我可以创建一个继承自任何类型实体的类播放器吗?例如:

class Player : public Entity -->(but instead of entity be any type of entity)  

这能做到吗?
这是使用模板实现的吗?
我读过可以在 cpp 文件中明确指定模板,即

template class Entity<Snake>;

我正在努力实现以下目标

在我的播放器类中,我在 move 中有一个 moveCamera 函数现在只有当玩家移动时,相机才会移动。如果 AI Snake 移动,相机不应该移动。

这是我在虚拟实体类中的渲染函数

void Entity::Render(float interpolation)
{
if(currentAnimation != 0){
float x = this->currLocation.x - (this->currentVelocity.x * (1.0f - interpolation)) - camera->getLocation(L_FACTOR_CURRENT).x;
float y = this->currLocation.y - (this->currentVelocity.y * (1.0f - interpolation)) - camera->getLocation(L_FACTOR_CURRENT).y;
currentAnimation->Render(x,y);
}
}

这是我的 gameUpdate 函数,基本上将实体移动到其各自的世界坐标

void Entity::GameUpdate(float gameUpdateDelta)
{
this->Move();
}

因此对于我的播放器的移动函数,我将调用相机的移动函数,然后调用基类的移动函数...现在可以调用基类移动函数的扩展类了..
我的移动功能是虚拟的,因此蛇和老鼠的移动方式可能不同。

最佳答案

您可能想编写一个继承自模板参数的模板类 Player

template< typename Derived >
class Player:
public Derived, // we believe that Derived inherits Entity
public IPlayer // makes sense if Player is not a Entity only interface
{
... some declaration here ...

void update(); // some virtual method from Entity interaface
void player_action(); // some virtual method from IPlayer interaface

}

当创建一个具体类型的播放器时,您可以将它放在您的场景中。

IPlayer* player1 = new  Player<Snake>("Player1");

Entity* playerEntity = dynamic_cast< Entity* >( player1 );
if( playerEntity ) // test if object can be placed on scene
{
scene->add( playerEntity );
}

您可能还需要了解如何编写类方法的部分模板特化。您还可以找到 boost enable_if作为一个强大的玩具。

关于c++ - 为继承设计类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10694875/

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