cocos2dx初体验
我们创建工程后总会自带一个HelloWorld类,短短的几行代码就出来了一个游戏的雏形,请问我们真的理解它了吗?如果我们能早一点弄明白这几行代码,我们或许会比现在走得更远。
理解HelloWorld类
HelloWorld去掉退出按钮只有下面三个函数。
static cocos2d::Scene* createScene();
virtual bool init();
CREATE_FUNC(HelloWorld);//一定要自己看源码
这三行代码一定要做到透彻理解和重写。因为所有的游戏场景都需要这三个函数。
创建游戏HelloWorld场景的时候,只需要在AppDelegate写一句: Helloworld::createScene();
请看它的实现
// 'scene' is an autorelease object
auto scene = Scene::create(); // 'layer' is an autorelease object
auto layer = HelloWorld::create(); // add layer as a child to scene
scene->addChild(layer); // return the scene
return scene;
首先新建一个新场景,然后create一个HelloWorld层并添加到新创建的场景,最后返回这个场景给AppDelegate。
一个场景的创建和展示就是这么简单,但是你有没有发现HelloWorld中没有create呢?并且没有调用init()方法呢?我们在HelloWorld中没有在任何地方看到调用init初始化,那么这是在哪里调用的呢?
这里当时我看一个博主的博客理解了半天,
其实就是在CREATE_FUNC(MainScene);中,你点击CREATE_FUNC按F12也行,右击转到定义也可以。
就会出现如下宏定义
#defineCREATE_FUNC(__TYPE__) \
static __TYPE__*create() \
{ \
__TYPE__ *pRet = new __TYPE__(); \
if (pRet && pRet->init()) \
{ \
pRet->autorelease(); \
return pRet; \
} \
else \
{ \
delete pRet; \
pRet = NULL; \
return NULL; \
} \
}
这里 \ 就是换行,因为宏定义代码如果放同一行阅读不方便
可以看到CREATE_FUNC宏其实是定义了一个静态成员函数,这个函数可以new一个新的对象,并对其进行init()操作。
这样整个Helloworld的逻辑就清晰了:
外部类调用static cocos2d::Scene* createScene();来创建一个新的场景。 CREATE_FUNC(HelloWorld);是定义一个静态的create类成员函数,并在这个函数中调用virtual bool init();初始化这个场景。
以后每当我们新建一个场景的时候,按照这个格式即可。好了,下面该动手了。
其实就是在HelloWorld.h中将helloworld换成MainScene,这就是在外部类调用函数创建了一个新的场景,那这样还不行啊,是不是,我们还要初始化这个场景,那就要调用virtual bool init();那怎么调用呢,就需要之前提到的CREATE_FUNC的宏定义,在宏定义里面调用。
所以这里就有这3行代码是非常重要的。
这样我们就完全掌握了游戏场景的创建和它的原理,其实更重要的是我们认识到了应该去怎么学,cocos2dx引擎使用了大量的宏定义,我们一定不能只追求表面的用法,而应该深入下去学习宏实现了那些东西。特别是到后面的内存管理更是如此。
总结一下,也再重复一遍,所有游戏场景的基础都是这三句代码:
static cocos2d::Scene* createScene();
virtual bool init();
CREATE_FUNC(HelloWorld);
cocos2dx初体验的更多相关文章
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
- 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
- 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验
在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...
- 百度EChart3初体验
由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...
- Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验
Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...
随机推荐
- Java基础知识3-类和对象(1)
面向过程和面向对象的区别 面向过程(结构化程序设计) 实际上是一个面向操作过程,首先设计一系列过程(算法)来求解问题(操作数据),然后再考虑存储数据的方式(组织数据).即程序=算法\+数据结构.对应典 ...
- Github使用SSH的步骤
1) 打开git bash命令行工具 2) 输入下面命令生成一对私钥和公钥 ssh-keygen -t rsa -b 4096 -C "你的github的邮箱" 3) 输入公钥和私 ...
- composer换源,composer切换国内源
首先要分清楚是局部换源还是全局换源 1.局部换源(仅对当前项目有效) 在当前项目下的composer.json中添加 { "repositories": [ { "typ ...
- JDBCUtils,根据当前MySQL数据库下面的表生成java实体类
自己简单写的JDBCUtils,可以根据当前数据库下面的表生成java实体类,代码萌新,请多多包涵. 初始化配置: //驱动程序名//不固定,根据驱动 static String driver = & ...
- 记一次mysql多表查询(left jion)优化案例
一次mysql多表查询(left jion)优化案例 在新上线的供需模块中,发现某一个查询按钮点击后,出不来结果,找到该按钮对应sql手动执行,发现需要20-30秒才能出结果,所以服务端程序判断超时, ...
- 搭建DVWA Web渗透测试靶场
文章更新于:2020-04-13 按照惯例,需要的文件附上链接放在文首. 文件名:DVWA-1.9-2020.zip 文件大小:1.3 M 文件说明:这个是新版 v1.9 (其实是 v1.10开发版) ...
- pycharm 永久激活方法
打开终端,执行: cd /etc/ sudo vim hosts 在最后一行加上: 0.0.0.0 account.jetbrains.com 打开pycharm,选择Activation Code ...
- 我对KMP算法的理解
KMP算法的核心在于失配回溯表——pnext,相比于通过逐个比较来匹配字符串的朴素算法,KMP通过对模式串的分析,可以做到比较指针在主串上不回溯,一直向前. 1. KMP如何实现不回溯? 对于主串 t ...
- String 对象-->substring() 方法
1.定义和用法 substring() 方法用于提取两个指定下标之间的字符. substring() 方法返回的子串包括 开始 处的字符,但不包括 结束 处的字符 语法: string.substri ...
- JS生成随机颜色(rgb)
/*随机获取颜色*/ function getRandomColor() { var r = Math.floor(Math.random() * 256); var g = Math.floor(M ...