嗯,真的有兩個問題,三個,但是面向對象的思維對於一個好問題來說太不具體了。所以讓我們看看我們是否可以通過回答有效的答案來回答。
良好的OO設計以「模式」爲中心(針對各種問題的常見解決方案),如果您的精靈在OO中重用,這將稱爲「飛行重量」模式。好的面向對象中的三個重要結構元素並理解它們是「獲得它」的關鍵。它們是:
接口 - 它們是免費的(相對)操作代碼,並且只提供方法和構造函數簽名(通常)以允許清晰地分離編碼問題。
類 - 只有對象實例化(或圖案化)的對象的可重用部分(理想情況下)是「模具或模式」。
對象 - 相同形式的類(理想主席)的對象 - 實例(這把椅子或椅子,而不是主席作爲理想)。對象(理想情況下)應該只保留實例值,以將其與同一理想的其他實例區分開來。
但是,因爲你的原始精靈不是一個對象,你有這個碰撞問題,因爲它實際上是一次又一次渲染的同一個實例,圖形管道並沒有將它所有的前面的位置保存爲單獨的東西,它實際上只是一旦它們被翻譯,就會存儲像素(通常)。
在這種情況下,如果每個實例都是一個對象,則每個實例都將其位置作爲本地實例變量,而其圖形表示和衝突檢測方法對於該類的所有實例都是通用的。
不要以爲它一次只能有30個完整的副本,你只有30個副本的實例變量。如果你使用OO,這是真的;在一個程序性的解決方案,以獲得適當的碰撞檢測,你將不得不維護一個數組的所有地方,你渲染該精靈和迭代通過每一次,進一步你的代碼將不太乾淨地分開,你將不得不遍歷整個數組精靈交互以及更新移動的精靈。使用OO,您可以使用一個類方法調用來處理這個問題,並將它遞歸給子節點。
這個簡單的例子,一個很好的類結構可能是:
提要Sprite類(抽象的,因爲你永遠不會使用非特定雪碧)只包含通用代碼,所有的精靈
水泥牆Sprite類擴展了Sprite,只有非移動壁精靈的代碼。
的具體觸發Sprite類(它的圖形可能是清晰或空)對於需要在「開放空間」
被觸發的具體代理Sprite類的移動精靈的行爲(可能實現一個可移動的接口意味着所有的類的衍生物具有move()方法。
延伸劑用於由用戶命令驅動的可動子畫面的具體字符類。
它可能看起來在第一混淆,但它實際上是清潔器,更簡單的,並且更容易維護OO方式。
:)
http://programmers.stackexchange.com/可能是這類問題的更好的論壇。 –
@DonBottstein在提及其他網站時,指出[交叉發帖令人不悅](http://meta.stackexchange.com/tags/cross-posting/info) – gnat
我知道這個問題有點兒一般,但是在那裏埋下了一個很好的具體問題。然而,@DonBottstein在將來是對的,這種帖子將會更好地位於程序員網站上。 –