我正在研究用Java編寫的小型遊戲(但問題與語言無關)。由於我想探索各種設計模式,所以我掛斷了Composite pattern/Entity系統(我最初的讀法是關於here和here),作爲典型的深層次繼承的替代方案。複合模式/實體系統和傳統OOP
現在,寫了幾千行代碼後,我有點困惑。我認爲理解模式,我喜歡使用它。我認爲這非常酷,而星巴克就是這樣,但它認爲它提供的好處是短暫的,而且(最讓我感到厭煩的)嚴重依賴於你的粒度。
這裏是從上面的第二條圖片:
我愛對象的方式(遊戲實體,或任何你想打電話給他們)有一組最少的組件和推斷的想法是,你可以編寫代碼,看起來像:
BaseEntity Alien = new BaseEntity();
BaseEntity Player = new BaseEntity();
Alien.addComponent(new Position(), new Movement(), new Render(), new Script(), new Target());
Player.addComponent(new Position(), new Movement(), new Render(), new Script(), new Physics());
..這將是非常好的......但在現實中,代碼最終看起來像
BaseEntity Alien = new BaseEntity();
BaseEntity Player = new BaseEntity();
Alien.addComponent(new Position(), new AlienAIMovement(), new RenderAlien(), new ScriptAlien(), new Target());
Player.addComponent(new Position(), new KeyboardInputMovement(), new RenderPlayer(), new ScriptPlayer(), new PhysicsPlayer());
看來,我最終得到了一些非常專業的組件,這些組件由較少的組件組成。很多時候,我必須製造一些依賴於其他組件的組件。畢竟,如果你沒有位置,你如何渲染?不僅如此,最終渲染玩家與外星人與手榴彈的方式可能會有根本的不同。除非你製作了一個非常大的組件(在這種情況下......你爲什麼要使用複合圖案?)
給出另一個真實的例子。我的角色可以裝備各種裝備。裝備一件裝備時,會更改一些統計數據以及視覺顯示內容。下面是我的代碼看起來像現在:
billy.addControllers(new Movement(), new Position(), new CharacterAnimationRender(), new KeyboardCharacterInput());
billy.get(CharacterAnimationRender.class).setBody(BODY.NORMAL_BODY);
billy.get(CharacterAnimationRender.class).setFace(FACE.BLUSH_FACE);
billy.get(CharacterAnimationRender.class).setHair(HAIR.RED_HAIR);
billy.get(CharacterAnimationRender.class).setDress(DRESS.DRAGON_PLATE_ARMOR);
以上CharacterAnimationRender.class
隻影響什麼直觀地顯示出來。所以我顯然需要製造另一個處理齒輪數據的組件。但是,我爲什麼會做這樣的事情:
billy.addControllers(new CharacterStatistics());
billy.get(CharacterAnimationRender.class).setBody(BODY.NORMAL_BODY);
billy.get(CharacterStatistics.class).setBodyStats(BODY_STATS.NORMAL_BODY);
當我只能做一個CharacterGearStuff
控制器/組件,用於處理統計雙方的分佈以及視覺的變化?底線,我不知道這應該如何幫助生產力,因爲除非你想手動處理所有的東西,你仍然必須創建依賴2+組件的「元組件」(並修改/交叉組件)修改所有子組件 - 將我們帶回OOP)。或者,我正在考慮完全錯誤。我是嗎?
我不認爲遊戲實體/組件本來就是面向對象的,它們是爲了數據驅動的。至少從我讀到的第一篇文章上面看到的。我還閱讀了很多實現了實體系統/組件模式(http://gamadu.com/temp/es.zip,http://code.google.com/p/spartanframework/等)的開源代碼),似乎我正在以同樣的方式實施它。 – 2011-02-09 16:08:47
「重寫你的代碼」幾乎總是很糟糕的建議。同樣清楚你不熟悉ECP模式。 – vaughandroid 2015-08-31 18:53:25