您的位置:首页 > 移动开发 > Cocos引擎

cocos2d学习一

2010-12-31 12:05 232 查看
本来下载了cocos2d-iphone-0.99.5源码打算好好学习一下,但是发现工程有点大了,有点晕。所以就下载了最旧的版本看,一步一步来,相信会有不少收获,果然0.1版本要小很多。(感谢cocos2d的作者们,哈哈)。

之前搞不懂 addChildren 里面 那个 z,是干嘛用的,怎么实现的。看了源码了解了。

//这是0.1版本的代码,那时还不叫addChildren

-(id) add: (CocosNode*) child z:(int)z name:(NSString*)name

{

NSArray *entry;//用来存,z(孩子的顺序),和孩子的 数组 //其实可以用字典吧

NSAssert( child != nil, @"Argument must be non-nil");

NSNumber *index = [NSNumber numberWithInt:z];

//eg 2,child2, 1,child1

entry = [NSArray arrayWithObjects: index, child, nil];//这里是添加

int idx=0;

BOOL added = NO;

//children 数组的数组, 子数组是一个 z,和孩子

//这方法不错 学习了

for( NSArray *a in children ) {

if ( [[a objectAtIndex: 0] intValue] > z ) {

added = YES;

[ children insertObject:entry atIndex:idx];

break;

}

idx++;

}

if( ! added )

[children addObject:entry];

if( name )

[childrenNames setObject:child forKey:name];//这里单独用一个NSMutableDictionary 来存放child的名字,暂时还不太理解

//这个child 就被保存了两次 为啥啊?

[child setParent: self];

if( isRunning )

[child onEnter];

return self;

}

比较一下0.99.5版本的代码

-(void) addChild: (CCNode*) child z:(int)z tag:(int) aTag

{

NSAssert( child != nil, @"Argument must be non-nil");

NSAssert( child.parent == nil, @"child already added. It can't be added again");

if( ! children_ )

[self childrenAlloc];

[self insertChild:child z:z];

child.tag = aTag;

[child setParent: self];

if( isRunning_ ) {

[child onEnter];

[child onEnterTransitionDidFinish];

}

}

-(void) insertChild:(CCNode*)child z:(int)z

{

NSUInteger index=0;

CCNode *a = [children_ lastObject];

// quick comparison to improve performance

if (!a || a.zOrder <= z)

[children_ addObject:child];

else

{

CCARRAY_FOREACH(children_, a) {

if ( a.zOrder > z ) {

[children_ insertObject:child atIndex:index];

break;

}

index++;

}

}

[child _setZOrder:z];

}

变化很大了,首先孩子的顺序不是单独的了,而是封装在孩子里面,孩子的名称也变为tag,更具用面向对象的思想吧,由于我才刚刚开始学习,所有还有什么意义我还不知道,慢慢进一步深入的学习了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: