2010-04-14 24 views
3

我一直在嘗試使用Objective-C實現一個簡單的基於組件的遊戲對象體系結構,這與Mick West的文章'Evolve Your Hierarchy'大致相同。爲此,我已經成功地使用了Mike Ash所着的'Objective-C Message Forwarding'文章中提到的一些想法,也就是說使用-(id)forwardingTargetForSelector:方法。Obj-C基於組件的遊戲體系結構和消息轉發

基本設置是我有一個容器GameObject類,它包含三個組件類的實例作爲實例變量:GCPositioning,GCRigidBody和GCRendering。 -(id)forwardingTargetForSelector:方法返回哪個組件將響應相關選擇器,使用​​方法確定。

所有這些在某種程度上都像一個魅力:我可以在其中一個組件中找到實現的GameObject實例上調用方法,並且它可以工作。當然,問題在於編譯器在每次調用時都會給出'可能無法響應...'的警告。現在,我的問題是,我該如何避免這種情況?特別是關於這個事實,即GameObject的每個實例都會有一組不同的組件?也許一種方法來註冊容器對象的方法,每個對象的基礎上的對象?比如,我可以創建某種-(void)registerMethodWithGameObject:方法,我該怎麼做?

現在,對於Cocoa和Objective-C來說,我可能並不是很清楚,基本上只是徘徊,而這整個事情在這裏可能非常陌生。當然,儘管我非常想知道我的具體問題的解決方案,但任何願意解釋更優雅方式的人都會非常歡迎。

大加讚賞,-Bastiaan

+1

不幸的是我覺得警告會留下來,因爲它們在技術上是正確的。編譯器無法確定您的對象是否會實際響應,除非在接口中聲明瞭匹配的方法。也就是說,你可能可以將你的GameObject轉換爲'id'來避免它(醜陋)或者禁用警告作爲配置選項(醜陋)。 :/ – 2010-04-14 20:16:02

+0

查看bbum對這個非常類似的問題的回答:http://stackoverflow.com/questions/2259012/avoiding-compiler-warnings-when-doing-message-forwarding。基本上:在你的類上聲明一個類別,並將轉發的方法放在該類別中。 – Felixyz 2010-04-15 01:49:55

回答

2

我不認爲發送容器對象的所有組件信息是Mick West所暗示的 - 這並不能消除「單塊遊戲實體對象」的想法。

最終的目標是讓組件直接相互通信,根本沒有容器對象。在此之前,容器對象在每個遊戲實體需要單個對象的舊代碼和新的組件到組件系統之間充當粘合劑。

也就是說,在最終產品中,您根本不需要使用消息轉發,因此忽略警告,或者現在聲明變量爲id來消除它們並不是那麼難。 (本文所規劃的計劃是最終刪除導致警告的代碼!)

0

一個簡單的辦法讓這些警告消失將聲明類型的實例變量id

這樣編譯器假定你知道你在做什麼有關對象的類型以及對象將響應您發送給它的任何消息,或者如果它不是你不在乎。

0

覆蓋您的GameObject的-respondsToSelector:方法。您的實現應該依次向其每個實例發送respondsToSelector:消息,並且如果其中任何一個返回YES,則返回YES

+0

......當然,也可以使用'id'作爲數據類型,正如其他人所建議的那樣。 – jlehr 2010-04-14 21:31:00

0

您可以使用id類型 - 或者您可以使用performSelector方法調用方法,或者如果參數非常複雜,則可以創建NSInvocation。但這只是解決編譯器警告的一種方式。如果你的對象響應了幾種方法,那麼可能聲明一個協議可能會有所幫助,儘管同樣的警告也適用。

0

如果我正確理解問題的另一種選擇是實現一個協議。這是在Java鏈路的接口和變量可以聲明如下:

ID anObjectRef

這樣,編譯器理解該對象稱爲由anObjectRef符合協議。

也有方法可以告訴你,如果一個特定的對象符合特定的協議之前,你施放或分配它。

相關問題