假设我有一个实体类 然后我有n个派生自实体的类 例如:
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>;
我正在努力实现以下目标
在我的播放器类中,我有一个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();
}
因此,对于我的播放器移动功能,我将调用相机的移动功能,然后调用基类的移动功能......现在可以调用扩展类的基地的班级移动功能。
我的移动功能是虚拟的,因此蛇和鼠标可以以不同的方式移动..
答案 0 :(得分:1)
您可能希望编写一个继承自Template参数的模板类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是一个强大的玩具。
答案 1 :(得分:0)
如果您可以发布当前设计的界面(只是类定义),那么人们会更有帮助。看起来你需要制造玩家自己的蛇和老鼠。如果您希望某些操作与其他操作相关联,请使用观察者。