2017-01-15 50 views
1

我試圖圍繞遊戲實體系統和使用GamePlayKit。 我有以下情形掙扎:GKEntity應該具有訪問組件功能的屬性或方法嗎?

  • RenderComponentGKComponent引用了SKSpriteNode顯示我的實體。
  • MetaDataComponent是保存關於實體的各種信息片段的另一個組件(如在我的情況下,這將包含屬性像MapXMapY,...)

我有一個CharacterEntityGKEntity派生。

要初始化我的實體,我傳遞用於精靈的紋理名稱。這使我可以創建RenderComponent

要初始化MetaDataComponent我有三個選項,我想知道他們中的一個是否被認爲是最佳實踐(以及哪一個是最差實踐)?

  • 對於我的組件每個屬性,參數添加到在Characterinit()
  • 公開屬性將更新組件的屬性。
  • 將模型對象傳遞給我的實體並從中初始化組件。

我的想法:

  • 數1:將多個組件我的實體擁有,更PARAMS我得到...這是不是真的我的偏好。
  • 數字2:一個實體應該是「愚蠢的」,不攜帶任何數據。它是最純粹的形式,一個實體只是一個數字。在那裏添加道具「感覺」錯誤。
  • 編號3:像我這樣的模型對象像MetaData感覺最好,但也是多餘的,因爲數據然後在模型對象中的組件中。也許讓組件存儲模型對象而不是它的屬性?

舉另一個例子:如果我期望一個實體有一個RenderComponent,我可以查詢該組件並使用它。或者我可以向實體本身添加一個方法,如setRenderPosition,它檢查所需組件的存在並更新它。問題的另一個問題是,這樣做是否存在正確或錯誤?

+0

優秀的問題。這是蘋果遊戲WIP的「被遺忘」框架,就像CAKeyFrameAnimation是被遺忘的蘋果平臺上的動畫製作手段一樣。 – Confused

回答

1

如果您正在尋找純Entity Component System那麼設計由三個部分組成:

Entity:這是你說的,只是一個數字。沒有其他的。

Component:這只是數據。沒有其他的。

System:被遺忘的部分。這是邏輯所在。您可以繼承GKComponentSystem<GKComponent>以在SpriteKit中創建您自己的系統。

這個article和它的supporting code幫助我瞭解了很多ECSDemoBots example是另一個需要關注spriteKit導向實現的應用程序。

由於SpriteKit有自己的實現ECS和其他怪癖,一些妥協是必要的,我相信,例如,你需要渲染一個節點,所以如果你想要一個SpriteComponent,那麼你需要將該節點嵌入到SpriteComponet中或者做其他的事情 - 我最好不要有一個SpriteComponent,我創建了一個繼承自GKEntity的VisualEntity,但這是我傾向於專注於具有取決於update運行循環的行爲的組件。

要回答關於實體屬性的問題,看起來似乎沒有必要,因爲您可以查詢實體以獲取您需要訪問的任何組件。

guard let spriteComponent = entity?.component(ofType: SpriteComponent.self) else { 
    return 
} 

重要的是要靈活,適應SpriteKit,並注意你正在做的妥協。

+0

看着蘋果的演示,我看到組件中的功能,他們使用系統以特定順序更新組件。對我而言,這意味着,他們的做法不是傳統或「純粹」的方式。你會同意嗎?隨着你對ECS的瞭解,你能介紹一下http://gamedev.stackexchange.com/questions/135259/how-to-add-the-concept-of-entities-and-components-into-an-isometric - 地圖呢? – Krumelur

0

要考慮的選項是在GKEntity上有擴展名。

import SpriteKit 
import GameplayKit 

extension GKEntity { 
    var isSelected: Bool { 
     guard let component = self.component(ofType: SelectionComponent.self) else { 
      return false 
     } 

     return component.selectionLocation != nil 
    } 
} 

這使得所有實體都可以使用該功能。

if self.someEntity.isSelected { 
    // Handle 
} 
相關問題