Cocos2d-x 之Lua 核心编程(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-20 19:46:27

点击下载

作者:刘克男、杨雍

出版社:清华大学出版社

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

Cocos2d-x 之Lua 核心编程

Cocos2d-x 之Lua 核心编程试读:

前言

本书分8章,知识由浅人深、步步推进,建议按照顺序阅读。

第1章:介绍Cocos2d-Lua背景及Cocos2d各版本之间的关系。

第2章:Lua快速人门。已有Lua编程基础的读者,可跳过这一部分。

第3章:Cocos2d-Lua基础。本章是开发游戏必须掌握的知识结构。

第4章:Fruit Fest游戏第一部分,实现了游戏的核心玩法。本章包含了Cocos2d-Lua基础知识,展示了游戏开发的主要流程。

第5章:Cocos2d-Lua进阶。涵盖UI控件、瓦片地图、内存管理及数据存储等内容。

第6章:Fruit Fest游戏第二部分,为游戏添加了音乐与粒子特效。

第7章:Cocos2d-Lua高级。虽然其中的网络通信和物理引擎不是每个游戏都会用到,但它们是引擎必不可少的一部分。自定义事件和状态机为游戏系统架构提供基础支撑;Lua Binding要求熟练掌握C语言开发,它们都是为高级工程师准备的。

第8章:打包与发布。之所以把该部分放在最后,是因为Cocos2d-Lua为我们提供的Player模拟器已足够应对游戏的前期开发,通过Player测试游戏将为开发者节省大量时间。适用版本

本书基于Cocos2d-Lua v3.3 Final版本撰写,由于Quick框架对接口稳定所作的贡献,本书与引擎功能模块相关的章节适用于Cocos2d-Lua 3.3以后的所有版本;目录结构与环境搭建的相关章节适用于Cocos2d-Lua v3.3 Final。

注:本书不适用于Cocos2d-Lua 2.x分支版本。书中实例

本书理论结合实践,各章节均配备了测试用例,其中第4章和第6章以《Fruit Fest》展示了完整的游戏开发流程,每一节都介绍一个独立的功能并配备实例代码,可以让初学者充分体验到游戏开发的细节。

读者可以从泰然网本书主页(http://www.tairan.com/cocos2d-lua-book/)免费获取所有实例代码以及所使用到的资源。读者对象

本书作为Cocos2d-Lua的权威书籍,知识面从Lua语言基础开始,全面覆盖Cocos2d-Lua基础、进阶和高级编程,并指导读者逐步地完成一款消除游戏的开发。

对于Cocos2d新手而言,本书可作为手机游戏开发的人门书籍。

对于有经验的开发者而言,本书依然是Cocos2d-Lua开发必不可少的参考手册,大量的实例代码可帮助读者节省宝贵的时间。

对于院校师生而言,本书的编排完全按照学习顺序系统展开,是教材的不二之选。

刘克男为本书的主要作者,完成了书中绝大部分内容的编写。杨雍负责整体设计及编写思路。

由于笔者水平有限,书中内容难免会有不妥或者疏漏,欢迎读者批评指正。作者2015年9月致谢

首先,感谢Cocos2d-x的引擎团队,感谢他们为游戏开发者带来了如此优秀的引擎。

其次,感谢以下朋友对本书做出的贡献,他们让本书更加精彩:

感谢王帅,作为前Cocos2d-lua团队成员,他为本书提供了更加完整的基础知识体系,以及贡献了基础知识章节的初稿,让本书的知识体系更加完善。

感谢杨田波(博客地址:http://www.zeroyang.com),他贡献了本书UI控件等章节的初稿,他的努力使得本书的UI控件等章节显得与众不同。

感谢罗言,她作为本书唯一的美术人员,工作之余花费了大量的时间来制作《Fmit Fest》游戏资源,以及书中用到的其他精美图片。

感谢任珊(博客地址:http://www.shannn.com/),她对本书进行了文字校对工作,让本书更加严谨。

感谢查鑫(博客地址:http://gameeer.com/),他在本书定稿之后,对书中的每一行代码都进行了严格的测试,确保书中每一行代码正确性。

最后,感谢泰然网(http://tairan.com/)以及泰然教程组的朋友们,是他们的支持让我们一起快速成长,让本来枯燥的工作、学习变得如此生动有趣。第1章Cocos2d-Lua1.1 概述

Cocos2d-x是一个跨平台开源游戏引擎,用它可以构建基于图形交互的跨平台游戏和应用。Cocos2d作为Cocos2d-x以及其他分支的鼻祖,有其特别的历史故事。1.1.1 Cocos2d的起源

2005年在阿根廷的一个叫Los Cocos的镇上,一名叫Ricardo的开发者(后来Cocos2d-iPhone的作者)和一群朋友进行了一件有趣的事情。他们计划每一个星期使用一种编程语言完成一个小游戏。在开发这些小游戏过程中,他们发现做一个游戏引擎,可以节省不少开发时间。2008年借鉴之前做小游戏的经验,他们发现使用python作为开发语言使用的时间最少,所以用python开发了第一个版本引擎并用Ricardo的家乡地名命名该引擎为Los Cocos。一个月后(2008年3月),团队发布了0.1版本并将引擎更名为Cocos2d。

在Cocos2d发布不久后,Apple公司正式发布AppStore以及相关SDK。此后大量使用Objective-C开发的iOS应用和游戏流行起来。这一年,Ricardo使用Objective-C重写了Cocos2d引擎,并发布了Cocos2d-iPhone的第一个版本。1.1.2 Cocos2d-x的诞生

最开始Cocos2d没有跨平台的版本,推动Cocos2d-x诞生的重要因素在于Android的普及,国内对跨平台(iOS和Android)游戏开发的强烈需求。Android的开放性,使得国内催生了一大批的Android智能手机,这时候急需一款简单易用的跨平台游戏引擎来解决游戏内容提供商的疾苦。Cocos2d-x的作者王哲看到了这个机遇,他发邮件给Ricardo表达了想衍生一款跨平台的Cocos2d引擎的想法,出乎意料地,这个想法得到了Ricardo的大力支持,并提供了很多技术支援,于是Cocos2d-x在王哲及其团队的努力下诞生了。

Cocos2d-x 1.x和2.x与Cocos2d-iPhone的1.x和2.x设计上没有区别,Cocos2d-x用C++把Cocos2d-iPhone重写了一遍,并加入了一些有用的跨平台库和接口,很多用法都很像Objective-C风格,一些初学Cocos2d-x的用户会觉得不适应。这时候的Cocos2d-x在发展上还不及Cocos2d-iPhone,然而就在2013年的苹果开发者大会上,一切有了变化。苹果公布了自家的SpriteKit游戏框架,设计概念完全抄袭了Cocos2d-iPhone,这种赤裸裸的剽窃激怒了Ricardo。Ricardo当即在社区宣布将停止Cocos2d-iPhone的开发。随后Ricardo从Zenga公司跳槽到触控,正式转入Cocos2d-x的开发,于是全新的Cocos2d-x 3.x到来了。

伴随着Cocos2d的成长,很多分支版本随之崛起,包括Cocos2d-x。这些分支版本罗列如图1-1所示,不同的分支支持不同的开发语言和平台,如表1-1所示。图1-1 Cocos family表1-1 不同分支对应开发语言和平台1.1.3 Cocos2d-Lua的发展

2012年,由于Cocos2d-x中使用的C++对开发人员要求较高,所以网龙科技利用tolua++,将Cocos2d-x的C++接口转为了Lua接口(这层C++与Lua之间的胶水代码叫Lua Binding)。开发者可以使用Lua这种简单易懂的脚本语言来编写游戏,从而极大提高开发效率。

大概在2012年上半年,廖宇雷的公司开始使用Cocos2d-x+Lua来开发游戏。但是发现当时Cocos2d-x对Lua的支持还存在相当多不完善的地方,所以他重写了整个Lua Binding代码,解决了内存泄露和只能使用全局函数做回调等问题。

在Cocos2d-x 2.0发布后,Lua Binding又进行了不少改进和完善。截止到Cocos2d-x 2.1.4,整个Lua Binding已经相当稳定,所以《我是MTK月流水3000万人民币)和《大掌门》(月流水4000万人民币)这些赚钱像印钱的游戏,纷纷采用Cocos2d-x+Lua的解决方案。

自从2012年后,Cocos2d-x团队把开发重心放在了JavaScript脚本方案上。于是廖宇雷继续改进Lua代码并以Quick-Cocos2d-x为代号fork了一个新的开源引擎。2013年底,Quick-Cocos2d-x以一款千万级游戏《唐门世界》证明了引擎的实力。最终Quick-Cocos2d-x被Cocos2d-x并入主线,成为新的引擎版本:Cocos2d-Lua,而廖宇雷也成为这个版本的核心开发者。

Cocos2d-Lua的发展始终贯彻了三个目标:(1)降低学习曲线;(2)提高易用性;(3)创建一个精简、但更容易扩展的架构。1.2 版本介绍1.2.1 Cocos2d-x版本介绍(C++)1. Cocos2d-x 1.x

这个版本沿袭了Cocos2d-iPhone 1.x版本的架构与风格接口。引擎很多模块使用了iOS中的功能模块,不同的是这些模块都是由C++模拟实现的。此外,创建Xcode工程需要安装Cocos2d-x的项目模板。底层图形引擎使用的是OpenGL ES 1.0。2. Cocos2d-x 2.x

随着iPhone对OpenGL ES 2.0的支持,Cocos2d-iPhone发布了2.x版本,以支持OpenGL ES 2.0,并且Cocos2d-iPhone开始支持Lua和JS脚本开发游戏。

Cocos2d-x紧随其后发布2.x版本,但是它已不再只是局限于简单的Cocos2d-iPhone的C++版本,因为它有着更大的市场目标——Android。为了创建跨平台的项目,在没有脚本创建项目之前,使用Xcode模版的方式,只能先生成一个iOS或Mac的项目。大多开发者首先在Mac上开发(因为调试方便),然后再建一个Android工程移植过去。为了解决这个难题,Cocos2d-x在2.1版本中引入了脚本创建项目,一次性创建多个跨平台的项目,用户按照文件规范在相应的目录放源代码或资源,后期可以很轻松地编译跨平台的游戏。

为了适应Android错综复杂的分辨率,Cocos2d-x在2.0.4版本开始设计自己的分辨率适配方案,有别于Cocos2d-iPhone 2.x仅为iPhone优化的设计,Cocos2d-x提出的设计分辨率概念能更好地适应各种分辨率,这个方案在Cocos2d-x 2.1.3版本得以成熟稳定。

Cocos2d-x在2.x中还直接集成了很多跨平台第三方库,如WebSocket和HttpRequest等。为Cocos2d-x的跨平台战略打下坚实的基础。Cocos2d-x 2.x的Lua和JS支持也由社区推动起来,为游戏内更新提供了有力支持。3. Cocos2d-x 3.x

Cocos2d-x 3.x是由Ricardo加入触控科技后主导开发的全新版本,引擎接口完全去掉了Objective-C的影子,大量使用C++11的新特性并着重提升性能,而且慢慢开始向3D引擎转型。最新的《捕鱼达人3》就使用了Cocos2d-x的3D技术,在图形渲染上做了改进。独立的渲染线程能更好地利用CPU,提升游戏帧率。高度整合的物理引擎,降低了上手难度,全新的GUI系统也让人充满了期待。1.2.2 Cocos2d-Lua版本介绍

Cocos2d-Lua 2.x底层引擎采用Cocos2d-x 2.x,提供了非常便于使用的Player模拟器,能够不更改C++代码在模拟器上运行Cocos2d-Lua的游戏,而且通过Quick的Player可以方便地创建和管理项目;在Cocos2d-x的基础上添加了大量的第三方库,如json和xml等的支持,加入了强大的MVC架构支持。

Cocos2d-Lua 3.x底层引擎采用Cocos2d-x 3.x,并最大程度地兼容Cocos2d-Lua 2.x的游戏。Quick的Player更新到了3.x版本,支持了3D模型的绘制和操作,还能够支持同VS、XCode和Eclipse等进行调试。第2章Lua编程2.1 Lua在Windows下的运行环境搭建

在进入Cocos2d-Lua游戏开发之前,需要先掌握Lua这门脚本语言。首先我们来搭建Lua在Window中的开发调试环境,推荐安装Lua For Windows这套工具。

Lua For Windows是一整套Lua开发环境,它包括Lua解释器、Lua参考手册、Lua范例、Lua库和文档以及SciTE多用途编辑器。

可以看到Lua For Windows整合了在Windows上学习和开发Lua所需要的所有东西,这也是我们推荐它的原因。

Lua For Windows官方网站为http://code.google.com/p/luaforwindows/,这里我们直接下载已发布的exe安装包:http://luaforwindows.googlecode.com/files/LuaForWindows_v5.1.4-46.exe。

注:此处选用5.1版本是为了对应Cocos2d-Lua中集成的Lua解析器版本。2.1.1 安装

双击LuaForWindows—v5.1.4-46.exe文件开始安装,注意在Select Additional Tasks界面,勾选如图2-1所示的选项,安装完毕,会在桌面上增加两个快捷图标Lua和SciTE,如图2-2 所示。图2-1 LuaForWindows安装图1-2 Lua快捷方式2.1.2 运行1. console模式

双击桌面上的Lua图标,出现如图2-3所示的Window控制台窗口,输入代码:

按Enter键执行代码。图2-3 console模式

注:Lua中io.write("Hello world")也能实现标准输出,和print的区别是它不提供换行符。2. IDE模式

双击桌面上的SciTE图标,出现图2-4所示的程序界面。图2-4 IDE模式(1)在文本区域输入print("hello world");(2)单击“磁盘”工具按钮保存代码到文件;(3)单击“运行”工具按钮运行代码;(4)IDE底部的日志窗口显示运行信息。2.2 Lua基础2.2.1 Lua介绍

Lua是一种小巧的脚本语言,作者是巴西人。Lua设计的初衷是为了能够嵌入到其他应用程序中,能够为应用提供灵活的扩展。Lua脚本和C/C++可以很容易地相互调用,这样Lua能够使用C/C++已有的库,并且能够在带来脚本开发效率的同时,保证程序的运行效率。

Lua的所有代码都是由标准的ANSI C编写而成,代码简洁优美,只要是在支持ANSI C的系统上都能够完美地运行。

Lua主要面向三类用户:(1)需要一门简单的脚本语言嵌入到应用程序中的开发者;(2)想要提高开发效率的C/C++语言开发者;(3)想要提高运行效率的脚本开发者。

Lua有如下特点:(1)易嵌入,可以很方便地与C/C++编写的游戏逻辑互相调用;(2)简单,不涉及任何复杂的编程概念,麻雀虽小五脏俱全;(3)轻量,库体积很小,只有几百千字节;(4)易学习,游戏策划人员也可以使用Lua;(5)高性能,对比C/C++原生语言,Lua解析带来的性能损失可忽略不计。

使用Lua开发的经典游戏有:(1)大话西游2(PC);(2)魔兽世界WOW(PC),(3)剑侠情缘3(PC);(4)我叫MT(iOS,Android);(5)刀塔传奇(iOS,Android)。2.2.2 Lua语法

最新的Lua版本是5.3版本,但使用最广泛的Lua版本是5.1版本。

Lua 5.1与5.2的设计理念不一样,语法上也有不同,Cocos2d-Lua集成的Lua解析器是5.1版本。本书涉及到的Lua均指Lua 5.1。1. 命名规范

Lua中命名规范基本上和C语言一样。

Lua中的标识符可以由任意字母组合、数字和下划线构成,但不能以数字开头,并且应该避免以下划线开头,或后面是几个大写字母的命名方式。下面是几个正确的命名方式:

不要使用Lua中的关键字。Lua中的关键字很少,只有21个,为变量命名时,不能使用相同的名称。关键字如下:

Lua区分大小写,大写和小写的两个单词是不同的。2. 类型与值

Lua是一种动态类型的语言。在语言中没有类型定义的语法,每个值本身就包含了类型信息。对于一个变量来说,它的值的类型是可以随意变换的。

Lua中有8种基础类型:(1)nil——空;(2)boolean——布尔;(3)number——数字;(4)string——字符串;(5)function——函数;(6)table——表;(7)userdata——自定义数据类型;(8)thread——线程。

函数type用来检测一个变量的类型。

1)nil

在Lua中nil表示的是一种类型,它只包含一个值nil。任何变量在未赋值之前都是nil。当给一个全局变量赋值nil时,表示刪除该变量。

2)boolean

boolean有两个值:true和false。在Lua中只有false和nil表示假,其他情况都为真,数字0也为真。例如下面的代码:(1)当第一句local var不给var赋值时,输出为var is false;(2)当local var=false时,输出为var is false;(3)当local var=true时,输出为var is true;(4)当local var=0时,输出为var is true(区别于C/C++语言);(5)当local var=""时,输出为var is true。

3)number

在Lua中number类型表示实数。不论是浮点数还是整型数都是number类型。有人可能会担心number浮点数的效率,其实现在的CPU大部分都有单独的协处理器计算浮点数,对于浮点数的运算效率完全不是问题。

Lua中的number既可以使用普通的写法,也可以使用科学计数法。如下:

4)string

Lua中的字符串表示的是一个字符序列。里面可以包含任意的字符,包括数字0(C/C++中的字符串终止字符)。并且Lua中字符串的长度是不限制的,既可以是空字符串也可以是整本书,Lua对字符串的处理是很快的。一般定义一个字符串变量如下:

在Lua中,单引号和双引号都可以作为字符串的标识,建议统一使用一种。如果字符串有多种格式,则可以使用下面的方式来定义字符串:

如果字符串中有多个连在一起的方括号时,则可以在两个方括号之间添加多个“=”,比如:

当需要连接两个字符串时,可以使用字符串连接操作符“..”(类似于C语言中的strcat),比如:

当需要获取字符串的长度时,使用“#”能获取字符串的总长度,例如:

5)table

Lua中的table类似于C++中的map,但是相对于map的繁琐,table极大简化了使用过程中的操作。例如要在C++中声明一个的map,需要这么定义:

而在Lua中只需要这样声明:3. 表达式

1)算术运算符

算术运算符有:+(加)、-(减)、*(乘)、/(除)、^(指数)、%(取模)和(负号)。

2)关系运算符

关系运算符有:<(小于)、>(大于)、<=(小于等于)、>=(大于等于)、~=(不等于)和==(等于)。

对于table、userdata和function类型,Lua中是以它们的引用来做比较,即只有在它们指向同一个对象时才是相等的。

3)逻辑操作符

逻辑操作符有:and(与)、or(或)和not(非)。(1)对于and来说,当第一个操作数为假时,返回第一个操作数,否则返回第二个操作数。(2)对于or来说,当第一个操作数为真时,返回第一个操作数,否则返回第二个操作数。

这样使用会带来一些语法上的便利,例如有时候需要判断一个值是不是为空,为空的话给它赋值,按正常的写法应该是这样的:

我们可以写成这样:

4)字符串连接操作符

字符串连接操作符“..”用来连接两个字符串,当后一个为其他类型时会转为字符串,比如:

数字2先转化为字符串再与"Hello"做字符串拼接。

5)操作符优先级

操作符优先级如下(由高到低):

除了指数操作符“^”和连接操作符“..”是右连接外,其他操作符是左结合。

6)table构造式

构造式是用来创建和初始化table的表达式,是Lua中特有的一种表达式。最简单的构造式如下:

构造式还可以初始化一个记录化风格的table,如下:

在构造一个Lua table的时候,如果不给它一个key,那么其默认的key就是从1开始的,例如要声明一个有关星期的table:

这样一个table的构造应该是这样的:

这段代码看起来是不是很眼熟呢?它其实就是我们以前使用过的数组。如果想在一个table中既使用数组又使用map,那么我们也可以像下面一样构造一个table:

如果比较习惯C/C++语言中结构体的用法,也可以这样来给一个table赋值:

也可以使用混合方式给table赋值,未设置key的项,key会自动从1开始编号:

删除一个table项,只需要给它赋值为nil就可以了。例如:

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载