我正在構建一個組件系統,其中抽象類型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