cocos2d学习一

本文对比分析了Cocos2d不同版本中子节点管理方式的变化,从0.1版的手动管理z顺序到0.99.5版的封装改进,详细解释了z参数的作用及其实现原理。

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

 

 

【Koopman】遍历论、动态模态分解和库普曼算子谱特性的计算研究(Matlab代码实现)内容概要:本文围绕【Koopman】遍历论、动态模态分解和库普曼算子谱特性的计算研究展开,重点介绍基于Matlab的代码实现方法。文章系统阐述了遍历理论的基本概念、动态模态分解(DMD)的数学原理及其与库普曼算子谱特性之间的内在联系,展示了如何通过数值计算手段分析非线性动力系统的演化行为。文中提供了完整的Matlab代码示例,涵盖数据驱动的模态分解、谱分析及可视化过程,帮助读者理解并复现相关算法。同时,文档还列举了多个相关的科研方向和技术应用场景,体现出该方法在复杂系统建模与分析中的广泛适用性。; 适合人群:具备定动力系统、线性代数与数值分析基础,熟悉Matlab编程,从事控制理论、流体力学、信号处理或数据驱动建模等领域研究的研究生、博士生及科研人员。; 使用场景及目标:①深入理解库普曼算子理论及其在非线性系统分析中的应用;②掌握动态模态分解(DMD)算法的实现与优化;③应用于流体动力学、气候建模、生物系统、电力系统等领域的时空模态提取与预测;④支撑高水平论文复现与科研项目开发。; 阅读建议:建议读者结合Matlab代码逐段调试运行,对照理论推导加深理解;推荐参考文中提及的相关研究方向拓展应用场景;鼓励在实际数据上验证算法性能,并尝试改进与扩展算法功能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值