我想从ConstructLayer访问HudLayer中的方法,以关闭/打开在HudLayer中分配的CCSprites的可见性属性。
HudLayer接口和实施:
HudLayer : CCLayer
@interface{
CCSprite *leftArrow;
CCSprite *rightArrow;
}
-(void)switcher:(BOOL)isVisible;
@end
@implementation
-(id)init{
//Create the Hud Sprites and add them at an arbitrary location
leftArrow = [[[CCSprite alloc]init]retain];
leftArrow = [CCSprite imageWithFile:@"file.png"];
rightArrow = [[[CCSprite alloc]init]retain];
rightArrow = [CCSprite imageWithFile:@"file.png"];
leftArrow.visible = NO;
rightArrow.visible = NO;
[self addChild: leftArrow];
[self addChild: rightArrow];
}
-(void)switcher:(BOOL)isVisible{
NSLog (@"Accessed the visibility switcher");
if (isVisible == NO){
leftArrow.visible = NO;
rightArrow.visible = NO;
}
if (isVisible == YES){
leftArrow.visible = YES;
rightArrow.visible = YES;
}
@end
构建图层实现:
#import "HudLayer"
@implementation ConstructLayer
-(void)someFunction{
//Attempt to change the visibility of leftArrow and rightArrow
HudLayer *hud = [[HudLayer alloc]init];
[hud switcher: NO];
[hud release];
}
这应该可行吗?但事实并非如此!
我访问[hud switcher:]方法但由于某种原因它不能正确设置属性CCSprite.visibility。
我把一个NSLog语句打印在我的控制台中,证明它正在访问它。
它真的很奇怪,我不知道它是怎么回事。
我甚至在这个函数中定义了变量并用NSLog打印它们就可以了......
答案 0 :(得分:0)
这只是猜测,因为我没有cocos2d的经验,但无论如何......
我认为这部分真的很糟糕。你分配了(保留计数= 1),然后保留(保留计数= 2),然后完全忽略该对象并将你的变量指向另一个。
leftArrow = [[[CCSprite alloc]init]retain];
leftArrow = [CCSprite imageWithFile:@"file.png"];
rightArrow = [[[CCSprite alloc]init]retain];
rightArrow = [CCSprite imageWithFile:@"file.png"];
我猜你没看到精灵消失了。由于你在上面做了什么,你实际上可能正确地设置了可见属性,但是由于你创建了两个leftArrow和两个rightArrow对象,你可能只看到另一个(已分配,初始化和保留,没有指针。)
此外,imageWithFile可能正在返回一个自动释放的对象,您应该查看它。
编辑(我在下面的第二条评论):
替换
leftArrow = [[[CCSprite alloc]init]retain];
leftArrow = [CCSprite imageWithFile:@"file.png"];
rightArrow = [[[CCSprite alloc]init]retain];
rightArrow = [CCSprite imageWithFile:@"file.png"];
与
leftArrow = [[CCSprite imageWithFile:@"file.png"] retain];
rightArrow = [[CCSprite imageWithFile:@"file.png"] retain];