Cocos2d-X游戏开发
- 节点
对象关系图:
节点(Node)是Cocos2d-x中最重要的类,继承自Ref类,同时也是所有节点的父类。
Cocos2d-x看所有需要绘制到屏幕的对象,或是自身包含要绘制到屏幕中的对象,都继承自Node类,最常用的节点包括场景、层、精灵和菜单等,每一个节点只有一个父节点,但是可以有任意数量的子节点。
成员变量:
名称 |
功能 |
_rotationX |
表示节点X轴的水平旋转的角度,节点以锚点为中心顺时针旋转一定量,单位是角度。 |
_rotationY |
表示节点y轴的垂直旋转的角度,节点以锚点为中心顺时针旋转一定量,单位是角度。 |
_scaleX |
表示节点X轴的缩放比例,节点以锚点为中心缩放该比例。 |
_scaleY |
表示节点Y轴的缩放比例,节点以锚点为中心缩放该比例。 |
_position |
表示节点在屏幕中的位置。 |
_skewX |
表示节点X轴的倾斜解度,节点以锚点为中心,平行X轴顺时针变形,单位为角度,默认值为0 |
_skewY |
表示节点y轴的倾斜解度,节点以锚点为中心,平行y轴逆时针变形,单位为角度,默认值为0 |
_anchorPoint |
表示节点的锚点,用于精确地控制节点的位置和位置的变换,节点的变形和定位操作都要依据锚点来确定。 |
_contentSize |
表示未经转换的节点内容大小,以point(点)为单位。 |
_globalZOrder |
表示节点相对于其"兄弟"节点(拥有共同的父节点)的Z顺序值。 |
_children |
节点的子节点数组,变量类型是Vector<Node*>. |
_parent |
节点的父节点,通常很少用到。变量类型是Node. |
_tag |
用于识别节点的标识值。 |
_userData |
获取或设置与节点相关的额外信息,变量是一个void的指针对象,表示不确定的对象,可以是一个数据块、一个结构或一个对象等,我们可以利用这个属性来保存任何数据。 |
_visible |
用于判断节点是否可见。 |
_running |
当使用同样的Z值对子节点进行排序时,用该成员变量来决定子节点的顺序,不要手动更改改数值。 |
_orderOfArrival |
用于判断当前节点是否在运行。 |
成员方法:
名称 |
类型 |
功能 |
virtual void addChild(Node* childNode) |
处理子节点 |
将新节点添加为当前场景节点的子节点,z-order的值为0 |
virtual void addChild(Node* child,int localZOrder,int tag) |
处理子节点 |
将新节点添加为当前场景节点的子节点并设置子节点的Z值。 |
virtual void addChild(Node* child,int localZOrder) |
处理子节点 |
将新节点添加为当前场景节点的子节点并设置子节点的Z值和tag值。 |
Node *getChildByTag(int tag) |
处理子节点 |
使用场景容器的tag获取子节点 |
virtual Vector<Node*>&getChildren() |
处理子节点 |
获取所有子节点 |
virtual void removeChildByTag(int tag,bool cleanup=true) |
处理子节点 |
通过tag删除子节点。 |
virtual void removeChild(Node* child, bool cleanup=true) |
处理子节点 |
通过节点指针删除子节点。 |
virtual void removeAllChildern() |
处理子节点 |
删除节点的所有子节点。 |
Action* runAction(Action* action) |
动作 |
运行某个特定的动作,并返回执行的动作。 |
void stopAction(Action* action) |
动作 |
从运行的动作列表中停止和删除一个特定的动作。 |
void stopActionByTag(int tag) |
动作 |
根据tag值从运行的动作列表停止和删除一个特定的动作。 |
void stopAllActions() |
动作 |
从运行的动作列表中停止和删除所有的动作。 |
Action* getActionByTag(int tag) |
动作 |
根据tag值从运行的动作列表中获得一个特定的动作。 |
void scheduleUpdate() |
定时器事件 |
启用定时器回调更新函数,该函数每一帧都会被调用。 |
void schedule(SEL_SCHEDULE selector,float interval) |
定时器事件 |
如果需要根据不同的时间间隔来触发不同的定时更新逻辑,就需要指定运行特定的更新函数。 |
void scheduleOnce(SEL_SCHEDULE selector,float delay) |
定时器事件 |
指定运行特定的更新函数,并设置调用的延迟时间,但只运行一次 |
void unscheduleUpdate() |
定时器事件 |
停止scheduleUpdate中设置的预定更新函数update |
void unscheduleUpdate(SEL_SCHEDULE selector) |
定时器事件 |
停止指定运行的特定更新函数 |
virtual bool int() |
其它 |
该函数用于初始化节点,返回bool值,表示是否成功。 |
virtual void onEnter() |
其它 |
当节点所在的场景即将呈现时调用。 |
virtual void onExitTransitionDidStart() |
其它 |
当节点所在场景的出场过渡效果结束后调用,如果没有过渡效果,则紧接着onExit()后被调用。 |
virtual void cleanup() |
其它 |
函数用于停止所有运行中的动作和定时器函数 |
virtual void draw() |
其它 |
重写该函数以绘制自己的节点 |
- 导演
在Cocos2d-x中,把统筹游戏大局的类抽象为导演类(Director),Director是整个cocos2d-x引擎的核心,是整个游戏的导航仪。游戏中的一些常用操作就是由Director来控制的,比如OpenGL ES的初始化,场景的转换,游戏暂停继续的控制,世界坐标和GL坐标之间的切换,对节点的控制等,还有一些游戏数据的保存调用,屏幕尺寸的获取等都要由Director类来管理控制的。
因为Director是游戏项目的总导演,会经常调用进行一些控制,所以该Director利用了单件设计模式,也就是整个游戏里只有一个导演类。用getInstance()方法取得Director的实例。
//创建一个导演类的单例
Director* pDirector =Director::getInstance();
getVisibleSize:获得可视区域的大小。若是设计分辨率跟屏幕尺寸一样大,则getVisibleSize便是getWinSize。
getWinSize:获取屏幕大小。
getVisibleOrigin:表示可视区域的起点坐标。
另外还有一个就是Node节点里面的getContentSize()函数。
getContentSize:来获得节点(Node)原始的大小。只是逻辑尺寸,不是像素
//获取屏幕大小
autovisibleSize =Director::getInstance()->getVisibleSize();
Vec2origin =Director::getInstance()->getVisibleOrigin();
- 场景
在游戏里,场景就是关卡。关卡由人物角色和背景构成。在电影里,场景就是电影中的各种场面,各种场面主要由人物活动和背景等构成。而在Cocos2d-x 引擎中,场景存放的是需要渲染的布景,任务角色和菜单,它可以作为一个整体,一起渲染,一起销毁,一起被场景切换使用。
即游戏关卡的实施者,其管理这多个Layer,进行场景展现,相关业务逻辑的处理等;
一个场景就是一个界面,定义了所显示的所有角色图层信息
Scene(场景)是一个抽象的概念,仅被用作Node(节点)的一个子类。Scene(场景)和Node(节点)几乎相同,不同的是Scene的默认锚点在屏幕的中心。现在 scene 没有其它的逻辑,不需要我们做太多的操作及处理,更多的操作处理基本都是在布景层上完成。
//创建场景
autoscene =Scene::create();
//创建图层对象
autolayer =StartLayer::create();
//将图层添加到场景
scene->addChild(layer);
- 图层
Layer是处理玩家事件响应的Node子类。与场景不同,层通常包含的是直接在屏幕上呈现的内容,并且可以接受用户的输入事件,包括触摸、键盘输入等。我们需要在层中加入Sprite(精灵)、文本标签或者其它游戏元素,并设置游戏元素的属性,比如位置、方向和大小;设置游戏元素的动作等。在我们设计好层以后,只需要把层按照顺序添加到场景中就可以显示出来了。一个场景中有多个可以交互的图层,每层显示不同的角色信息,Layer层一方面作为容器使用,另一方面处理相关事件的响应(如触摸点击、用户输入等)。
//创建一个层
auto layer =StartLayer::create();