簡體   English   中英

基於Obj-C組件的游戲架構和消息轉發

[英]Obj-C component-based game architecture and message forwarding

我一直在嘗試使用Objective-C實現一個簡單的基於組件的游戲對象架構,這與Mick West的文章“Evolve Your Hierarchy”非常相似。 為此,我成功地使用了Mike Ash的文章“Objective-C Message Forwarding”中概述的一些想法,也就是說使用-(id)forwardingTargetForSelector:方法。

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

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

現在,我可能或者可能不是很明顯,我對Cocoa和Objective-C來說相當新,而且基本上只是在四處逛逛,而這整件事情在這里可能非常陌生。 當然,雖然我非常想知道我的具體問題的解決方案,但是任何想要解釋更優雅的方式的人都會非常受歡迎。

非常感謝,-Bastiaan

我不認為發送容器對象的所有組件的消息是Mick West所建議的 - 這無助於消除“單片游戲實體對象”的想法。

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

也就是說,你不應該在最終產品中根本不需要使用消息轉發,所以忽略警告,或者現在將變量聲明為id來安靜它們,並不是那么難看。 (該文章規定的計划是最終刪除導致警告的代碼!)

讓這些警告消失的一種簡單方法是聲明類型為id的實例變量

這樣,編譯器會假設您知道您正在做什么關於對象的類型,並且對象將響應您發送給它的任何消息,或者如果它不是您不關心。

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

您可以使用id類型 - 或者您可以使用performSelector方法調用方法,或者如果參數很復雜,則創建NSInvocation。 然而,這只是一種繞過編譯器警告的方法。 如果您的對象響應了多種方法,那么可能會聲明協議可能有所幫助,盡管同樣的警告也適用。

如果我正確理解問題,另一個選擇是實現協議。 這是鏈接java中的接口,變量可以這樣聲明:

id anObjectRef

這樣編譯器就會理解anObjectRef引用的對象符合協議。

在轉換或分配特定對象之前,還有一些方法可以告訴您特定對象是否符合特定協議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM