cocos2d-x入门学习笔记——Hello world分析
Hello world分析
1. “resource”文件夹
用于存放图片、音频和配置等资源文件。为了方便管理,可以创建在其中创建子文件夹。Cocos2d-x为我们屏蔽了不同平台对于文件路径的定义。
2. “incluce”和“source”文件夹
这两个文件夹用来存放游戏头文件和源代码文件。项目模板为我们添加的三个文件分别为”main.h”,”main.cpp”和”resource.h”,它们是平台相关的程序文件,为Window专有。
通常情况下,程序入口与资源文件管理在不同平台下是不同的,但是cocos2d-x的模板已经基本为我们处理好这些细节,不需要对它们进行修改。
3. “AppDelegate.h”和”AppDelegate.cpp”文件
这两个文件是cocos2d-x游戏的通用入口文件,类似于一般windows工程中主函数所在的文件。AppDelegate在iOS工程中就是程序的入口文件。
Cocos2d-x来源于Cocos2d-iPhone,在很多方面沿袭了Cocos2d-iPhone的使用习惯。
AppDelegate.cpp
1. bool applicationDidFinishLaunching()
程序启动后将调用这个方法,默认启动后已经包含了游戏启动后的必要准备:
// initialize director
// 初始化游戏引擎控制器CCDirector,以便启动游戏引擎
CCDirector *pDirector = CCDirector::sharedDirector();
pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
// turn on display FPS 使用FPS显示
pDirector->setDisplayStats(true);
// set FPS. the default value is 1.0/60 if you don't call this
// 设置绘制间隔
pDirector->setAnimationInterval(1.0 / );
// create a scene. it's an autorelease object
// 创建HelloWorld场景
CCScene *pScene = HelloWorld::scene();
// run
pDirector->runWithScene(pScene);
// 表示已经正常初始化
return true;
// 开启高分辨率屏幕(如iOS系列设备的Retina屏幕)支持
// pDirector->enableRetinaDisplay(true);
开启FPS显示:FPS即每秒帧速率,即屏幕每秒重绘的次数,启用后会在游戏左下角显示。在游戏开发阶段,可以方便地确定游戏运行是否流畅。
绘制间隔:指两次绘制间隔的时间间隔,因此绘制间隔的倒数就是FPS的上限。过低的每秒重绘次数会使动画显示出现卡顿的现象,而提高每秒重绘次数会导致设备运算量大幅增加,造成更高的能耗。人眼的刷新频率为每60次一秒。
2. void applicationDidEnterBackground()
应用程序将要进入后台时会调用这个方法,如用户把软件程序切换到后台,或手机接到电话或短信后程序被系统切换到后台时,会调用这个方法。 此时,应该暂停游戏中正在播放的音乐或音效。动作激烈的游戏成应该在此时进行暂停操作,以便玩家暂时离开游戏不会遭受重大损失。
3. void applicationWillEnterForeground()
与applicationDidEnterBackground(()方法成对出现,在应用回到前台时被调用。相对地,通常在这里继续播放刚才暂停的音乐,显示游戏暂停菜单等。
4. “HelloWorldScene.h”和”HelloWorldScene.cpp”文件
定义了Hello World项目中默认的游戏场景。
Cocos2d游戏中可以简单概括为:场景、层、精灵,而这两个文件就是Hello World场景的实现文件。每个游戏组件都可以添加一个到另一个组件中,形成层次关系。 Hello中定义了一个HelloWorld类,该类继承自CCLayout类,因此HelloWorld本身就是一个层。HelloWorld类包含一个静态函数和两个实例方法。
static CCScene* scene()
在层下设置一个创建场景的静态函数。我们为Hello World层写了一个CCLayout的子类,在子类中为层添加各种精灵或是逻辑处理代码。 然而我们的Hello World场景十分简单,只包含了一个层,没有任何其他需要处理的问题。因此,除了创建CCScene的一个子类之外,也可以直接使用静态函数来创建一个空场景,再把层置入场景之间,这样也十分便捷,示例代码如下所示:
CCScene *scene = CCScene::create();
HelloWorld *layout = HelloWorld::create();
Scene->addChild(layout);
bool init()
初始化HelloWorld类
基本概念
1. 场景与流程控制
把那些内容想到不变的游戏元素集合称作场景,把游戏在场景之间切换的过程叫做流程控制。
场景的实现是CCScene。
2. 层
隶属于场景下的游戏元素。通常,一个复杂场景会拥有多个层,一个层会显示一部分视觉元素,空白部分为透明或半透明,以实现多个层的重叠显示。层与层之间按照顺序叠放在一起,就组成了一个复杂的场景。
层的实现是CCLayout
3. 精灵
隶属于层,是场景中的可见图形。可以这样认为,一家看到的一切几乎都是由精灵构成的。
通常,一个精灵可以不断变化,变化的方式包括:移动、旋转、缩放、变形、显现、消失、动画效果等。
精灵的实现是CCSprite。
4. 节点与渲染树
从组织关系的角度来说,游戏元素按照树形结构组织起来;
从绘图的角度来说,图形按照自上而下的顺序绘制出来。
关系图实质上安排了图元的绘图方式,关系图中的每一个元素称作节点(node),关系图则称作渲染树(rendering tree)。渲染场景的过程就是遍历渲染树的过程。
一旦建立起渲染树,组织复杂的场景就变得十分简单。我们赋予每个节点一系列属性,包括节点相对于父节点的位置、旋转角度、缩放比例和变形参数等,就可以逐层创建复杂的对象或动作。
Cocos2d-x也采用了渲染树架构。任何可见的游戏元素都派生自Cocos2d-x节点(CCNode),常见的游戏元素都有场景、层和精灵等。
(实际开发中,如果有特殊要求,也不必拘泥于这个层次顺序。)
5. 动作与动画
动作作用于游戏元素,可以使游戏元素运动起来。常见的动作有移动、转动、闪烁、消失等。动作分为持续性动作与瞬时动作。
持续性动作在一段时间内完成,瞬时动作会瞬间完成。
动作为CCAction类实现,由CCAction类派生出持续性动作类CCActionInterval和瞬时动作类CCActionInstant,所有的动作都派生于以上两个类之一。
动画是一种特殊的持续性动作,它只能应用在精灵上,用于实现帧动画效果。
静止的图片叫帧(frame),帧的序列代表一个动画效果。
在Cocos2d-x中,我们使用多个帧创建帧动画序列(CCAnimation) ,并用帧动画序列创建可作用于精灵的帧动画(CCAnimate)。
代码风格
1. 命名空间与类名称
通常我们只要在使用时包含”cocos2d.h”,就可以使用引擎有全部功能了。 Cocos2d-x的类都放置于cocos2d命名空间下。
2. 构造函数与初始化
Cocos2d-x不使用传统的值类型,所有的对象都创建在堆上,然后通过指针引用。创建Cocos2d-x对象有通常两种方法:
第一种是首先使用new操作符创造一个未初始化的对象,然后调用init系列方法来初始化。
第二种是使用静态的工厂方法直接创建一个对象。
Objective-C中没有构造函数。
区别:使用构造函数创建的对象,它的所有权已经属于调用者了,使用工厂方法创建的对象的所有权是却并不属于调用者,因此,使用构造函数创建的对象需要调用者负责释放,而使用工厂方法创建的对象则不需要。
3. 选择器
在Objective-C中,选择器是类似于C++中的类函数指针的机制,Cocos2d-x也提供了一系列类似于Objective-C中创建选择器语法的宏,用来创建函数指针。
4. 属性
Cocos2d-x规定了属性访问器的方法名称以get或set为前缀,后接属性名。在CCNode中包含大量属性
为了避免重复的工作,Cocos2d-x提供了一系列宏来帮助我们方便地创建属性。
每个宏都有3个参数,分别是:
- varType,属性类型,如果属性类型是对象,需要写成指针形式;
- varName,属性的私有字段字称;
- funName,属性的访问名称,也就是紧接在get或set前缀后的部分
5. 单例
单例模式保证了全局有且只有一个实例对象,保证自动地初始化该对象,使得程序任何时候任何地方都可以访问、获取该对象。
Cocos2d-x中的内存管理
基于Cocos2d-iPhone的Objective-C风格的内存管理是Cocos2d-x的一个特色。把Objective-C的内存管理方式引入C++,使得游戏开发的内存管理难度下降了一个层次。
Cocos2d-x很巧妙地运用了引用计数机制。为了与Objective-C一致,Cocos2d-x了采用了引用计数与自动回收的内存管理机制。
每一个对象包含一个用来控制生命周期的引用计数器,它是CCObject的成员变量,m_Reference。我们可以通过retainCount()方法获得对象当前的引用计数值。在对象通过构造函数创建的时候,该引用值被赋为1,表示对象由创建者所引用。在其它地方需要引用对象时,我们会调用retain()方法,令其引用增1,表示获取该对象的引用权;在引用结束的时候调用release()方法,令其引用计数值减1,表示释放该对象的引用权。
autorelease(),其作用是将对象放入自动回收池(CCAutoreleasePool)。当回收池自身被释放的时候,它就会对池中的所有对象执行一次release(),实现灵活的垃圾回收。即使我们没有手工创建和释放回收池,每一帧结束的时候,自动回收池中的对象也都会被执行一次release()方法。
如果在一帧之内生成了大量的autorelease()对象,将会导致回收池性能下降。因此,在生成autorelease()对象密集的区域前后,我们最好可以手动创建并释放一个回收池。
我们可以通过CCPoolManager的push()和pop()方法来创建或释放回收池。
自动回收池是可以嵌套的,
原则:
- 程序段必须成对执行retain()和release()或者执行autorelease()来声明开始和结束对象的引用。
- 工厂方法返回前,应通过autorelease()结束对该对象的引用
- 对象传值时,应考虑到新旧对象相同的特殊情况
- 尽量使用release()而不是autorelease()来释放对象引用,以确保性量最优
- 保存CCObject的子类对象时,应严格使用Cocos2d-x提供的容器,避旬使用STL容器,对象必须以指针形式存入
cocos2d-x入门学习笔记——Hello world分析的更多相关文章
- Hadoop入门学习笔记---part4
紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...
- Hadoop入门学习笔记---part3
2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...
- PyQt4入门学习笔记(三)
# PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...
- PyQt4入门学习笔记(一)
PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...
- Hadoop入门学习笔记---part2
在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...
- Hadoop入门学习笔记---part1
随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...
- Scala入门学习笔记三--数组使用
前言 本篇主要讲Scala的Array.BufferArray.List,更多教程请参考:Scala教程 本篇知识点概括 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer 提 ...
- OpenCV入门学习笔记
OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...
- UML和模式应用学习笔记-1(面向对象分析和设计)
UML和模式应用学习笔记-1(面向对象分析和设计) 而只是对情节的记录:此处的用例场景为:游戏者请求掷骰子.系统展示结果:如果骰子的总点数是7,则游戏者赢得游戏,否则为输 (2)定义领域模型:在领域模 ...
随机推荐
- MATLAB中“fitgmdist”的用法及其GMM聚类算法
MATLAB中“fitgmdist”的用法及其GMM聚类算法 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 高斯混合模型的基本原理:聚类——GMM,MA ...
- Scrapy框架-Spider
目录 1. Spider 2.Scrapy源代码 2.1. Scrapy主要属性和方法 3.parse()方法的工作机制 1. Spider Spider类定义了如何爬取某个(或某些)网站.包括了爬取 ...
- 配置安全的管理访问(GNS3)
实验拓扑: 实验目的: 尝试用R2/R3远程登陆R1路由器并进行管理,在此之前先在R1配置安全的管理访问 1.端口IP配置 R1: e1/0 192.168.1.1/24 e1/1 192.168.2 ...
- June 28th. 2018, Week 26th. Thursday
You cannot change the circumstances but you can change yourself. 既然改变不了环境,那就改变自己. From Jim Rohn. Rec ...
- DNS域名解析过程,域名的认识
DNS域名解析过程 参考知乎:https://www.zhihu.com/question/23042131 当你通过浏览器输入url访问资源时,会请求DNS解析域名成对应的IP地址,由IP地址在去与 ...
- linux驱动简单介绍
linux驱动简单介绍 驱动基本介绍 驱动.顾名思义就是“驱使硬件设备行动”.设备驱动与底层硬件之间打交道,按照硬件设备的具体操作方式来读写设备寄存器,最终完成一系列操作. 设备 驱动充当了应用程序 ...
- poium测试库介绍
poium测试库前身为selenium-page-objects测试库,我在以前的文章中也有介绍过:这可能是最简单的Page Object库,项目的核心是基于Page Objects实现元素定位的封装 ...
- Charles(V3.10.1)的抓包以及常见功能的使用
一.Charles的安装 安装都不会,那就不用再往下看了.(*^__^*) 嘻嘻…… 二.HTTP抓包 1.查看电脑IP地址 2.设置手机的HTTP代理 手机连接到同一WiFi下设置HTTP代理: 服 ...
- vue 父子之间的通讯
//父组件<template> <Button @click='openChild'><Button> <child-modal :moda ...
- SpringBoot:Invalid character found in method name. HTTP method names must be tokens
问题背景 关于SpringBoot应用挂了很久之后,会发生Invalid character found in method name. HTTP method names must be token ...