Cocos2d-x源码粗析1.base-nodes

Base-nodes:node继承自ref,是场景图形的基本元素。常见的继承自node的对象有Scene,Layer, Sprite, Menu, Label.
Node的主要特点:
1、可包含其他Node对象(addChild,getChildByTag, removeChild, etc)
2、可以实现定时回调(schedule,unschedule, etc)
3、可以执行动作(runAction,stopAction, etc)
继承Node:
1、重载init函数以初始化资源和安排回调
2、创建回调函数以实现程序随时间的推进
3、重载draw函数以渲染node
Node的属性:
- 位置:position (default: x=0, y=0)
- 缩放:scale (default: x=1, y=1)
- 旋转:rotation (in degrees, clockwise) (default: 0)
- 锚点:anchor point (default: x=0, y=0)
- 大小:contentSize (default: width=0, height=0)
- 可见:visible (default:true)
-CCNode.h
static const intINVALID_TAG = -1;

    enum {
       FLAGS_TRANSFORM_DIRTY = (1 << 0), //1
       FLAGS_CONTENT_SIZE_DIRTY = (1 << 1),  //2
       FLAGS_RENDER_AS_3D= (1 << 3),  //8
       FLAGS_DIRTY_MASK =(FLAGS_TRANSFORM_DIRTY |             FLAGS_CONTENT_SIZE_DIRTY),  //3
    };
  • 构造函数Node(void)有一长串的初始化,cocos采用二级构造机制,create()是真正有意义的构造函数,函数返回值为指向Node对象的指针,若构造成功,则调用autorelease()函数,即采用引用池进行管理,否则释放空间,并将指针指向空。

  • init函数直接返回true,看来需要重写

  • cleanup函数两步:停止所有动作,并且停止时间回调。与析构函数相似,涉及到脚本的需要特别处理,暂且略过。
  • getDescription顾名思义,得到Node的描述,字符串大小不得超过1024*100
  • 接下来就是一大堆get和set SkewX/Y 是与坐标轴夹角,
    LocalZOrder和GlobalZOrder分别为z轴的局部和全局坐标。
    Rotation/RotationSkew/Rotation3D无非就是传入参数不同,最终通过改变RotationQuat即可。
    Scale即缩放尺寸,可以整体也可以具体到某个坐标轴方向
    Position相关是位置向量,注意NormalizedPosition为规格化的位置向量
  • AnchorPoint锚点,意为将Node的某个点作为锚点,以便控制Node的位置和变换。 例如,把节点左下角作为锚点,值为(0,0)
    ; 把节点的中心作为锚点,值为(0.5,0.5) ; 把节点右下角作为锚点,值为(1,0) 。
  • getContentSize用于获得Node的初始大小,返回CGSize类型,而getBoundingBox获得节点当前大小,即如果经过缩放那么就是缩放后的大小。返回CGRect类型。
  • Tag和name用于标识一个Node,前者int相当于一个id,后者string
    getChildByTag/Name即通过这两个标识获得孩子节点。
    getChildrenCount顾名思义,获取孩子的数量。Vector
   void onEnter();//1,创建时调用  
   void onExitTransitionDidStart();//2,创建完node的时候调用,也就是1调用完之后调用 
   void onExit();//3,退出当前layer的时候调用,在这里都是做一些清除工作   
   void onEnterTransitionDidFinish();//4,在3完成之后,调用该成员方法
  • setEventDispatcher,需要涉及到EventDispatcher,EventListener,Event三者的关系

    Event相当于data,EventListener包含了data与fuction的一种映射关系,而EventDispatcher相当于一个Manager,管理着EventListener,决定着Event的调用顺序。
    Event中包含了type,target等信息;EventListener包含了ListenerID,相关联的Node,对应的callBack;EventDispatcher里含有各种map,vector来管理不同的Listener。具体的,http://www.tuicool.com/articles/fMb2ay7

  • Action相关包括setActionManager、runAction、stopAction等等,在之后介绍Action的时候再详细分析
  • 回调相关的定时器Scheduler负责执行设定好的回调,schedule函数有好多重载,可以设置selector,设置的selector参数与updateselector的区别是后者是每帧调用一次,可以定义优先级,而前者可以每帧执行一次,也可以设置自定义的时间间隔,即interval。schedule也可以用于定时调用自定义函数。Unschedule停止定时器
    cocos2dx的scheduler提供了定时事件或者回调。可以不使用NSTimer而是使用CCScheduler类
    CCNode知道如何设置间隔事件并且cocos2dScheduler比使用NSTimer有几个独特的优势。
    1)当CCNode不再显示或者从场景中移除之后,Scheduler调用将会停用。
    2)当Cocos2D暂停的时候,Scheduler调用也会停用,当Cocos2D恢复的时候,Scheduler也会重新设置设定并执行(rescheduled)。
    3)Scheduler提供毫秒的间隔时间。间隔时间在物理引擎中是非常有用的。
    4)运用Scheduler中的this->scheduleUpdate()调用能够确保你的更新函数在每帧需要渲染之前被调用。
    通常,CCScheduler比NSTimer节省很多时间并且能够使得开发者专注于游戏功能的实现。

  • pause和resume分别是暂停和恢复,pauseTarget和resumeTarget都是通过哈希表处理相关宏找到对应的哈希表项,并将paused开关设为true或者false。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值