本来下载了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,更具用面向对象的思想吧,由于我才刚刚开始学习,所有还有什么意义我还不知道,慢慢进一步深入的学习了。