当前位置:编程学习 > 网站相关 >>

cocos2d子层访问父层的三种方法

情景设定:父层HelloWorldLayer有一个方法-(void) setlable;需要被其子层SecondLayer访问。
第一种、半单例方法:

首先在HelloWorldLayer.h声明+(HelloWorldLayer*) shareLayer

[html] 
+(HelloWorldLayer*) shareLayer; 
然后在HelloWorldLayer.m加入:

[html] 
#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方法:

[html] 
[[HelloWorldLayer shareLayer] setlable]; 
第二种、self.parent强制访问方法:

HelloWorldLayer中只需按正常添加子层SecondLayer即可(HelloWorldLayer.m中):

[html
-(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方法:
[html] 
[(HelloWorldLayer*)self.parent setlable]; 

第三种、协议委托方法:
在SecondLayer.h中加入:

[html] 
#import <Foundation/Foundation.h> 
#import "cocos2d.h" 
 
@protocol callParentDelegate <NSObject> 
-(void) setlable; 
@end 
 
@inte易做图ce SecondLayer : CCLayer{ 
    id<callParentDelegate> delegate; 

@property(nonatomic,retain) id<callParentDelegate> delegate; 
@end 
SecondLayer.m中@synthesize delegate;
然后在HelloWorldLayer.h中加入<callParentDelegate>协议:

[html] 
@inte易做图ce HelloWorldLayer :CCLayer <callParentDelegate> 

    CCLabelTTF *label; 
    int clickNum; 

在HelloWorldLayer.m中实现:

[html]
-(void) setlable 

    clickNum++; 
    [label setString:[NSString stringWithFormat:@"ParentLayer clickNum:%i",clickNum]]; 

在添加SecondLayer子层注意设子委托:

[html]
SecondLayer* sl=[[SecondLayer alloc] init]; 
sl.tag=10; 
sl.delegate=self; 
[self addChild:sl z:100]; 
self.isTouchEnabled=YES; 
在SecondLayer就可以通过这样的方式来访问HelloWorldLayer的-(void) setlable方法:

[html] 
[self.delegate setlable]; 
还有更好的办法,欢迎各位交流!


作者:wangqiuyun
补充:综合编程 , 其他综合 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,