我正在构建一个组件系统,其中抽象类型Component
是从组件继承而来的。到目前为止,我有可绘制的,物理的,可移动的和其他组件。一切似乎进展顺利,并在Game
I类执行以下操作:防止未经授权使用组件
void Game::init()
{
pPlayer->addComponent(pMovable);
}
void Game::processEvents()
{
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
pMovable->moveUp(2.f);
// etc..
pPlayer->setVelocity(pMovable->getVelocity());
}
void Game::update()
{
pPlayer->update(0);
}
void Game::play()
{
while (pWindow->isOpen())
{
// ...
processEvents();
}
}
到目前为止,该组件系统是很基本的,简单的。玩家的类型为Object
,每当我打电话给玩家的更新函数时,我也会调用Object的更新函数。这应该是真正的自动化,但这将在未来发生变化。什么是真正的问题是这样的:
pPlayer
仍然可以访问pMovable
的速度即使它没有添加pMovable
作为组件。这是有问题的,因为这意味着任何人都可以简单地从pMovable
获得速度,然后将其插入到对象中,而不必将pMovable
作为其组件的一部分添加。现在,倾向于发生的事情是,由于没有可移动的组件来调节它,因此移动变得不受管理。我认为这是对这个组件的未经授权的使用,我想要开发一种组件可以拒绝将它的功能用于它不属于的对象的方式。这个问题有很多解决方案,我需要一个高效实用的解决方案。这里是我的:
如果客户端试图分配一个组件功能到它自己没有添加它;
创建一个系统,通过该系统识别对象和组件,并且组件跟踪它拥有的对象,并且对象跟踪它拥有的组件。因为这是一种多对多的关系,所以必须创建一个管理所有这些的中间类;它也避免了一个循环的头文件。
有一个函数不是简单'停用'的对象的一部分。这需要使用像“componentAdded”这样的布尔值,并且所有函数都必须检查组件是否被添加,否则该函数将不会做它应该做的事情。
如果您有其他的解决方案,以防止未经授权使用的组件,请分享它们的我渴望向别人学习它们如何实现的/或将实现一个组件系统,因为我在这里做。
[MCVE](http://stackoverflow.com/help/mcve)。我个人发现很难理解你对'pMovable'的看法。 – AndyG
我不认为你的答案是有帮助的。我已经说过'pMovable'是一个组件,并且隐式地是一个可移动的组件。它具有我不希望非所有者对象不具有的功能。 – Poriferous
我同意@AndyG,一个MCVE会有帮助。如果您在代码中显示完整的示例*,我们可以更容易理解您的需求。*您可能认为已经用口头解释了足够的*,但是一个人认为他们已经沟通和其他人都了解。 – Brian