cocos2d学习一

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值