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 的两大基类的更多相关文章

  1. Java入门到精通——框架篇之Spring源码分析Spring两大核心类

    一.Spring核心类概述. Spring里面有两个最核心的类这是Spring实现最重要的部分. 1.DefaultListableBeanFactory 这个类位于Beans项目下的org.spri ...

  2. 4.5. scrapy两大爬虫类_Spider

    一:Spider Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取 的 ...

  3. 【转载】 C++多继承中重写不同基类中相同原型的虚函数

    本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: ...

  4. 0014 基于DRF框架开发(02 基类视图 GenericAPIView)

    前端于对数据操作的请求基本上就分为四类:增删改查,即增加.删除.修改.查询. 而DRF把前端请求分为两个大类:带ID参数请求和不带ID参数请求. 不带ID参数请求包括:增加.分布多条查询 带ID参数请 ...

  5. 【c++】虚基类

    何要使用虚基类: 为何避免多层继承中出项多个公共基类所造成的歧义现象 虚基类用法 派生类继承基类时,加上一个virtual关键词则为虚拟基类继承. 在上图程序运行中,我们发现class bass的构造 ...

  6. 第十二周项目一 教师兼干部类】 共建虚基类person

    项目1 - 教师兼干部类]分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部).要求: (1)在两个基类中都包含姓名.年 ...

  7. C++学习之路—继承与派生(三):多重继承与虚基类

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多重继承是指一个派生类有两个或多个基类.例如,有 ...

  8. IO知识点整理(四种基类的使用)

    一:介绍 1.两种基类 字节流 InputStream,OutputStream 字符流 Reader,Writer 二:字符流的基本方法(文字的处理比较常见) 1.Writer的API 2.File ...

  9. asp.net mvc webform和razor的page基类区别

    接触过asp.net mvc的都知道,在传统的webform的模式下,page页面的基类是这样声明的: <%@ Page Language="C#" MasterPageFi ...

随机推荐

  1. JSP-12-使用过滤器和监听器

    1 什么是过滤器及其工作方式 向Web应用程序的请求和响应添加功能的Web组建 过滤器可以统一的集中处理请求和响应 15.2 过滤器的实现 新建 filter ,注意此时是在 src中建立的(同cla ...

  2. 服务器保持与Mysql的连接

    服务器程序经常要访问数据库,并且服务器程序是长时间保持运行的,mysql有一个特点,当连接上数据库后不做任何操作,默认8小时候会自动关闭休 眠的连接!一般情况下很难预料什么时候程序会执行数据库操作,如 ...

  3. 十一、Java基础---------内部类与匿名内部类

    内部类分为普通内部类(有名)和匿名内部类.普通内部类分为成员内部类.局部内部类.静态内部类(嵌套内部类).顾名思义,内部类就是定义在一个类内部的类.什么时候都会使用内部类呢?当我们定义一个类,发现内部 ...

  4. LNK1169: one or more multiply defined symbols found

    The build failed due to multiple definitions of one or more symbols. This error is preceded by error ...

  5. CRM 2011 Install Errors - Tips and Tricks continued(转)

    The more I get to install/upgrade to CRM 2011 in different environment the more I come across differ ...

  6. centos 更新python

    1.CentOS安装Python的依赖包 yum groupinstall "Development tools"yum install zlib-devel bzip2-deve ...

  7. Dynamics AX 2012 R2 安装额外的AOS

    众所周知,AX系统分为三层:Client,Application Server,Database Server. 我们添加额外的Application Server主要是出于以下两个原因: 使用多台服 ...

  8. gulp watch error ENOSPC

    in linux you fix this with the command:echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sy ...

  9. GZFramework.DB.Core初始化

    单数据库初始化,以MSSQL为例 public class DBConfig : IDBConfig { public static void InitDB() { GZFramework.DB.Co ...

  10. JSON-SCHEMA

    这几天在写代码,和开发那边规范统一后,注释的JOSN需要写清楚schema, 于是学习了一下,国内的东西确实很少,看官网的英文文档也很蛋疼. 就把自己和看到的总结一下: http://json-sch ...