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. MATLAB中“fitgmdist”的用法及其GMM聚类算法

    MATLAB中“fitgmdist”的用法及其GMM聚类算法 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 高斯混合模型的基本原理:聚类——GMM,MA ...

  2. Scrapy框架-Spider

    目录 1. Spider 2.Scrapy源代码 2.1. Scrapy主要属性和方法 3.parse()方法的工作机制 1. Spider Spider类定义了如何爬取某个(或某些)网站.包括了爬取 ...

  3. 配置安全的管理访问(GNS3)

    实验拓扑: 实验目的: 尝试用R2/R3远程登陆R1路由器并进行管理,在此之前先在R1配置安全的管理访问 1.端口IP配置 R1: e1/0 192.168.1.1/24 e1/1 192.168.2 ...

  4. June 28th. 2018, Week 26th. Thursday

    You cannot change the circumstances but you can change yourself. 既然改变不了环境,那就改变自己. From Jim Rohn. Rec ...

  5. DNS域名解析过程,域名的认识

    DNS域名解析过程 参考知乎:https://www.zhihu.com/question/23042131 当你通过浏览器输入url访问资源时,会请求DNS解析域名成对应的IP地址,由IP地址在去与 ...

  6. linux驱动简单介绍

     linux驱动简单介绍 驱动基本介绍 驱动.顾名思义就是“驱使硬件设备行动”.设备驱动与底层硬件之间打交道,按照硬件设备的具体操作方式来读写设备寄存器,最终完成一系列操作. 设备 驱动充当了应用程序 ...

  7. poium测试库介绍

    poium测试库前身为selenium-page-objects测试库,我在以前的文章中也有介绍过:这可能是最简单的Page Object库,项目的核心是基于Page Objects实现元素定位的封装 ...

  8. Charles(V3.10.1)的抓包以及常见功能的使用

    一.Charles的安装 安装都不会,那就不用再往下看了.(*^__^*) 嘻嘻…… 二.HTTP抓包 1.查看电脑IP地址 2.设置手机的HTTP代理 手机连接到同一WiFi下设置HTTP代理: 服 ...

  9. vue 父子之间的通讯

    //父组件<template>     <Button @click='openChild'><Button>      <child-modal :moda ...

  10. 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 ...