2015-09-04 39 views
0

目前我正在嘗試編寫一款小型視頻遊戲,其風格是舊的塞爾達遊戲。但是,我在整個OOP思維方式上遇到了一些麻煩。更具體地說,我不知道如何「設計」屏幕。每個精靈的對象? (Games,OOP)

比方說,我有一個我的精靈班,並加載了一個Wall-Sprite來爲某個區域設置邊框,如果我製作了額外的「牆」級別,或者牆已經足夠「精靈」了?我認爲定義一個額外的類可能是沒有意義的,因爲它不會有任何不同的變量而不是實際的精靈類(因爲我的牆只是一個精靈),所以我不認爲它是一個有用的想法。

我在問這個,因爲我碰到碰撞檢測也有點問題:我現在做的只是加載一個對象的精靈一次,並在多個位置渲染多次。但問題在於,這會導致僅在精靈渲染的最後一個位置檢測到碰撞。

當我在某處呈現2個洞穴入口時,它給了我更多的問題,但是如果我「進入」它,我的遊戲只會檢查第二個入口。所以我認爲製作一個額外的「入口」類,並創建兩個完全不同的對象,分開處理可能會有所幫助,但是,我是否也應該爲我的牆壁精靈創建30個對象?

+0

http://programmers.stackexchange.com/可能是這類問題的更好的論壇。 –

+0

@DonBottstein在提及其他網站時,指出[交叉發帖令人不悅](http://meta.stackexchange.com/tags/cross-posting/info) – gnat

+0

我知道這個問題有點兒一般,但是在那裏埋下了一個很好的具體問題。然而,@DonBottstein在將來是對的,這種帖子將會更好地位於程序員網站上。 –

回答

0

嗯,真的有兩個問題,三個,但是面向對象的思維對於一個好問題來說太不具體了。所以讓我們看看我們是否可以通過回答有效的答案來回答。

良好的OO設計以「模式」爲中心(針對各種問題的常見解決方案),如果您的精靈在OO中重用,這將稱爲「飛行重量」模式。好的面向對象中的三個重要結構元素並理解它們是「獲得它」的關鍵。它們是:

接口 - 它們是免費的(相對)操作代碼,並且只提供方法和構造函數簽名(通常)以允許清晰地分離編碼問題。

類 - 只有對象實例化(或圖案化)的對象的可重用部分(理想情況下)是「模具或模式」。

對象 - 相同形式的類(理想主席)的對象 - 實例(這把椅子或椅子,而不是主席作爲理想)。對象(理想情況下)應該只保留實例值,以將其與同一理想的其他實例區分開來。

但是,因爲你的原始精靈不是一個對象,你有這個碰撞問題,因爲它實際上是一次又一次渲染的同一個實例,圖形管道並沒有將它所有的前面的位置保存爲單獨的東西,它實際上只是一旦它們被翻譯,就會存儲像素(通常)。

在這種情況下,如果每個實例都是一個對象,則每個實例都將其位置作爲本地實例變量,而其圖形表示和衝突檢測方法對於該類的所有實例都是通用的。

不要以爲它一次只能有30個完整的副本,你只有30個副本的實例變量。如果你使用OO,這是真的;在一個程序性的解決方案,以獲得適當的碰撞檢測,你將不得不維護一個數組的所有地方,你渲染該精靈和迭代通過每一次,進一步你的代碼將不太乾淨地分開,你將不得不遍歷整個數組精靈交互以及更新移動的精靈。使用OO,您可以使用一個類方法調用來處理這個問題,並將它遞歸給子節點。

這個簡單的例子,一個很好的類結構可能是:

提要Sprite類(抽象的,因爲你永遠不會使用非特定雪碧)只包含通用代碼,所有的精靈

水泥牆Sprite類擴展了Sprite,只有非移動壁精靈的代碼。

的具體觸發Sprite類(它的圖形可能是清晰或空)對於需要在「開放空間」

被觸發的具體代理Sprite類的移動精靈的行爲(可能實現一個可移動的接口意味着所有的類的衍生物具有move()方法。

延伸劑用於由用戶命令驅動的可動子畫面的具體字符類。

它可能看起來在第一混淆,但它實際上是清潔器,更簡單的,並且更容易維護OO方式。

:)

+0

非常感謝!迭代通過數組實際上正是我一直在做的,就我的「解決方案」而言,我很高興知道這似乎是一個真正的「已知」解決方案,我沒有做一些完全奇怪的事情。我目前正在使用一個sprite類,它具有加載和渲染動畫和非動畫sprites的方法,但我不知道如何組織我的關卡設計而不使用數組,因爲我總是需要一些座標來把精靈放在他們各自的地方,你能解釋一下嗎? 儘管如此,非常感謝! (: – Philipp317