cocos2d子层访问父层的三种技巧
发布时间:2021-12-14 21:56:28 所属栏目:教程 来源:互联网
导读:情景设定:父层HelloWorldLayer有一个方法-(void) setlable;需要被其子层SecondLayer访问。 第一种、半单例方法: 首先在HelloWorldLayer.h声明+(HelloWorldLayer*) shareLayer +(HelloWorldLayer*) shareLayer; 然后在HelloWorldLayer.m加入: #import Seco
情景设定:父层HelloWorldLayer有一个方法-(void) setlable;需要被其子层SecondLayer访问。 第一种、半单例方法: 首先在HelloWorldLayer.h声明+(HelloWorldLayer*) shareLayer +(HelloWorldLayer*) shareLayer; 然后在HelloWorldLayer.m加入: #import "SecondLayer.h" static HelloWorldLayer* HelloWorldLayerInstance; +(HelloWorldLayer*) shareLayer { return HelloWorldLayerInstance; } -(id) init { // always call "super" init // Apple recommends to re-assign "self" with the "super" return value if( (self=[super init])) { HelloWorldLayerInstance=self; SecondLayer* sl=[[SecondLayer alloc] init]; sl.tag=10; [self addChild:sl z:100]; self.isTouchEnabled=YES; ////................. } return self; } -(void) setlable { clickNum++; [label setString:[NSString stringWithFormat:@"ParentLayer clickNum:%i",clickNum]]; } 在SecondLayer就可以通过这样的方式来访问HelloWorldLayer的-(void) setlable方法: [[HelloWorldLayer shareLayer] setlable]; 第二种、self.parent强制访问方法: HelloWorldLayer中只需按正常添加子层SecondLayer即可(HelloWorldLayer.m中): -(id) init { // always call "super" init // Apple recommends to re-assign "self" with the "super" return value if( (self=[super initWithColor:ccc4(0, 255, 255,255)])) { HelloWorldLayerInstance=self; SecondLayer* sl=[[SecondLayer alloc] init]; sl.tag=10; [self addChild:sl z:100]; self.isTouchEnabled=YES; ////................. } return self; } 在SecondLayer就可以通过这样的方式来访问HelloWorldLayer的-(void) setlable方法: [(HelloWorldLayer*)self.parent setlable]; 第三种、协议委托方法: 在SecondLayer.h中加入: #import <Foundation/Foundation.h> #import "cocos2d.h" @protocol callParentDelegate <NSObject> -(void) setlable; @end @interface SecondLayer : CCLayer{ id<callParentDelegate> delegate; } @property(nonatomic,retain) id<callParentDelegate> delegate; @end SecondLayer.m中@synthesize delegate; 然后在HelloWorldLayer.h中加入<callParentDelegate>协议: @interface HelloWorldLayer :CCLayer <callParentDelegate> { CCLabelTTF *label; int clickNum; } 在HelloWorldLayer.m中实现: -(void) setlable { clickNum++; [label setString:[NSString stringWithFormat:@"ParentLayer clickNum:%i",clickNum]]; } 在添加SecondLayer子层注意设子委托: SecondLayer* sl=[[SecondLayer alloc] init]; sl.tag=10; sl.delegate=self; [self addChild:sl z:100]; self.isTouchEnabled=YES; 在SecondLayer就可以通过这样的方式来访问HelloWorldLayer的-(void) setlable方法: [self.delegate setlable]; 还有更好的办法,欢迎各位交流! ![]() (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读