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分析的更多相关文章

  1. Hadoop入门学习笔记---part4

    紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...

  2. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  3. PyQt4入门学习笔记(三)

    # PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...

  4. PyQt4入门学习笔记(一)

    PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...

  5. Hadoop入门学习笔记---part2

    在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...

  6. Hadoop入门学习笔记---part1

    随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...

  7. Scala入门学习笔记三--数组使用

    前言 本篇主要讲Scala的Array.BufferArray.List,更多教程请参考:Scala教程 本篇知识点概括 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer 提 ...

  8. OpenCV入门学习笔记

    OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...

  9. UML和模式应用学习笔记-1(面向对象分析和设计)

    UML和模式应用学习笔记-1(面向对象分析和设计) 而只是对情节的记录:此处的用例场景为:游戏者请求掷骰子.系统展示结果:如果骰子的总点数是7,则游戏者赢得游戏,否则为输 (2)定义领域模型:在领域模 ...

随机推荐

  1. Fix: Unable to terminate process ‘Access is denied’ 杀进程,关服务

    https://appuals.com/fix-unable-to-terminate-process-access-is-denied/ 我 Process Hacker (方法3),成功杀掉: 阿 ...

  2. 好程序员web前端分享想要学习前端需要学那些课程

    好程序员web前端分享想要学习前端需要学那些课程,仔细思考了一下如何回答好这个话题,其实前端是一个涵盖面非常之广泛的一个职位,所需知识体系非常庞杂,与传统语言“想要精一行,必先通一门” 有很大差别, ...

  3. 你所不知道的ASP.NET Core MVC/WebApi基础系列(一)

    前言 最近发表的EF Core貌似有点多,可别误以为我只专攻EF Core哦,私下有时间也是一直在看ASP.NET Core的内容,所以后续会穿插讲EF Core和ASP.NET Core,别认为你会 ...

  4. maven笔记学习

    一.修改setting.xml文件中的镜像 在导入他人项目或者在导入项目时,我们会出现在项目中不能识别maven配置的库文件的情况那么我们可以重新下载本地库, 首先我们可以修改我们安装的maven环境 ...

  5. JQuery滚动分页查询功能

    //获取滚动条的高度 function getScrollTop() { var scrollTop = 0; if (document.documentElement && docu ...

  6. Python之shutil模块(复制移动文件)

    用python实现将某代码文件复制/移动到指定路径下.场景例如:mv ./xxx/git/project1/test.sh ./xxx/tmp/tmp/1/test.sh (相对路径./xxx/tmp ...

  7. 使用py,根据日志记录自动生成周报

    日志格式如下,思路是如果检测到文件中的内容为5位或者8位,即12.11或18.12.11,同时存在.即认为当前行为日期数据仅作为方便查看日志使用,生成脚本时过滤此行.每次读取到空白行的时候则认为下一条 ...

  8. 一、commander

    #!/usr/bin/env node const program = require('commander'); const colors = require('colors'); const pk ...

  9. CMDB(Configuration Management Database)资产管理系统和 运维自动化

    一.传统运维方式和自动化运维的区别 二.CMDB的介绍 三.CMDB的四种方式 四.项目的目录架构介绍以及配置文件的升级编写 五.比较low的项目架构书写 六.可插拔式收集资产 七.对收集的服务器信息 ...

  10. 使用FindBugs寻找bug,代码分析

    安装就不说了,网上很多. 一些常见的错误信息 Bad practice 代码中的一些坏习惯 Class names should start with an upper case letter 主要包 ...