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. 将n*n矩阵顺时针旋转90度

    /** * 将n*n矩阵顺时针旋转90度 * @param mat * @param n 矩阵的阶数 * @date 2016-10-7 * @author shaobn */ public stat ...

  2. 商人过河问题(DFS)

    问题描述:3个商人带着3个仆人过河,过河的工具只有一艘小船,只能同时载两个人过河,包括划船的人.在河的任何一边,只要仆人的数量超过商人的数量,仆人就会联合起来将商人杀死并抢夺其财物,问商人应如何设计过 ...

  3. AJAX-----13HTML5中新增的API---FormData

    FormData 表单数据对象,这是在HTML5中新增的一个API,他能以表单对象做参数,自动的将表单的数据打包,当ajax发送数据是,发送FormData内的表单数据给后端即可 <!DOCTY ...

  4. 《zw版·delphi与Halcon系列原创教程》THOperatorSetX版hello,zw

    <zw版·delphi与Halcon系列原创教程>THOperatorSetX版hello,zw 下面介绍v3版的hello,zw. Halcon两大核心控件,THImagex.THOpe ...

  5. easyui datagrid将表头的checkbox不显示(隐藏)

    <script type="text/javascript"> $(function(){ $("#dg").datagrid({ url:&quo ...

  6. Spark中文指南(入门篇)-Spark编程模型(一)

    前言 本章将对Spark做一个简单的介绍,更多教程请参考:Spark教程 本章知识点概括 Apache Spark简介 Spark的四种运行模式 Spark基于Standlone的运行流程 Spark ...

  7. C++ Programming language读书笔记

    C语言,结构化程序设计.自顶向下.逐步求精及模块化的程序设计方法;使用三种基本控制结构构造程序,任何程序都可由顺序.选择.循环三种基本控制结构构造. 模块结构:"独立功能,单出.入口&quo ...

  8. 再谈Bellman-Ford

    这几天学校女生节,挺累的,感觉还是挺好玩的,前几天看了一下最短路,Bellman-fort算法果然比较厉害,今天又参考了刘汝佳的两本书,有了一点新的认识. 废话不说,先上代码: #include &l ...

  9. epoll实现压测工具

    代码: /* * g++ -o stress_test ./stress_test.cpp */ #include <stdlib.h> #include <stdio.h> ...

  10. iOS开发-- 创建podspec文件,为自己的项目添加pod支持

    开篇扯淡 作为一个iOS开发者,一定用过CocoaPods吧,没用过?点这儿去面壁吧 Cocoapods作为iOS开发的包管理器,给我们的开发带来了极大的便利,而且越来越多的第三方类库支持Pod,可以 ...