cocos2d-x 的两大基类
cocos2d-x 有两个重要的基类,一个管理引用计数的 Ref,别一个则定义许多基本属性的 Node。
在 cocos2d-x 中的基本概念 说到 create 函数的时候提到 cocos2d-x 的内存管理机制。cocos2d-x 的内存管理机制借鉴了OC的内存管理机制,实现方法就是 Ref 这个类(去掉些碍眼的东西):
class Ref
{
public:
// 保有
void retain();
// 释放
void release();
// 自动管理
Ref* autorelease();
// get 引用计数
unsigned int getReferenceCount() const;
protected:
Ref();
public:
virtual ~Ref();
protected:
// 引用计数
unsigned int _referenceCount;
friend class AutoreleasePool;
};
类很简单,只有一个字段:
unsigned int _referenceCount;
保存当前对象有多少个引用,创建对象时初始化为 1,当等于 0 时会自动调用析构函数释放内存;
四个函数也很简单, retain release 分别是在原引用计数上+1 ,-1,保存对象时需要 retain, 不需要保存时 release,引擎有封装的数据容器,可以避免忘记 retain 和 release,所以一般情况下用不到。
Ref* autorelease();
只在创建对象时调用一次,添加到内存池内,在引用计数为 0 时自动释放内存;在默认的 create 函数中都有调用,自己写 create 时也要记得调用。
最后一个函数就是获取当前的引用计数,见名知意。
Ref 几乎是所有类的父类,除了一些简单的数据类,所以在许多回调函数中使用Ref 作参数,可以在回调函数内使用动态类型转化为原来的类型。
Node 是个内容很多的类,挑出一些常用的来看:
class Node : public Ref
{
public:
static Node * create();
virtual void addChild(Node * child);
virtual void addChild(Node * child, int localZOrder);
virtual void addChild(Node* child, int localZOrder, int tag);
virtual void addChild(Node* child, int localZOrder, const std::string &name);
void scheduleUpdate(void);
virtual void update(float delta);
virtual void onEnter();
virtual void onExit();
protected:
// Nodes should be created using create();
Node();
virtual ~Node();
virtual bool init();
protected:
float _rotationX; //旋转 以X轴
float _rotationY; //旋转 以Y轴 float _scaleX; //放缩 X Y Z
float _scaleY;
float _scaleZ; float _skewX; // 倾斜 X Y
float _skewY; Vec2 _position; //位置
Vec2 _anchorPoint; //锚点 Size _contentSize; //大小尺寸 int _localZOrder; //本地渲染顺序
float _globalZOrder; //全局渲染顺序 int _tag; //标签
std::string _name; //名字 bool _running; //是否运行
bool _visible; //是否可见
Vector<Node*> _children; //子节点
Node *_parent; //父节点 Director* _director; // 导演
Scheduler *_scheduler; // 定时器
ActionManager *_actionManager; // 动作管理器
EventDispatcher* _eventDispatcher; // 监听管理器
}
上面的属性基本都有 set get 方法(下面有几个没有);旋转,放缩,倾斜 可以改变节点的形状;位置 节点在屏幕中的位置,父节点的位置影响子节点的位置 ;锚点 影响自身变形的效果; 大小 节点在屏幕中的矩形大小,一般同显示的图片,字体大小相同,可以更改;本地渲染顺序 影响兄弟节点的渲染顺序, 全局 影响所有节点 , 两个都是值大的, 显示在上面,值小的会被挡到,全局赋盖本地; 标签, 名字都是作标记用,便于快速找到标记的节点,用法相同,函数不同而已; 子节点 可以有多个,父节点只有一个,后面的 导演,定时器,动作 监听管理器在游戏初始化完成就有了,Node 构造时引用这些,合理利用这些已有的指针引用可以写出简捷,高效的代码。
属性挑出来的就有这么多,对应的方法就更多了,这里只拿 addChild 举个例子, addChild 有四个重载,必不可少的是 Node 节点,次之是本地渲染顺序,最后是用标签或名字打个标记, 这样的参数顺序并不一定合你意,没什么,用其他函数修改就行,你也可以给 Node 在添加两个函数,在cocos2d-x 开头配置(Windows 平台)中说过,新建项目会拷贝整个引擎,在一个项目里修改源码不影响其他项目,如果你觉得添加的功能十分实用,有必要保留下来,可以到Github上提交代码。
另外有几个有用的函数
virtual void update(float delta);
每帧调用,某些需要即时处理的内容可以重写这个函数把需要处理代码放在这里,但要在其他函数里调用scheduleUpdate(),不然不会执行。
virtual void onEnter();
virtual void onExit();
这两个是即将进入,离开节点是调用,处理一些运行时态度方便,自动调用。
这三个函数需要注意的量 : 在重写的代码里调用父类的update,onEnter,onExit 不然会出意想不到的问题。
create init 函数是从 Node 类开始的,init 中调用的父类的 init 最终会来到这个类,Node 类的 init 只返回 true;
bool Node::init()
{
return true;
}
Ref 是大部分类的基类方便管理内存,常用作函数参数,可转化为原类型
Node 类提供了大量的属性,虚函数,提高代码重用,减少程序员的重复劳动
cocos2d-x 的两大基类的更多相关文章
- Java入门到精通——框架篇之Spring源码分析Spring两大核心类
一.Spring核心类概述. Spring里面有两个最核心的类这是Spring实现最重要的部分. 1.DefaultListableBeanFactory 这个类位于Beans项目下的org.spri ...
- 4.5. scrapy两大爬虫类_Spider
一:Spider Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取 的 ...
- 【转载】 C++多继承中重写不同基类中相同原型的虚函数
本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: ...
- 0014 基于DRF框架开发(02 基类视图 GenericAPIView)
前端于对数据操作的请求基本上就分为四类:增删改查,即增加.删除.修改.查询. 而DRF把前端请求分为两个大类:带ID参数请求和不带ID参数请求. 不带ID参数请求包括:增加.分布多条查询 带ID参数请 ...
- 【c++】虚基类
何要使用虚基类: 为何避免多层继承中出项多个公共基类所造成的歧义现象 虚基类用法 派生类继承基类时,加上一个virtual关键词则为虚拟基类继承. 在上图程序运行中,我们发现class bass的构造 ...
- 第十二周项目一 教师兼干部类】 共建虚基类person
项目1 - 教师兼干部类]分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部).要求: (1)在两个基类中都包含姓名.年 ...
- C++学习之路—继承与派生(三):多重继承与虚基类
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多重继承是指一个派生类有两个或多个基类.例如,有 ...
- IO知识点整理(四种基类的使用)
一:介绍 1.两种基类 字节流 InputStream,OutputStream 字符流 Reader,Writer 二:字符流的基本方法(文字的处理比较常见) 1.Writer的API 2.File ...
- asp.net mvc webform和razor的page基类区别
接触过asp.net mvc的都知道,在传统的webform的模式下,page页面的基类是这样声明的: <%@ Page Language="C#" MasterPageFi ...
随机推荐
- 转: Oracle Form 中commit 与do_key('commit_form')区别
1.commit_form针对form上面的数据变动进行commit,对于代码中的类似update,insert语句也进行提交:如果form上面的数据变动和代码中的数据变动有冲突,最后以界面上的为准. ...
- 白话LINQ系列2---以代码演进方式学习LINQ必备条件
今天,我们通过一个简单的示例代码的演进过程,来学习LINQ必备条件:隐式类型局部变量:对象集合初始化器:委托:匿名函数:lambda表达式:扩展方法:匿名类型.废话不多说,我们直接进入主题. 一.实现 ...
- web移动前端的click点透问题
在移动端开发中,有时会出现click点透的问题. 一.什么是click点透 以下情况,在B元素上有半透明红色遮盖层A,黄色B元素内有可点击链接C. tips:以下举例仅针对webkit内核浏览器,所有 ...
- Safari中的new Date()格式化坑
今天在测试的时候发现,在Chrome中的如下代码: new Date("2014-03-09"); 在Safari中报错invalid date.经过查阅资料找到类似的问答: st ...
- viewpager实现酷炫侧滑demo
晚上叫外卖,打开饿了么,发现推了一个版本,更新以后,点开了个鸡腿,哇,交互炫炸了. 不过还是有槽点.我是无意中才发现可以左右滑动的.这...你不告诉我,我怎么知道左右可以滑. https://gith ...
- ubuntu下gcc、g++和gfortran版本切换
第一步:用 which gcc.which g++和which gfortran查看位置,我的显示结果为:/usr/bin/gcc:/usr/bin/g++和/usr/bin/gfortran 第二部 ...
- 读取NVRAM中的SN(barcode)
在Custom_NvRam_LID.h中,找到需要读取的ID对应的值 实现NvRAMAgent import java.lang.String; import android.os.RemoteExc ...
- 【SSO单点系列】(2):CAS4.0 登录页的个性化定制
上一篇 [SSO单点系列](1):CAS环境的搭建介绍了CAS最简单环境的搭建,以及一个例子用来讲解CAS的一个最基础的用法. 今天主要是介绍如何对CAS登录页进行个性化定制. 一.开始 下图是 ...
- c++实现螺旋矩阵分析总结
螺旋矩阵,是这么一个东西: 1 2 3 8 9 4 7 6 5 这是一个,n*n的矩阵,由外向里一次递增,一环一环,就好像一个螺旋一样.不难想象,如果n=5,那么应该是这样的: ...
- 15.Linux安装DHCP服务为虚拟机分配IP
参考博客:http://www.jb51.net/article/31607.htm $ rpm -ql dhcp #检查是否安装dhcp $ yum -y install dhcp* ...