节点和坐标系
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了节点和坐标系相关的知识,希望对你有一定的参考价值。
CCNode定义了一个可绘制对象的通用特性,包括位置、缩放、是否可见、旋转角度等。
节点功能包括:包含其他CCNode对象、接受各种事件与回调函数、运行动作。
坐标系:
绘图坐标系:与OpenGL采用的坐标系相同。以左下角为原点,向右为x轴正方向,向上为y轴正方向。
纹理坐标系:以左上角为原点,向右为x轴正方向,向下为y轴正方向。
CCSprite相关的绘图属性:
CCRect ContentSize : 获取或设置此节点的内容大小。任何节点都需要确定它的内容大小,以便进行图形变换。对于精灵来说,ContentSize是它的纹理显示部分的大小;对于层或场景等全屏的大型节点来说,ContentSize则是屏幕大小。
CCPoint AnchorPoint与CCPoint Position : AnchorPoint用于设置一个锚点,以便精确地控制节点的位置和变换。AnchorPoint的两个参量x和y的取值通常都是0到1之间的实数,表示锚点相对于节点长宽的位置。AnchorPoint的两个参量x和y的取值通常都是0到1之间的实数,表示锚点相对于节点长宽的位置。
节点使用Position & Anchor Point 来设置显示位置。
Position : 位置,setPosition(Point(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); 将节点设置在屏幕中间(如果锚点设置为(0.5,0.5)的话,那么就在正中间) 。
Anchor Point : 锚点。(0 , 0)为节点的左下角,(1 , 1)为右上角。
当多个节点嵌套时,每个节点的坐标系原点位于其内容的左下角。因此,锚点在父节点中的坐标实际上是它相对于父节点左下角的坐标值。
Layer比较特殊,它默认锚点。所以要调用 ignoreAnchorPointForPosition(False) 接口来改变锚点。当设置为True则表示锚点为(0 , 0),即左下角。
设置位置的时候,要同时考虑到Position 和 Anchor Point。
float Rotation : 获取或设置节点的旋转角度。节点以自己的锚点为中心顺时针旋转一定量,单位是角度。
float Scale(以及float ScaleX与float ScaleY):Scale用于获取或设置节点的缩放比例。节点以锚点为中心缩放该比例。Scale的值代表整体缩放比例,而ScaleX与ScaleY分别代表X方向与Y方向的缩放比例。默认情况下,这三个属性的值都是1,表示节点不被缩放。如果设置Scale属性,则ScaleX和ScaleY都会随之变为相同的值。当然,我们也可以给ScaleX与ScaleY设置不同的值,那样Scale属性的值就没有意义了。
bool Visible:获取或设置节点的可见性。当Visible为true时,节点会被显示,反之节点不会被显示。在节点不被显示的时候,也不会被调用绘图方法(visit与draw)。
float SkewX与float SkewY:获取或设置斜切角度。节点以锚点为中心,平行x轴或y轴方向作一定角度的变形。SkewX为平行x轴顺时针的变形,SkewY为平行y轴逆时针的变形,单位为角度。SkewX与SkewY的默认值为0,表示节点没有斜切变形。
int Tag:获取或设置节点的标号。在Cocos2d-x中,Tag的作用类似于标识符,以便快速地从节点的所有子节点中找出所需节点。Tag可以用于定位子节点,因此添加到同一节点的所有CCNode之中,不能有两个节点的Tag相同,否则就给定位带来了麻烦。与Tag相关的方法有getChildByTag、removeChildByTag等。
void* UserData:获取或设置与节点相关的额外信息。UserData为void*类型,我们可以利用这个属性来保存任何数据。
节点的其他属性:
CCArray* Children 获取保存了该节点所有子引用的数组
CCNode* Parent 获取或设置该节点的父节点
CCCamera* CameraRETURN 获取或设置该节点的摄像机状态。摄像机(CCCamera)定义了绘制该节点时的视点,通常用于实现特效
CCGridBase* Grid 获取或设置该节点的网格特效状态。网格应用于绘图平面上,可以实现水纹等3D特效
CCGLProgram* ShaderProgram 获取或设置该节点的Shader程序。CCGLProgram是OpenGL的glProgram的封装
CCActionManager* ActionManager 获取或设置该节点所使用的动作管理器。当为节点设置了新的动作管理器时,正在执行的动作都会被丢弃
CCScheduler* Scheduler 获取或设置该节点所使用的计时器管理器。当为节点设置了新的计时器管理器时,正在运行的计时器都会被丢弃
节点的方法:
addChild(CCNode* child) 把child添加到当前节点之中
removeFromParentAndCleanup(bool cleanup) 把当前节点从其父节点中移除,如果cleanup为true,则执行clean方法
removeChild(CCNode* child,bool cleanup) 从当前节点中移除child节点,如果cleanup为true,则调用child的clean方法
removeChildByTag(int tag, bool cleanup) 从当前节点中移除标号为tag的节点
removeAllChildrenWithCleanup(bool cleanup) 移除当前节点的所有子节点
getChildByTag(int tag) 返回当前节点中标号为tag的节点
cleanup 停止此节点的全部动作与计时器
定时器:
updata定时器:
第一种定时机制是CCNode的刷新事件update方法,该方法在每帧绘制之前都会被触发一次。由于绘图帧率有限,而每次更新最终会反映到画面上,所以在每帧之间刷新一次已经足够应付大部分游戏逻辑处理的要求了。
CCNode默认并没有启用update事件,为了启用定时器,我们需要调用scheduleUpdate方法,并重载update以执行自己的代码。对应地,我们可以使用unscheduleUpdate方法停止定时器。
schedule定时器:
另一种定时机制是CCNode提供的schedule方法,可以实现以一定的时间间隔连续调用某个函数。由于引擎的调度机制,这里的时间间隔必须大于两帧的间隔,否则两帧期间的多次调用会被合并成一次调用。所以schedule定时器通常用在间隔较长的定时调用中,一般来说,事件间隔应在0.1秒以上。
CCNode的schedule方法接受一个函数指针并启动一个定时器,利用schedule方法不同的重载可以指定触发间隔与延时。schedule_selector则是把指定函数转换为函数指针的宏,用于创建schedule方法所需的函数指针。传入这个宏的函数应该包含一个float参数,表示距离前一次触发事件的时间间隔。
例如:this -> schedule(schedule_selector(GameScene::updateGame));
定时器相关方法:
isScheduled(SEL_SEHEDULE selector) 返回一个值,表示selelctor对应的函数是否已被添加为定时器。
scheduleUpdate 启用update定时器
scheduleUpdateWithPriority(int priority) 启用update定时器,并设置定时器优先级
unscheduleUpdate 取消update定时器
schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
添加一个schedule定时器,其中selector参数为定时器的事件函数,interval参数为定时器的时间间隔,repeat参数为定时事件触发一次后还会再次触发的次数(默认为kCCRepeatForever,表示触发无穷次),delay为第一次触发事件前的延时。时间单位都是秒。
scheduleOnce(SEL_SCHEDULE selector, float delay) CONTROL 添加一个schedule定时器,但定时器只能触发一次
unschedule(SEL_SCHEDULE selector) ESC 取消selector所对应的函数的定时器
unscheduleAllSelectors 取消此节点所关联的全部定时器
pauseSchedulerAndActions 暂停此节点所关联的全部定时器与动作
resumeSchedulerAndActions 继续执行此节点所关联的定时器与动作
其他方法:
onEnter()
当此节点所在的场景即将呈现时,会调用此方法
onEnterTransitionDidFinish()
当此节点所在的场景的入场动作结束后,会调用此方法。如果所在场景没有入场动作,则此方法会紧接着onEnter()后被调用。
onExit()
当此节点所在场景即将退出时,会调用此方法
onExitTransitionDidStart()
当此节点所在场景的出场动作结束后,会调用此方法。如果所在场景没有出场动作,则此方法会紧接着onExit()后被调用。
以上是关于节点和坐标系的主要内容,如果未能解决你的问题,请参考以下文章
Unity3D3D 物体概念 ② ( 空物体概念 | 创建空物体 | 利用空物体管理多个子节点 | 世界坐标系和本地坐标系操作模式 | 切换坐标系操作模式 | 轴心和几何中心模式 )
ocos2d-x 3.0坐标系详解--透彻篇 ---- convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。