入 门(12)

  

首先,用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属性赋值,也可以在调用后进行赋值。

读书导航