2012-03-09 119 views
0

我有3個班,ObjectBody(BodyNode),MainSetupScene(CCLayer),並HudLayer(CCLayer)訪問方法

我設置ObjectBody和HudLayer我MainSetupScene,這就是它的要求工作。

我現在要做的是添加一個方法,其中ObjectBody獲得訪問HudLayer的權限,因此ObjectBody可以訪問在HudLayer中創建的方法。

3重要點
-ObjectBody是一個BodyNode類。
- 我試圖訪問的方法是 - (void)位於HudLayer中。
-ObjectBody是一個b2Body,它在檢測到碰撞時調用HudLayer中的方法。

我做了一些研究,我碰到這個問題,我已經試過設立這個代碼在我ObjectBody

HudLayer *hud = [[hud alloc] init]; 
[self addChild:hud]; 
[hud NameOfTheMethod]; 

然而BodyNode類不接受HudLayer的孩子。

總之,我試圖讓一個BodyNode類觸發一個CCLayer類的方法。

+0

看來你確實設計了正確的架構。你應該使用協議或繼承來反映你的對象的不同「角色」 – 2012-03-09 10:27:41

+0

就像Nick Bull在下面說的那樣? – Bek 2012-03-09 14:21:57

回答

1

不要試圖將「知識」引入對象,只是爲了傳遞消息。我的意思是,如果你有你的ObjectBody,HudLayer和MainSetupScene對象(我將在這裏做一些假設),這樣設計...

MainSetupScene「擁有」HudLayer(爲此,你大概在MainSetupScene [self addChild:hudLayer];

MainSetupScene沒有 「擁有」 ObjectBody(同樣,你可能在MainSetupScene [self addChild:objectBody];與hudLayer一樣)

現在,你想objectBody爲 「溝通」。不要試圖強迫對象的知識,反之亦然。只需使用代表。

因此,舉例來說,在你objectBody你可以聲明如下

@protocol ObjectBodyDelegate 
-(void)objectBodyStateChanged; 
@end 

現在,您mainsetupscene會有它的定義爲

@interface MainSetupScene : CCScene<ObjectBodyDelegate> 
... 

現在,在您ObjectBody類,當你想發送消息給hud,使用代理[delegate objectBodyStateChanged];

這將由您的MainSetupScene處理。然後這將決定通過調用相關方法並設置適當的值(它可以從objectBody中獲取)來更新HUDLayer。

總之,身體告訴現場發生了一些事情,使其發生變化。現場知道需要更新哪些內容以反映這一變化。身體不應該知道這個hud存在,並且hud不應該知道身體存在。

除了我在這裏放置的代表,還有更多的代表,但是如果你四處搜尋,你會發現很多細節。

EDIT AFTER COMMENT 你的協議是在一類(類A)的接口中定義的,但實現被寫入另一個類(類B)。這就是爲什麼它被稱爲委託 - 你將工作委託給另一個班級。

您還需要定義和設置一個委託。所以,在A級.H你必須

@protocol ClassADelegate 
-(void)doSomethingAfterSomethingChanged; 
@end 

@interface ClassA { 
id <ClassADelegate> delegate; 
} 
@property (nonatomic, retain) id<ClassADelegate> delegate; 

在A類.M實現,你必須

@implementation ClassA { 
@synthesize delegate; 

-(void)changeSomething { 
... Do whatever you need to do ... 
// Now call the delegate 
[delegate doSomethingAfterSomethingChanged]; 
} 

在B類的.h你必須

@interface ClassB<ClassADelegate> { 
} 

然後在.M執行,你必須

@implementation ClassB { 
-(id)init { 
    .. Do whatever, but when you create your ClassA, set this as delegate ... 
    ClassA myClassA = [[ClassA alloc] init]; 
    myClassA.delegate = self; 
} 

-(void)doSomethingAfterSomethingChanged { 
// This gets called by ClassA 
} 

有很多關於代表的更好的教程可以解釋它比這更好。希望這會使它更清晰一些。您可能已經使用UITableView控件和iOS SDK中的其他許多功能。

+0

這真的很有幫助,我所要做的就是在我的.h中聲明協議,然後在@interface中實現它們,對嗎?協議實施的NSCoding的一部分?因爲他們似乎相關。抱歉佔用你的時間。 – Bek 2012-03-09 14:53:57

+0

另一個問題是,我的確在我的MainSetupScene中只有[self addChild:hudLayer]。該對象將被設置在另一個類中,該類決定了我在MainSetupScene中使用的[自增addChild:placementLayer]對象的位置(By Levels) – Bek 2012-03-09 15:06:23

+0

@Bek更多地瞭解代表的解釋。 – 2012-03-09 15:09:57