Cocos2d-x 3.x游戏开发之旅(txt+pdf+epub+mobi电子书下载)


发布时间:2020-09-13 01:01:09

点击下载

作者:钟迪龙

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Cocos2d-x 3.x游戏开发之旅

Cocos2d-x 3.x游戏开发之旅试读:

前言

从2.0到3.0时代

我第一次接触Cocos2d-x的时候,它刚好发布了2.0版本,开始从1.x时代跨越到2.x时代。当时我还很庆幸,因为2.x相比1.x做出了很大的改动,而我,无须体验这种改动所带来的“怨念”。

一年前,我费尽心思所写的《Cocos2d-x游戏开发之旅》出版了,当时还是Cocos2d-x 2.0时代。有读者喜欢它的风格,也有读者讨厌它的唠叨,不管如何,它似乎帮助了不少读者入了Cocos2d-x的门。

然而,一年以来,Cocos2d-x 3.0版本渐渐浮出水面,我们要迎来3.0时代了,我有幸再一次见证了这种跨越时代的时刻。3.0终将替代2.0,为此,才有了这本《Cocos2d-x 3.x游戏开发之旅》。这不是全新的内容

本书主要目的是把2.0的内容升级为3.0版本,并不是重新写一本书,大部分内容结构是一样的,从目录中就可以看出来。如果说,这是一本全新的、内容完全不一样的书,那我可能就变成了一个专门写书的骗子了。在编写2.0版本的书时,我已经把我几年所积累的知识都花光了。现在仅仅是过了一年时间,我这一年时间的积累,还不足以写成一本全新的书。

所以,我特意在前言部分把这个情况说清楚,避免和读者之间造成不必要的误会。

当然,即使仅仅是内容的升级,我也花费了很多心血,一句句代码的检查、修改、优化,一行行文字的调整、修改、新增,并且加入了一些3.0特有的新内容,新增了网络游戏、广告接入、游戏发布等方面的内容。我不想再“生”了

一年前,编写完2.0版本的书时,我累趴了,写书比想象中累多了。那时我就告诉自己,“我这辈子再也不写书了!”,就像一位妈妈刚生完孩子一样,完全没有继续生下一个的勇气了。

然而,和所有的妈妈一样,时间长了,就忘记了痛苦,只记住了孩子带来的欢乐。我也不知道是什么原因让我决定写这本书,也许是太多读者和我抱怨说之前的书版本太旧了。于是,这本Cocos2d-x 3.x的书就这样诞生了。而我现在,依旧很想说一句,我这辈子再也不写书了!呵呵,也许这是倾尽全力完成一件事情之后,一种兴奋和满意的咆哮。

那么,希望本书能继续让各位初学者快乐地开启游戏开发之旅。本书主要内容

本书共18章,如果读者没有Cocos2d-x的使用经验,建议从第1章开始阅读。对于有Cocos2d-x基础的读者,我为大家列出了各个章节的主要内容,供读者参考。

第1章:简单介绍本书写作理念、Cocos2d-x 3.0环境搭建和推荐的一些学习资源。

第2~3章:介绍Cocos2d-x 3.0的最基本知识、基本结构。

第4~6章:介绍CocoStudio UI编辑器的使用、动作以及屏幕触摸事件的使用,通过一个简单的游戏实例将前面章节的内容串联起来。

第7~10章:对Cocos2d-x 3.0更高阶的内容进行介绍,包括渲染效率的提高、动画、TexturePacker图片打包、Tiled地图游戏实例、定时器、消息派发、函数回调、内存管理、数据保存、Csv文件读取、JSON文件读/写。

第11~12章:介绍Lua和C++通信的知识、有限状态机的基础知识和应用。

第13章:分享我自己开发的基于Cocos2d-x 3.0的自定义UI模块,详细介绍自定义UI模块的设计思路和实现过程。

第14~16章:详细讲解本书最后一个游戏实例《卡牌塔防》,该游戏使用了本书介绍的大部分知识。作为本书的最后一个实例,用了三章的篇幅详细地介绍游戏的思路、框架搭建、功能实现的过程。

第17章:介绍网游游戏开发的基本流程,编写能和服务端进行命令交互的客户端。

第18章:分享我曾经遇到的错误和解决方案,介绍游戏发布、广告接入、安全等方面的知识。与2.0版本一书的不同之处

也许有些读者已经买过2.0版本的《Cocos2d-x游戏开发之旅》,这里列出本书与2.0版本一书的不同之处,方便读者参考:

1.所有代码均升级为3.0版本。

2.删除部分已过时的内容,对原有内容进行升级优化。

3.增加Value、Vector、Map、3.0触摸机制、lambda函数、Auto-Batching等3.0新特性的内容讲解。

4.增加JSON、CocoStudio UI编辑器、网络游戏等内容讲解。

5.增加游戏发布流程、未来趋势、安全处理的内容。致谢

我想,这次我最应该感谢的,是那些认可我的读者,那些能看懂书中幽默风格的读者。是你们让我知道,我不是一个“精神病人”。

最后,我想感谢我的家人,家人给我的不仅仅是支持,而是一个完整的开心的家庭。并且,我不得不再一次感谢的,就是本书的旁白丁小若,感谢她愿意授予我使用她名字的权限,感谢她给予我幽默的灵感。

谨以此书献给我可爱的家人和朋友们。

由于水平有限,书中难免有错误之处,希望读者朋友多指正。也欢迎大家到我的博客就书中的问题与我互动。钟迪龙2014.08.05第1章开学典礼剧透本章是预热章节,虽然它可有可无,但笔者衷心地希望读者能够耐心地阅读本章内容。因为本章将向读者介绍本书的写作理念。理解本书的写作理念,将有助于读者更顺畅地阅读本书。1.1 出场人物介绍

爱写代码的你,欢迎来到这本书的世界,笔者将带你走过一段有趣的Cocos2d-x学习之旅。有个朋友等了很久,因为笔者答应她要集齐两个人才开始这段旅程。在这之前,笔者必须向热情的你介绍这位朋友。

人物1

名称:丁小若。

身高:比木头高。

年龄:比木头小。

特性:爱闹,爱吐槽,好学但懒惰!

职责:书中的旁白角色,负责捣乱,挑剔笔者的逻辑,更重要的是和读者一起学习Cocos2d-x。

人物2

名称:笨木头。

身高:比小若矮。

年龄:比小若大。

特性:爱笑,感性,聪明但幼稚!

职责:笔者的另一面,很少出现,一般出现在章节末尾。(小若:刚刚你明明说只介绍我啊,为什么还把你自己也介绍进去了?而且为什么我是懒惰你是聪明?)

丁小若是笔者现实生活中的一位好朋友,笔者想用一种比较有趣的方式同大家分享Cocos2d-x知识和手游开发心得,所以在文章里构思了一个旁白角色,旁白通常会以比较有意思的对话来帮助读者理解知识内容。

笔者希望这个旁白的特色能够更加鲜明,因此以这位好朋友为原型,创造了书中的旁白角色。原因是这位朋友的语言风格比较有意思。虽然旁白的对话内容都是笔者自己设计的,但笔者尽量按照丁小若的人物特性去设计对白。并且笔者会拿部分旁白设计给丁小若本人查看,根据丁小若本人的建议,优化旁白角色。总之,一切都是为了让读者不再感觉到是自己一个人在学习。

另外,两张漫画人物图由丁小若本人特别提供(非常感谢她),但是漫画人物与真人没有关系,特此说明。

那么,旅程开始了,你准备好了吗?(小若:我准备好很久了!)1.2 入学要求——本书适合人群

虽然笔者很想说,本书适合所有想学习Cocos2d-x与已经有Cocos2d-x开发经验的朋友。但是,笔者还是想老实交代,本书最适合的人群是:游戏开发经验不满1年、Cocos2d-x使用经验不多,想体验Cocos2d-x游戏开发的朋友。这类型的人群通过本书将获得最大的收益。(小若:我什么开发经验都没有!)

当然了,笔者也希望本书能给有游戏开发经验的朋友带来一些惊喜,所以,本书有40%左右的内容会超越入门范围,介绍一些实际开发中比较有用的技巧。如果你已经是一位拥有多年游戏开发经验的专家,也许本书不太适合你,它唯一能带给你的是一些有趣的知识传达方式。(小若:喂,你这么说就不怕别人不买你的书啊!)

最后,如果你是一位没有任何游戏开发经验的朋友,笔者将感到十分高兴,因为本书就是为你量身定做的,笔者希望通过生动有趣的文字让你掌握原本无法掌握的知识。如果你是一位有游戏开发经验的朋友,笔者将感到十分荣幸,希望那40%的“超入门”内容能够带给你一些新的思路。1.3 这内容有点糟糕——本书风格

本书的风格有点糟糕。(小若:喂!你老是在踩这本书,你不想别人买了吗?)笔者是一个崇尚一切以兴趣为驱动的乐学主义者,所以,本书的风格将会是:调皮、无厘头、唠叨。这么做的原因不仅仅是想打造一本有趣的书籍,而是有趣的事物更能够被初学者接受。

笔者希望通过有趣的文字让初学者能够找到学习的乐趣和兴趣。在这里,笔者想给大家讲一个长篇童话故事,故事有点长,希望大家耐心听下去。(小若:不!我不是来看童话故事的!)

很久很久以前,有一个人,他并不十分聪明,但他成长在一个落后的村落里,其他人都比较愚钝,因此,他成为了村里最聪明的人。无论大事小事,大家都会请教他,渐渐地,他成为了一个很能干的人。后来,他离开了自己的村子,去到一个新的村落,这个村子里的人都很聪明能干。即便如此,凭借着他曾经的自信,他很快地融入了村子,并且变得更加聪明能干。

同时,还有另外一个人,我想,大家已经猜到了。他出生在一个到处都是聪明人的村子里,虽然他也聪明,但和大家比起来,他没有任何优势。渐渐地,他自暴自弃,放弃了成长的机会,最终成了一个平庸的人。

也许这个故事有点扯,(小若:讲完了?你不是说故事很长吗?300字都不到啊!)但笔者想说的就是,宁做鸡头勿做凤尾。对于初学者来说,这个道理很实用,初学者应该先给自己找到自信,做“鸡头”,当自己得到了一定的成长时,便可以开始尝试做“凤尾”,继续深入学习。

总之,笔者希望这种调皮唠叨的文字,能给初学者带来学习游戏开发的激情和使用Cocos2d-x的兴趣。但是,这种风格也许并不适合所有人,所以笔者在此花费这么多篇幅解释使用这种风格的原因。如果读者喜欢有趣的文字,那么笔者将十分高兴,如果对调皮的技术书籍不太接受,而不巧已经购买了本书,笔者恳请读者尝试品味,相信会得到意外的收获。(小若:你果然很唠叨啊!)1.4 你需要这些技能——学Cocos2d-x需要什么知识

虽说本书主要面向初学者,但还是需要读者掌握一些基本技能。

本书要求读者具备基本技能(基本配置):有任意一门编程语言基础。

如果读者掌握以下内容,将更加畅通无阻(豪华配置):● 掌握C++基本语法;● 有半年及以上程序开发经验;● 简单了解Eclipse、VS、XCode开发工具。● 你是一名学生(经本书2.0版本反馈,学生人群受益最大)。(小若:感觉像在买车!基本配置、豪华配置……)

拥有“豪华配置”的读者能够从本书获得最大的收益。如果读者确实只能满足“基本配置”,也没有关系,随着本书的学习进程,读者也能掌握C++的基本使用技巧和手游的开发思路。当然,笔者强烈建议读者在学习完本书后,进一步学习C++知识。1.5 我们为什么要学Cocos2d-x 3.0

笔者想问读者一个问题:为什么会购买本书?也许是因为家里的麻将桌缺了一个角,也许是因为别人建议你学习Cocos2d-x,又也许因为大家都在学习Cocos2d-x,当然还有可能你是笔者的好朋友,纯属支持。

不管是哪种原因,笔者相信,读者的选择没有错,那么,我们为什么要学习Cocos2d-x?笔者有自己的一些想法和大家分享。

首先,Cocos2d-x确实很火,火,代表它能够得到很好的维护。试想,大家都不愿意使用一个满是Bug却没人修复的引擎吧?其次,Cocos2d-x是跨平台的,对于开发者来说,因为平台的原因而重新编写相同功能不同语言的代码,那将是一件十分糟糕的事情。跨平台的Cocos2d-x可以让我们花费最低的代价发布游戏到不同的平台,这是一件十分美妙的事情。最后,却并非最不重要的是,Cocos2d-x是开源的。开源是笔者最爱的,开源意味着我们可以随时阅读引擎的代码。我们甚至可以自己修复引擎的Bug,自己扩展引擎的功能,只要我们够强,我们就可以驾驭这个引擎。

再最后,(小若:什么再最后啊?最后就是最后,代表没有了啊,怎么又来一个再最后!)通过学习Cocos2d-x,我们还能了解到更多的关于游戏开发的知识,比如Lua脚本、Box2D物理引擎、代码设计思想。总之,我们并不局限于学习Cocos2d-x本身,而是通过Cocos2d-x的学习,掌握游戏开发的经验和技巧,并借此学习更多的工具。

那么,我们是时候开始Cocos2d-x 3.0学习之旅了!1.6 先给我们的代码找个温馨的家——环境搭建

让读者久等了,我们是不是应该开始HelloWorld的学习了?有点糟糕呢,因为我们还得给我们的代码安个家。1.6.1 黑色风暴之VS2013

Cocos2d-x可以在Windows平台上学习,也可以在Mac平台上学习,笔者使用的是Windows平台,在Windows平台下,有一个很好的开发工具——Microsoft Visual Studio 2013。这个工具安装包有些庞大,大家可先到官网下载:http://www.microsoft.com/visualstudio/chs/ downloads。

当然,读者也可以通过自己的方式到其他地方下载,但由于版权问题,笔者只能提供官方地址,可以免费试用90天。好了,下载方式不再唠叨。安装过程按照默认步骤进行即可,不过需要注意,我们得保证计算机的硬盘有足够的空余空间。

顺便提一下,为什么要用VS2013,因为Cocos2d-x 3.0的官方工程是用VS2012建立的,不提供VS2010或VS2008的工程,所以我们最好使用VS2012或以上版本。

经过一个漫长的安装过程之后,运行VS2013,我们将看到如图1-1所示的启动界面。图1-1 VS2013启动界面

界面是黑色风格,笔者曾经有个很好很好的朋友,她最喜欢的也是紫色,笔者也受到感染,爱上了紫色。(小若:好感人……我说,她喜欢紫色,那跟黑色有什么关系啊!)1.6.2 我的Cocos2d-x版本

笔者在写作本书时,最新的Cocos2d-x版本是3.2预览版,但笔者使用3.0正式版作为本书的引擎版本。笔者稍微做了一些了解,3.0版本和3.2版本在使用上并没有区别,起码对于本书的所有内容而言,这两个版本都通用。

Cocos2d-x的发展很迅速,希望读者阅读本书时,3.0版本不会太过陈旧。同时也建议读者使用3.0版本,避免不同版本间的微小差异造成本书代码无法正常运行。

Cocos2d-x-3.0下载地址:http://www.cocos2d-x.org/filedown/cocos2d-x-3.0-cn。

如果上面的地址无法下载,大家可以到云盘下载:

http://yunpan.cn/Qhvx7piQ5pfwP,访问密码是2500。

Cocos2d-x不需要安装,下载完后我们将得到一个zip压缩文件,将文件解压到你想存放的目录,笔者建议最好不要放到层次太深的目录,因为你需要经常打开它。我们要准备安装了,(小若:你刚刚说不需要安装的啊!)在这之前,请读者确认你已经准备好了以下两件事情:(1)安装完成VS2013。(2)煮好一壶热水。(3)泡好一杯咖啡。(小若:两件事变成三件就算了……泡咖啡又是什么情况?)1.6.3 我们还需要做一些准备工作

我们还有一些工具,即将或以后会用到,大家暂时不需要去学习它们,但是我们要先下载好。以下的工具除了官网地址,笔者还会提供网盘下载地址,由于网盘分享不太稳定,有可能链接会失效,如果链接失效,读者可以发邮件给笔者来获取文件,也可以关注论坛(bbs.benmutou.com),笔者会在链接失效时,在论坛发布新的下载方式。

这些工具分别是(Windows平台):

1.Android SDK

官方网站:http://developer.android.com/sdk/index.html。

Android的SDK一般是在线下载的,但是在线下载比较麻烦,有时候网络不好会让人很心烦。但是没有关系,笔者已经下载好了大部分版本,提供了一个离线包,直接下载解压即可使用。

网盘下载地址:

http://yunpan.cn/Qhy24y89pAqJZ,访问密码是7020。

2.Android NDK

官方网站:http://developer.android.com/tools/sdk/ndk/index.html。

也可以下载笔者网盘的版本(r9版本):● 32位:http://yunpan.cn/QhyEkzCfHB3z6,访问密码是d2ee;● 64位:http://yunpan.cn/QhyEB3SWVv7f7,访问密码是50dd。

3.Ant

官方网站:http://ant.apache.org。

云盘下载:http://yunpan.cn/QijDmx3vgQXLM,访问密码是c8f5。

以上三个工具下载好之后,解压到你喜欢的目录下即可,不需要安装。1.6.4 半自动配置环境变量

接下来,我们需要配置环境变量,这很简单,大家千万不要害怕。

解压好cocos2d-x-3.0.zip压缩包后,在cocos2d-x-3.0文件夹下找到名为“setup.py”的文件,这是一个Python脚本,我们需要安装Python环境才能运行。

如果你还没有安装过Python,请到官方网站下载:

https://www.python.org/download/releases/2.7.6。

记住,要下载2.x版本的,不要下载3.0版本的,否则会有麻烦。根据你的系统环境下载对应的版本,比如笔者是Windows 7 64位系统,那么下载的版本就是:

https://www.python.org/ftp/python/2.7.6/python-2.7.6.amd64.msi。

安装过程没有需要特别注意的地方,安装完成后,回到刚刚的“setup.py”文件。运行它的方法很简单,有两种(小若:大家小心,说不定他会列出3种!):● 直接双击运行(不推荐);● 在cmd窗口中运行(推荐)。

如果Python脚本运行时出错,直接运行很可能就看不到出错的原因,因为它会一闪而过。在cmd窗口中运行,即使出错了,cmd窗口也不会关闭,可以看到出错信息。(小若:什么是cmd窗口?)

cmd窗口是Windows的命令窗口,按键盘的Win键+R键,然后输入cmd,按回车键,如图1-2所示。图1-2 运行cmd

这样就能打开cmd窗口了,也许有部分读者需要输入“command”才能打开。

好了,我们把“setup.py”文件拖到cmd窗口,按回车键,就能运行了,如图1-3所示。图1-3 运行setup.py脚本

setup.py脚本是用来配置环境变量的,可它不是全自动的,我们要根据它的提示分别输入Android SDK、Android NDK及Ant的路径,也就是我们上一节下载的那几个工具。

当然,如果你觉得这对目前的你来说有点复杂,那么,一直按回车键吧。

最后我们会看到如图1-4所示的输出结果。图1-4 输出结果

这代表环境变量设置完成,当然了,如果你没有输入Android SDK等路径,在你以后移植游戏到Android的时候还是需要设置一次环境变量的。(小若:我有点头晕,我想请个假。)

Cocos2d-x 3.0这个版本配置环境确实看起来有点混乱,其实只是因为它涉及比较多工具而已,我们来梳理一遍,环境配置大致步骤如下:● 安装VS2012或以上版本;● 安装Python;● 运行setup.py脚本,按提示分别输入Android SDK、Android NDK

及ANT工具的路径;● 如果不想下载这些工具,可以暂时不输入,直接按回车键,但以

后要补上;● 完成。(小若:为什么这么简单的几个步骤,被你一讲解就这么复杂呢?)

好了,我们的环境变量算是配置完成了。1.6.5 看看前辈们的毕业设计——运行官方Demo

在学习Cocos2d-x 3.0之前,我们还是应该先看看它都有哪些功能。

现在,打开Cocos2d-x 3.0目录下的build文件夹,找到cocos2d-win32.vc2012.sln文件,双击打开它,你会看到很多个项目,如图1-5所示。图1-5 cocos2d-win32.vc2012.sln文件(小若:要不还是算了吧,我们直接进入正题好了,官方Demo什么的太多了,不,太简单了,我们跳过吧。)

项目很多,大家不要害怕,我们现在只需要关注一个——cpp-tests。

我们在“cpp-tests”项目上单击右键,然后单击【设为启动项】,最后按Ctrl+F5键运行项目,如果是第一次运行,它会开始编译整个工程。

这是一个相对漫长的过程,笔者每次编译整个工程的时候大约要花费10分钟的时间,所以,你的咖啡泡好了吗?一边喝一边等吧。(小若:我好后悔刚刚只顾着吐槽,没有去烧热水!)

在等待的过程中,笔者建议大家先阅读下一节。

好了,假设10分钟已经过去了,如果编译成功,就会弹出官方Demo的程序,如图1-6所示。图1-6 官方Demo

这是官方的所有示例,又叫做Demo,笔者十分希望读者能大致看看这些Demo,这样读者就能对Cocos2d-x 3.0能做的事情有个大概的印象。现在大家花30分钟的时间好好品味这些激动人心的Demo吧!如果你对这些Demo没有任何激动的反应,那或许,呵呵。(小若:呵呵是什么意思啊?你是在看不起人吗?)

这个Demo里满满地搭载了各种各样的Cocos2d-x 3.0学习例子,它们将伴随我们很长的一段学习历程,好好利用这些资源,它们甚至比书籍还要优秀。(小若:喂!又在黑自己的书啊!)

笔者还要赠送大家一个小技巧,那就是查看官方Demo源码。

现在,我们展开cpp-tests下的Classes目录,将看到如图1-7所示的内容。图1-7 cpp-tests Classes目录

这就是所有Demo的源码了,在学习Cocos2d-x 3.0的历程中将常常用到,现在大家可以先不管。(小若:那你还介绍这么多干嘛!)

预热阶段到此结束了,大家去喝杯牛奶吧,然后就要正式开始了!

啊,等等,我还要介绍一个很强大的VS插件,那就是,语、法、高、亮、插、件!(小若:干嘛说得这么夸张!害得我好期待。)这个插件叫做“VAssistX”,大家搜索一下这个名字,会有惊喜的。推荐大家安装,这里笔者就不啰嗦了。1.7 广告时间——提供一些学习资源

本来这一节的内容应该在一开始就提供的,但是笔者将其放到了本章的末尾,因为笔者知道,环境搭建的过程中有很多步骤需要比较漫长的时间,而在这段时间里,读者也许会继续往后阅读。那么,如果现在你正在等待某个步骤的进行,这一节将很好地帮助你打发时间。

首先,笔者本人也建了QQ群,主要是为了给初学者提供帮助。为了避免出现群里人很多,却没有人回答问题的情况,希望读者怀着分享的心态,你不懂的问题,别人回答,你懂的问题,希望也给别人回答。(小若:你真是超级唠叨啊!)

那么,我们的QQ群是:● 107952708:主群,可能满人了。● 369299194:小群,欢迎加入!

笔者还是希望大家到论坛提问,这样可以给后来者提供参考,也算是一种奉献,论坛地址是:bbs.benmutou.com。

然后,笔者想给各位介绍几个内容很不错的博客,由于笔者常年在CSDN活动,所以就只介绍CSDN的博客:● 红孩儿的博客,http://blog.csdn.net/honghaier;● 老G的博客,http://goldlion.blog.51cto.com;● 子龙山人的博客,http://4gamers.cn;● Himi的博客,http://www.himigame.com;● 泰然教程网(推荐),http://www.tairan.com;● star特530的博客,http://blog.csdn.net/star530;● 笨木头的博客(笔者博客),http://www.benmutou.com。(小若:这哪里是CSDN的博客啊,什么博客都有了!而且还有你自己的!)

以上的博客大部分都是笔者曾经常参考的(现在用百度和Google比较多),特别推荐的是泰然网,笔者有幸也加入了泰然网的教程组,可惜笔者已经很久没有发布教程了,有点内疚。这个网站关于Cocos2d-x方面的教程很多,相信读者会喜欢的。

关于star特530的博客,笔者想特别唠叨一下,在笔者第一本书出版时,他才刚开始学习Cocos2d-x。而时至今日,他已经拥有了CSDN博客的专家称号,写的教程也很有意思,也属于乐学派风格。所以在这里特别友情推荐他的博客,也希望大家在学习的过程中多写一些心得,不管多么简单,都会让你有所收获。

然后,笔者把自己的博客也提供了,笔者在完成本书之后会继续写关于Cocos2d-x和手游开发经验的文章,希望能够帮到读者。

另外,如果大家对于书中的章节或代码有任何疑问的,欢迎到笔者的论坛提出:bbs.benmutou.com。

如果是关于Cocos2d-x自身方面的任何问题,笔者建议到官方论坛提出,那里将能获得更多更专业的回复:http://www.cocoachina.com/bbs/thread.php?fid=41。

最后,就没有最后了。小若吐槽木头

小若:为什么你要在Windows平台学习Cocos2d-x?为什么不是Mac呢?

木头:这个……我不舍得买Mac电脑,难道这也要告诉你?

小若:那即使你不告诉我,我也已经知道了!

木头:其实吧,因为这本书主要还是给Cocos2d-x初学者看的,现在用Windows的人还是比较多的,如果要初学者花钱买Mac电脑来学习Cocos2d-x,那入门的门槛就又高了。

小若:是!我买零食的钱都不够了,我也不会去买Mac电脑!

木头:就是嘛!

小若:那为什么你要用VS开发工具,为什么不是其他工具?

木头:其实VS工具挺好的,而且Cocos2d-x官方也默认推荐使用VS。

小若:难怪官方的Demo也是VS工程了!

木头:唉,小若你能不能多花点心思去思考,别老是问为什么!

小若:我只是帮读者问而已!其实这些我早就知道了!我刚刚只是不想知道而已!第2章不离不弃的HelloWorld剧透对于所有爱写代码的人来说,这辈子看过最多最让人激动的程序莫过于HelloWorld。本章和读者一起运行、编写,以及解析Cocos2d-x 3.0的HelloWorld。程序虽小,可五脏俱全。2.1 简单到无法想象——直接运行HelloWorld项目

现在,我们要来做一件很简单的事情,首先打开官方Demo工程,还记得怎么打开吗?Cocos2d-x 3.0 build目录下的cocos2d-win32.vc2012.sln文件,双击打开即可。我们将看到熟悉的工程,如图2-1所示。图2-1 官方Demo工程cpp-empty-test项目

我们还要做一件事情,那就是把cpp-empty-test设为启动项。(小若:怎么设为启动项?)之前说过,在cpp-empty-test上单击鼠标右键,然后单击【设为启动项】即可。(小若:那设为启动项又是什么意思?)

因为这是一个庞大的工程,一个解决方案代表一个大工程,这个大工程里可以包含很多项目。cpp-empty-test是一个项目,cpp-tests也是一个项目,还有其他更多的项目。项目这么多,那VS怎么知道要运行哪个项目呢?设为启动项就是告诉VS我们即将要运行的项目是哪一个。(小若:原来如此!)

让旁白耽误了一些时间,(小若:喂!)现在在键盘上按下Ctrl + F5键,运行cpp-empty- test项目,我们将看到如图2-2所示的窗口。图2-2 cpp-empty-test窗口(小若:不对!为什么你的图片里显示的是480×320,但我的是1024×768?)

被你发现了,其实我偷偷改了点东西,不过没关系,我只是觉得原来的窗口太大,就改小了一点,不影响大家享受HelloWorld的喜悦。(小若:不要!我也要改,你教我改!)

将cpp-empty-test的项目展开,在Classes目录下找到AppDelegate.cpp文件,如图2-3所示。

笔者怕大家看得不清楚,所以图2-3 HelloCpp的AppDelegate.cpp文稍微多用了两个箭头。(小若:两件个?你近视啊!四个箭头啊!)打开AppDelegate.cpp文件,我们主要关注两行代码,如代码清单2-1所示。代码清单2-1 if(!glview) { glview = GLView::create("Cpp Empty Test"); glview->setFrameSize(500, 320); /* 设置窗口大小 */ director->setOpenGLView(glview); }(小若:是4行,4行!不是2行啊!)

我们应该很明显地发现了500和320这两个数字,setFrameSize函数就是用来设置窗口大小的。这个设置仅仅是在Windows上运行的时候才有效,当在手机上运行游戏的时候,窗口的大小就是手机屏幕的大小,我们没法用程序去改变手机的屏幕(要是可以改变,这绝对是一场科技革命)。

这个cpp-empty-test项目对屏幕做了一些自适应处理,所以当我们的窗口大小设置成500×320时,程序判断到480×320的背景图片比较适合这种大小,于是,我们就看到了图2-2的样子。关于屏幕自适应的内容,我们以后再说。2.2 新建Cocos2d-x项目遇到的麻烦——成功新建一个HelloWorld2.2.1 创建Cocos2d-x 3.0项目

运行HelloWorld很简单,但是,我们现在要开始自己创建HelloWorld了,这可有点麻烦,大家准备好牛奶或者咖啡吧。(小若:我早就准备好了!但是我喝完了!)

首先,打开Windows的cmd窗口,然后在cmd中输入以下命令,如图2-4所示。图2-4 创建新项目

HelloWorld就是项目名称,-p后面接着的就是项目的包名,-l后面指定语言版本,-d后面指定项目路径,这里直接输入projects,那么我们的路径就是C:Users\Administrator\ projects\HelloWorld。“cocos”是一个脚本,如果报错说找不到这个命令,那么,可以使用全路径命令:

E:\Cocos2d-x\cocos2d-x-3.0Release\tools\cocos2d-console\bin\cocos new HelloWorld -p com.benmutou. helloWorld -l cpp -d projects

笔者通常都是使用全路径的,因为笔者平时要使用不同版本的引擎。

然后,如果出现了如图2-5所示的错误。图2-5 创建新项目报错

这是因为我们没有把Python添加到环境变量,在【我的电脑】上单击鼠标右键,选择【属性】,依次选择【高级系统设置】、【环境变量】,找到Path变量,单击【编辑】,如图2-6所示。如果没有Path变量,就新建一个。然后在变量值的最后加上Python的安装目录,比如笔者的“D:\Delevop\Python27;”留意一下,笔者在前面和后面都加了分号,这样是为了区分多个不同的变量值。图2-6 设置Python环境变量

相信大部分读者对设置环境变量已经很熟悉了,这里只是避免有读者不知道如何设置环境变量,所以唠叨了一下。(小若:应该不是说我吧?)

好了,然后单击各种“确定”按钮,关闭cmd窗口,再重新打开cmd窗口,再次输入之前的命令,我们将看到一些信息在输出,等它停止之后,项目就创建好了。

然后进入我们的项目目录,打开proj.win32目录下的HelloWorld.sln文件,按键盘Ctrl+F5键运行,然后又是一个漫长的编译过程。(小若:又要等吗?好烦!)

因为现在创建新项目都会自动复制一份Cocos2d-x的源码,所以每一个新工程都要编译一次。如果大家编译成功,就会看到如图2-7所示的窗口。图2-7 HelloWorld项目

HelloWorld是美好的开始,是时候开始给大家详细讲解HelloWorld了!2.3 HelloWorld,没有想象中的简单——简单解析HelloWorld

本节要给大家详细解析看似简单其实不那么简单,最终却还是挺简单的HelloWorld。(小若:这标题看着就不太对啊!什么简单又不简单的……)

另外,本节内容对初学者而言,稍微有点复杂,如果读者感兴趣,可以仔细阅读。但笔者建议读者大致浏览一遍,然后直接阅读本章末尾的实例部分,待以后对Cocos2d-x有了基本的了解之后再回来仔细阅读本节内容,那将会有意想不到的效果。(小若:耶!那这一节的内容我不看了。)

对了,笔者是建议大致浏览本节内容,而不是跳过本节内容。2.3.1 HelloWorld是如何显示到窗口的

首先,我们只要新建一个Cocos2d-x的项目,就会默认创建一个HelloWorldScene场景类,场景类先不详细解释,大家现在只要理解为显示在画面上的窗口就行了。我们先不管这个场景类本身,我们来看看这个场景类是如何被显示到窗口上的。

打开HelloWorld项目的AppDelegate.cpp文件,我们只看applicationDidFinishLaunching函数,如代码清单2-2所示。代码清单2-2    bool AppDelegate::applicationDidFinishLaunching() {     auto director = Director::getInstance();     auto glview = director->getOpenGLView();     if(!glview) {     glview = GLView::create("My Game");     director->setOpenGLView(glview);     }     director->setDisplayStats(true);     director->setAnimationInterval(1.0 / 60);         auto scene = HelloWorld::createScene();     director->runWithScene(scene);         return true;    }(小若:看着好复杂,我不学了!)

别着急,前两几行行我们忽略,笔者直接给大家解释表面的用法。(1)director->setDisplayStats(true):设置是否显示游戏的帧数等调试信息。(2)director->setAnimationInterval(1.0 / 60):设置游戏的帧率,在这里是每秒60帧。(3)Auto scene = HelloWorld::createScene():创建一个场景,也就是前面提到的场景类。(4)director->runWithScene(scene):最重要的地方,只有执行了这一步,才能让场景类显示出来。(小若:其实我刚刚开玩笑的!我怎么会不学呢!我看懂了。)

连旁白都看懂了,我想各位读者也很清楚了。在这里,笔者想为没有游戏开发经验的朋友介绍几个简单的概念。有经验的朋友可以略过。~~~~献给初学者的知识——开始~~~~

首先是调试信息。调试信息不管在应用开发还是游戏开发里都是很重要的,调试信息的表现形式很多,最常用的就是以文本的形式展示,比如在VS开发工具的调试窗口里打印日志信息。通过查看程序运行过程中打印的日志信息,能够初步发现程序不妥当的地方。现在不理解也没关系,笔者只是给大家一个预热,以后会经常使用的。(小若:就和我在书上记笔记差不多?不对!就和我的肚子一样,如果肚子饿了,就会发出“咕咕咕”的调试信息!)

然后是游戏的帧率。帧是游戏开发里一个很重要的概念。在程序世界里,其实一切都是静止的,之所以能够看到游戏在不断地运动,是因为很多静止的画面快速连续切换产生的错觉。程序不断地切换画面,每一个画面就是一帧,帧率就是每秒程序能够切换的帧数。而我们需要做的是,在每一帧里写入逻辑代码,让每一帧都不一样,于是,多姿多彩的游戏世界就诞生了!(小若:我知道!和动画片是一样的!)

最后,场景类先不解释,大家还是把它当作一个窗口就行了。(小若:我把它当做一部电视可以不?)~~~~献给初学者的知识——结束~~~~2.3.2 场景其实不是真正的场景

本节内容稍微会复杂一些,但实际上还是很简单的,大家打起精神了!

现在来分析场景类,先看HelloWorldScene.h头文件,如代码清单2-3所示,很短,看着舒服。代码清单2-3    #include "cocos2d.h"    class HelloWorld : public cocos2d::Layer{    public:     static cocos2d::Scene* createScene();     virtual bool init();      void menuCloseCallback(cocos2d::Ref* pSender);     CREATE_FUNC(HelloWorld);     };

menuCloseCallback函数是一个回调函数,仅此而已。

createScene函数是不可缺的,那scene函数在哪个地方会用到?还记得之前的代码清单2-2吗?新建一个场景类的时候是这样的:    auto scene = HelloWorld::createScene();

在Cocos2d-x 3.0里,都通过这样的方式来创建一个场景对象,当然,我们不一定要命名为scene,但在整个程序里要统一。现在先不管createScene函数,等会儿才会用到。

再来看看CREATE_FUNC(HelloWorld),CREATE_FUNC是一个宏。(小若:什么是宏?)宏是C/C++的一种预编译手段,比如我们定义一个字符串MAX_NUM,规定MAX_NUM代表77,于是程序里所有的MAX_NUM在编译时都会用77来代替。那我们通过什么手段来实现这个规则呢?很简单,看代码清单2-4。代码清单2-4    #define MAX_NUM 77

#define是C++的关键字,用来标明一个宏。当然,这只是最简单的情况。(小若:这已经不简单了!)还有一种情况,叫做宏函数,顾名思义,这种宏允许传递参数。而CREATE_ FUNC正是宏函数,我们来看看CREATE_FUNC的具体实现,如代码清单2-5所示。代码清单2-5    #define CREATE_FUNC(__TYPE__) \    static __TYPE__* create() \    { \     __TYPE__ *pRet = new __TYPE__(); \     if (pRet && pRet->init()) \     { \     pRet->autorelease(); \     return pRet; \     } \     else \     { \     delete pRet; \     pRet = NULL; \     return NULL; \     } \    }

看起来它并不太复杂。(小若:好复杂!)好吧,也许稍微有些复杂,我们留意到,代码清单2-5和普通函数的最大区别有三处:● 用#define定义,并且没有返回值;● 参数没有类型,只有参数名;● 每一行结尾处都有一个“\”符号。

首先解释每一行结尾处的“\”符号,因为宏定义只能是一条语句,“\”符号是C++代码书写时用于换行的,也就是说,把原本一行的代码分成若干行来写。但这只是表面上让我们看起来代码在换行,实际上这些代码对编译器来说,只有一行。(小若:那不是多此一举吗?)这种看似多余的换行,是为了让我们能够更加方便地看代码。

然后是参数__TYPE__,这有点复杂,可能旁白会理解不了,不过读者倒是能够理解的。(小若:喂!别老是针对我啊!)__TYPE__其实是宏里面的宏,因为在编译时,这个宏函数里会直接把__TYPE__出现的地方用__TYPE__的值替换掉。比如之前代码清单2-3的CREATE_FUNC(HelloWorld),这句代码在编译时会转换为代码清单2-6所示的样子。代码清单2-6    static HelloWorld* create() {      HelloWorld *pRet = new HelloWorld();      if (pRet && pRet->init()) {      pRet->autorelease();      return pRet;      }      else {      delete pRet;      pRet = NULL;      return NULL;      }     }(小若:我明白了!就是把__TYPE__换成了HelloWorld而已。)

连旁白都明白了,笔者就不唠叨了。

我们回过头来看createScene函数,在HelloWorldScene.cpp中可以看到createScene函数的实现,如代码清单2-7所示。代码清单2-7    Scene* HelloWorld::createScene() {     auto scene = Scene::create();     auto layer = HelloWorld::create();         scene->addChild(layer);         return scene;    }

看起来只有几行代码,可每一行代码都很重要:(1)auto scene = Scene::create():创建一个场景类。大家注意到了吗?这个场景类并不是HelloWorld本身。(2)auto layer = HelloWorld::create():创建HelloWorld对象,create函数正是用宏CREATE_FUNC(HelloWorld)定义的。如果仔细看代码清单2-3,应该能够发现,HelloWorld继承了Layer类,先不管Layer是什么,总之它不是Scene场景类。换句话说,HelloWorld并不是一个场景类。(小若:这实在是让人无法接受!为什么一个不是场景类的类,通过scene函数就出来了一个场景类?)(3)scene->addChild(layer):将layer对象添加到scene对象。(4)return scene:返回scene对象。

现在大家一定有点混乱,笔者给大家再梳理一遍:● 通过auto scene = HelloWorld::createScene()创建一个场景对象;● HelloWorld的createScene函数里创建了一个场景对象(Scene),然后将HelloWorld对象(Layer)添加到场景对象;● HelloWorld对象通过create函数创建,而create函数是由宏

CREATE_FUNC(Hello World)来定义的;● 通过director->runWithScene(scene)让场景对象显示在窗口中。(小若:不行,不懂啊!)

现在不懂没有关系,目前只要求读者能够依葫芦画瓢地创建一个场景对象即可。

另外稍微解释一下,auto是C++的关键字,用来声明自动变量,比如auto scene = Scene::create()等价于Scene*scene = Scene::create()。换句话说,它会自动判断变量的类型,让我们可以偷个懒。2.4 实例来了2.4.1 题外话——一个工程多个项目,避免重复编译

现在读者要自己动手写一个简单的场景类了,大家准备好了吗?(小若:嗯,没有。)

试试模仿HelloWorldScene类,自己实现一个。

首先,我们又要创建一个新的Cocos2d-x项目了,命名为“Chapter2_4_HelloWorld”。(小若:不要啊!又要编译,我的咖啡都喝完了。)

不,我们不需要重新编译,可以直接利用刚刚创建好的HelloWorld工程。我们可以在同一个工程里创建多个Cocos2d-x项目,共用一份源码。当然,这只是笔者的做法,实际中可以有很多方式,大家也可以使用自己的方式来实现。

如果读者觉得这样很麻烦,没关系,可以直接按照2.2.1节的方式创建新的项目,毕竟一个工程里存放多个项目的情况并不多。

好了,如果你不希望重新编译整个工程,那么,按照以下步骤进行:(1)在cmd中输入命令,创建新项目,名称为Chapter2_4_HelloWorld(命令参考2.2.1节内容)。(2)只保留Chapter2_4_HelloWorld目录下的三个文件夹:Classes、proj.win32、Resources,其他文件夹都删掉。(3)把Chapter2_4_HelloWorld文件夹复制到你已经创建过的工程(比如2.2.1节的HelloWorld工程)目录下,如图2-8所示。图2-8 复制新项目到HelloWorld工程目录(4)进入Chapter2_4_HelloWorld的proj.win32目录,用文本编辑器打开Chapter2_4_ HelloWorld.vcxproj。(5)将文件里所有的“..\cocos2d”内容替换成“..\..\cocos2d”,保存,关闭Chapter2_4_ HelloWorld.vcxproj文件。(6)在HelloWorld工程的解决方案上单击右键,导入现有Chapter2_4_HelloWorld项目,如图2-9所示。图2-9 导入现有项目

选择我们的Chapter2_4_HelloWorld项目的Chapter2_4_HelloWorld.vcxproj文件,如图2-10所示。图2-10 选择vcxproj文件(7)如图2-11所示,我们新增的项目是VS2010工程的,我们要升级一下。图2-11

在项目上单击右键,选择【升级VC++编译器和库(R)】即可,如图2-12所示。图2-12 升级VC++编译器和库(R)

好了,然后把Chapter2_4_HelloWorld设置为启动项目,按Ctrl+F5键运行,我们会看到熟悉的HelloWorld窗口。并且,我们应该已经发现了,它并没有重新编译整个工程,仅仅是编译了Chapter2_4_HelloWorld项目的几个类,这就是我们的目的。(小若:我跟你说,你别以为我一直没吐槽就没事了,我只是不想打断你的步骤而已!这很复杂好不好?我宁愿重新编译整个工程了!)

好吧,笔者承认,这样虽然免去了漫长的编译过程,但是却多了很多烦琐的步骤。因为整本书会有很多个项目,笔者只能选择以这种烦琐的方式来避免那漫长的编译过程了。读者可以自己选择合适自己的方式。

才怪呢!其实这步骤只需要进行一次,以后笔者想新建项目的时候,就按照以下步骤进行:(1)直接复制Chapter2_4_HelloWorld文件夹,然后修改文件夹的名字为新项目的名字,如Chapter2_4_NewProject。(2)进入新项目的proj.win32文件夹,把所有含有“Chapter2_4_HelloWorld”的文件都重命名,把“Chapter2_4_HelloWorld”都改为“Chapter2_4_NewProject”。

这样,一个新项目就创建好了,然后把它导入到工程里。2.4.2 创建属于自己的HelloWorld

现在来看看我们新建项目的目录,如图2-13所示。图2-13 项目目录

我们只关注HelloWorldScene,现在我们需要创建两个文件:MyHelloWorldScene.h、MyHelloWorldScene.cpp。

我们依葫芦画瓢,在Classes目录上单击鼠标右键,选择【添加】→【新建项】,弹出如图2-14所示的窗口。图2-14 创建头文件

我们选择【头文件(.h)】,然后在名称一栏输入头文件的名字“MyHelloWorldScene”。文件默认会创建到项目的proj.win32目录,笔者建议把文件创建到Classes目录。

然后,用同样的方法创建MyHelloWorldScene.cpp文件,但这次要选择【C++文件(.cpp)】,注意不要选错了。(小若:我刚刚真的选错了。)现在我们的目录结构应该和图2-15所示一致。图2-15 新的目录结构

现在我们打开MyHelloWorldScene.h文件,输入一个场景类所需的内容,如代码清单2-8所示。代码清单2-8    #ifndef _MyHelloWorldScene_H_    #define _MyHelloWorldScene_H_        #include "cocos2d.h"    using namespace cocos2d;        class MyHelloWorldScene : public Layer {    public:     /* 通过静态的scene函数,创建一个场景对象 */     static Scene* createScene();          /* MyHelloWorldScene的初始化工作都在init里执行 */     virtual bool init();          /* 调用宏CREATE_FUNC定义create函数 */     CREATE_FUNC(MyHelloWorldScene);    };        #endif

笔者在这里想为初学者解释一下#ifndef的概念。(小若:我不想听概念!)当然,有经验的朋友可以略过。~~~~献给初学者的知识——开始~~~~

同一个头文件有可能在很多地方被包含,而程序的最终形态是所有的类和头文件都堆在一起的。如果同一个头文件被多次包含,那最终就会有很多个相同的头文件出现在各个地方,如图2-16所示。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载