2012-03-09 116 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