加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

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编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读