我在访问我的图层时遇到了麻烦,并且让我疯狂。基本上,我的图层场景层次结构如下:
Compiler.m - CCLayer - 保存+(CCScene)方法并加载所有其他CCLayers。
Construct.m - CCLayer - 持有box2d引擎及其组件
Background.m - CCLayer - 持有背景。
Hud.m - CCLayer - 持有HUD。
在Compiler实现类中,我将Scene和所有相关节点添加到Compiler CCLayer中:
@implementation Compiler
+(CCScene *) scene{
Compiler *compiler = [CompileLayer node];
CCScene *scene = [CCScene node];
[scene addChild: compiler];
//Add A Background Layer.
Background *layerBackground = [Background node];
layerBackground.position = CGPointMake(100,100);
[compiler addChild: layerBackground z: -1 tag:kBackground];
//Add The Construct.
Construct *construct = [Construct node];
[compiler addChild: construct z: 1];
//Add A Foreground Layer Z: 2
//After background is working.
//Add the HUD
HudLayer *hud = [Hud node];
[compiler addChild: hud z:3];
}
这一切都运行正常,我的图层被添加到编译器中,代理人按预测访问编译器的场景。
我的问题是我试图访问我的背景CCLayers - CCsprite *背景,在Construct层内,以便我可以根据我的Construct游戏英雄的位置移动它。
我尝试了很多不同的方法,但我现在决定使用类方法而不是实例方法来定义CCSprite *背景,以便我可以在构造层中访问它。
我也尝试使用@properties访问并初始化类的实例变量。
这是我的背景CCLayer:
@implementation Background
-(id) init
{
self = [super init];
if (self != nil)
{
CCSprite *temp = [Background bk];
[self addChild:temp z:0 tag:kBackGround];
}
return self;
}
+(CCSprite *)bk{
//load the image files
CCSprite *background = [CCSprite spriteWithFile:@"background.jpg"];
//get the current screen dimensions
//CGSize size = [[CCDirector sharedDirector] winSize];
background.anchorPoint = CGPointMake(0,0);
background.position = ccp(0,0);
return background;
}
@end
这很有效,它将图像加载到背景图层。
最后,我尝试从构造层访问背景图像。
@interface Construct : CCLayer{
CCSprite *tempBack;
}
@end
@implementation Construct
-(id) init{
tempBack = [Background bk]; //The background equals an instance variable
}
-(void) tick:(ccTime)dt {
tempBack.position.x ++; // To do Something here.
tempBack.opacity = 0.5; // Some more stuff here.
}
@end
这不起作用,我在某些方面收到'nil'指针,tempBack无法正确访问背景,或者根本没有。
如何访问和修改后台CCLayers类变量+(CCSprite)bk ??
答案 0 :(得分:1)
它可能不起作用,因为您的tempBack
iVar在编译器层中自动释放,而您不保留它。以下是init方法的样子:
-(id) init{
tempBack = [[Background bk] retain]; //The background equals an instance variable
}
另外 - 不要忘了release
在dealloc中。而且我不确定它是否会起作用,因为你将通过bk
类方法返回不同的背景精灵(尝试打印temp
和tempBack
变量地址,你会看到)。
通知更新
在背景图层中,创建精灵并将其添加到图层。然后添加此代码片段以订阅通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateBackground:) name:@"PlayerChangedPosition" object:nil];
然后在构造层的update
方法(或任何其他预定方法)中,使用新的玩家坐标发送此通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"PlayerChangedPosition" object:player];
现在在后台的图层中,实现updateBackground:(NSNotification *)aNotification
方法:
- (void)updateBackground:(NSNotification *)aNotification {
// object message returns player object passed when posting notification
CGPoint newCoords = [[aNotification object] position];
// adjust background position according to player position
}