首先,用CCScene类的静态初始化器“+(id) node”创建一个CCScene对象。然后用同样的方法创建一个HelloWorld对象,并把它添加到刚创建的CCScene对象中。最后把该CCScene对象返回给调用者。
在以下的代码清单2-2中,你可能会发现一个奇怪的现象:在self = [super init]的调用中,self被赋值为向父对象发送init消息后的返回值。如果你之前是一名C++程序员,看到这一幕一定会感动痛苦万分。请不必太过沮丧。这行代码表示:在Objective-C中,我们必须手动调用父类的init方法,该操作不会自动完成。我们之所以用self来接收返回值,是为了防止返回值为nil的情况发生。
代码清单2-2 使用init方法创建和添加Hello World标签
-(id) init
{
if ((self = [super init])) {
// create and initialize a label
CCLabel* label = [CCLabel labelWithString:@"Hello World"
fontName:@"Marker Felt" fontSize:64];
// get the window (screen) size from CCDirector
CGSize size = [[CCDirector sharedDirector] winSize];
// position the label at the center of the screen
label.position = CGPointMake(size.width / 2, size.height / 2);
// add the label as a child to this Layer
[self addChild: label];
}
return self;
}
如果Objective-C程序员调用[super init]的方式,另一种方法也许能令你比较容易接受。这种方法基本上和上面的方法是一样,但它也是有别于传统写法的:
-(id) init
{
self = [super init];
if (self != nil) {
// do init stuff here ...
}
return self;
}
接下来我将解释“Hello World”标签是如何添加到场景中的。如果回顾一下代码清单2-2,你就会发现CCLabel对象是通过它的一个静态初始化方法创建的,该方法会返回一个新创建的CCLabel类实例,并把该对象添加到自动释放池中。为了防止该对象在init方法结束后从内存中释放,必须调用[self addChild:label]消息把它添加为self的子节点。同时,该标签的position属性被设置为屏幕中央。注意,既可以在调用addChild方法前对position属性赋值,也可以在调用后进行赋值。