2011-09-03 85 views
2

我使用的是Cocos2d遊戲開發框架。Objective-C遊戲開發:組件之間的溝通

讓我們專注於戰鬥場景:

戰鬥場景有兒童:battlers層,HUD層菜單層,背景層,等...

有時候,這是必要的,我battlers層「聯繫」我的HUD層(如調用其中的功能)。

我覺得這很難。基本上,我的戰鬥者層需要某種實例或HUD層的引用來調用其中的函數,對吧?但我不知道該怎麼做。

目前,這是我做的:

的battlers層將運行在現場(其父)的功能,並且,這樣的功能裏面,我將「定位」的HUD層的孩子,並調用我需要它的功能。

現在,這是一種不方便。在這種情況下你會做什麼?

回答

3

這聽起來對我來說,你可能有過度設計這一點。我可能會做的就是這樣的事情。

我會有一個IScene。我的每個場景類都實現了這個IScene。 IScene有一個稱爲「HUD」屬性,另一個名爲「菜單」等

目前IScene被設置成一個全球性的靜態實例:: CurrentScene

在當前場景需要聯繫的菜單,我說::: CurrentScene-> Menu-> SomeFuncion()。

這樣可以嗎?

+0

.....你這該死的性能。我忘了,呃.... noob錯誤,謝謝:) – Voldemort

+0

如果IScene是從CCScene派生的,你應該確保你不保留這個屬性。這可能導致內存泄漏,因爲cocos2d保留添加到其節點層次結構中的每個對象。 –

+0

而不是@property(保留,非原子)我只是把@property(非原子)? – Voldemort

2

我建議你看看可可的NSNotificationCenter和相關的類。 Apple有一個主題here的指南。

它可能是這樣的。

在你的HUD層,你訂閱通知名爲@"battleLayerStuff"

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(doThisWhenSomethingHappens:) 
              name:@"battleLayerStuff" 
              object:nil]; 

而在你的戰鬥層,有事時,你張貼具有相同名稱的通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"battleLayerStuff" 
                 object:battleObject]; 

對象部分是可選的,但如果您想發送更多信息而不僅僅是「發生了什麼」,它可能會有所幫助。

如果要提取您發送您的對象的信息做到這一點的方法doThisWhenSomethingHappens:

- (void)doThisWhenSomethingHappens:(NSNotification *)notification 
{ 
    BattleObject *battleObject = (BattleObject *) notification.object; 
    // Do stuff with object 
} 
2

您可以使用NSNotification Center。這允許您在一個對象中發送消息,並讓多個其他對象對它們做出反應。

// The object that wants to receive the message registers with NSNotificationcenter 
[[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(receiveScoreUpdateEvent:) 
    name:@"scoreUpdateEvent" 
    object:nil ]; 

在您需要定義您的選擇點的方法相同的對象:

- (void)startLocating:(NSNotification *)notification { 
    NSNumber *scoreObject = [[notification userInfo] objectForKey:@"score"]; 
    // Do something with the new score 
} 

另一個對象可以接着用更新的比分隨時發送郵件,你的HUD會反應它:

[[NSNotificationCenter defaultCenter] postNotificationName:@"scoreUpdateEvent" 
    object:self userInfo:[NSNumber numberWithInt:5345] forKey:@"score"]];