精通Cocos2d-x游戏开发(进阶卷)图书
人气:6

精通Cocos2d-x游戏开发(进阶卷)

【精良之作,游戏开发牛人精心打磨!Cocos2d-x创始人王哲先生倾情推荐!Cocos2d-x实用技术→Lua技术→网络游戏开发→跨平台开发,适合Android、Win32和iOS系统,提供QQ交流】

内容简介

精通Cocos2d-x游戏开发》分为《基础卷》和《进阶卷》两册。这两册都有明确的写作目的。《基础卷》专注于Cocos2d-x引擎基础,致力于让Cocos2d-x初学者成为一个基础扎实、靠谱的程序员。《进阶卷》专注于各种实用技术,是作者多年开发经验的结晶,书中的技术点大多是从实际工作中碰到的问题提炼而来的,从问题的本质出发到解决问题的思路,提供了多种解决方案,并对比各方案的优缺点,启发读者思考。

本书为《精通Cocos2d-x游戏开发》的《进阶卷》,共36章,分为4篇。第1篇为“实用技术篇”,主要内容有加密解密、增量更新、分辨率适配、调试技巧、Shader特效、裁剪遮罩、物理引擎、骨骼动画、CocoStudio实践等实用技术。第2篇为“Lua篇”,主要内容有Lua的基础知识、Lua的table与面向对象、C/C 与Lua的通信、Cocos2d-x原生Lua框架与Quick-Cocos2d-x Lua框架等。第3篇为“网络篇”,主要内容有网络基础、select IO复用、Socket和Libcurl等基础知识,以及弱联网、强联网、局域网等网络游戏的客户端和服务端开发。第4篇为“跨平台篇”,主要内容有Android和iOS平台的开发和打包知识,以及如何使用AnySDK快速接入第三方SDK。

本书适合使用Cocos2d-x进行游戏开发的中高级读者阅读,尤其适合在使用Cocos2d-x开发过程中碰到问题的程序员,以及希望学习一些实用技术,从而丰富自身经验的程序员。对于大中专院校的学生和社会培训班的学员,本书也是一本不可多得的学习教程。《精通Cocos2d-x游戏开发》分为《基础卷》和《进阶卷》两册。这两册都有明确的写作目的。《基础卷》专注于Cocos2d-x引擎基础,致力于让Cocos2d-x初学者成为一个基础扎实、靠谱的程序员。《进阶卷》专注于各种实用技术,是作者多年开发经验的结晶,书中的技术点大多是从实际工作中碰到的问题提炼而来的,从问题的本质出发到解决问题的思路,提供了多种解决方案,并对比各方案的优缺点,启发读者思考。

本书为《精通Cocos2d-x游戏开发》的《进阶卷》,共36章,分为4篇。第1篇为“实用技术篇”,主要内容有加密解密、增量更新、分辨率适配、调试技巧、Shader特效、裁剪遮罩、物理引擎、骨骼动画、CocoStudio实践等实用技术。第2篇为“Lua篇”,主要内容有Lua的基础知识、Lua的table与面向对象、C/C 与Lua的通信、Cocos2d-x原生Lua框架与Quick-Cocos2d-x Lua框架等。第3篇为“网络篇”,主要内容有网络基础、select IO复用、Socket和Libcurl等基础知识,以及弱联网、强联网、局域网等网络游戏的客户端和服务端开发。第4篇为“跨平台篇”,主要内容有Android和iOS平台的开发和打包知识,以及如何使用AnySDK快速接入第三方SDK。

本书适合使用Cocos2d-x进行游戏开发的中高级读者阅读,尤其适合在使用Cocos2d-x开发过程中碰到问题的程序员,以及希望学习一些实用技术,从而丰富自身经验的程序员。对于大中专院校的学生和社会培训班的学员,本书也是一本不可多得的学习教程。

编辑推荐

Cocos2d-x创始人王哲先生倾情推荐!

Cocos2d-x实用技术 → Lua技术 → 网络游戏开发 → 跨平台开发;

专注于Cocos2d-x引擎的实际应用,致力于让你成为一个高水平的程序员;

紧跟技术趋势,以当前主流的Cocos2d-x游戏引擎版本3.x进行讲解;

重点介绍实际开发中碰到的各种问题的不同解决思路及其优缺点;

用简洁和通俗易懂的语言写作,读者阅读起来不会枯燥乏味;

深入介绍热更新、加密与解密、骨骼动画、调试技巧、Shader特效及物理引擎等实用技术;

详解在Cocos2d-x中使用Lua的技巧,以及Quick-Cocos2d-x框架和原生Lua框架的区别;

详解网络及实时同步技术,涵盖弱联网、强联网和局域网三种网络游戏的前后端开发;

详解iOS和Android平台下的开发和打包,涵盖证书签名、ABI和JNI等实用技术;

详解如何使用AnySDK在iOS和Android下快速接入第三方SDK;

提供QQ交流群和E-mail等交流方式,为读者答疑解惑。

作者简介

王永宝,自高一起就自学编程,至今已经10年有余。酷爱游戏开发。熟练掌握C/C 、Lua和C#等编程语言。擅长网络编程、高并发服务端架构设计、客户端框架设计和OpenGL等技术。2010年参加了广东省专业杯软件设计大赛,在31所院校的86支队伍的激烈竞争中,凭借一个月内使用三门语言开发的塔防游戏而获得一等奖。同年进入深圳市饭后科技有限公司,陆续担任C 服务端主程、Unity3D主程和Cocos2d-x主程,并作为技术负责人负责了多款游戏的开发。业余时间潜心研究游戏开发,编写了多款游戏作品。

目录

第1篇 实用技术篇

第1章 文件读写

1.1 使用UserDefault

1.2 读写XML文件

1.2.1 XML格式简介

1.2.2 使用TinyXML读取XML

1.2.3 使用TinyXML写入XML

1.3 读写Plist文件

1.3.1 Plist格式简介

1.3.2 读写Plist文件

1.4 读取CSV文件

1.4.1 解析CSV

1.4.2 描述复杂结构

1.5 读写二进制文件

第2章 加密解密

2.1 加密解密基

2.1.1 公钥/私钥与非对称加密

2.1.2 信息摘要与数字签名

2.1.3 数字证书

2.2 防止内存修改

2.3 对资源的加密解密

2.3.1 使用TexturePacker加密纹理

2.3.2 对Lua脚本进行加密

2.3.3 自定义Lua脚本加密解密

2.3.4 自定义图片加密解密

2.4 使用加固工具

2.4.1 360加固保加固步骤

2.4.2 Android应用签名

第3章 增量更新

3.1 使用AssetsManagerEx

3.2 搭建增量更新服务器

3.3 Manifest文件详解

3.4 AssetsManagerEx内部实现流程简析

3.5 自动打包工具

第4章 声音与音效

4.1 选择音频格式

4.2 使用SimpleAudioEngine

4.3 使用AudioEngine

4.4 声音音效相关的经验和技巧

第5章 分辨率适配

5.1 Cocos2d-x适配策略

5.1.1 分辨率适配策略

5.1.2 坐标编码

5.1.3 OpenGL窗口与可视化窗口

5.1.4 setDesignResolutionSize详解

5.2 分辨率适配经验

5.2.1 宽度或高度锁定

5.2.2 计算设计分辨率

5.2.3 场景固定内容

5.2.4 经验小结

5.3 CocoStudio分辨率适配

第6章 CocoStudio实践

6.1 高效创建CSB

6.1.1 简单方案

6.1.2 缓存方案

6.1.3 克隆方案

6.2 异步加载CSB

6.3 高效播放CSB动画

第7章 调试Cocos2d-x

7.1 控制台调试

7.2 使用KxDebuger调试Cocos2d-x

第8章 调试技巧总结

8.1 初级调试技巧

8.1.1 基础操作

8.1.2 启动调试

8.1.3 条件断点

8.1.4 监视技巧

8.2 高级调试技巧

8.2.1 远程调试

8.2.2 coredump调试

8.2.3 使用Bugly捕获崩溃堆栈

8.2.4 命中断点

8.2.5 数据断点

8.2.6 即时窗口

8.2.7 多线程调试

8.2.8 性能调试

8.3 记一次内存泄漏调试

8.3.1 内存泄漏表象

8.3.2 初步分析

8.3.3 排查问题

8.3.4 修改代码定位泄漏点

8.3.5 开始调试

第9章 物理引擎——Box2d基

9.1 核心概念

9.2 工作流程

9.3 物理世界World

9.4 Body和Shape

9.4.1 刚体的碰撞

9.4.2 创建刚体

9.5 关节Joint

9.5.1 使用关节

9.5.2 旋转关节RevoluteJoint

9.5.3 平移关节PrismaticJoint

9.5.4 距离关节DistanceJoint

9.5.5 滑轮关节PulleyJoint

9.5.6 鼠标关节MouseJoint

9.5.7 齿轮关节GearJoint

9.5.8 滚轮关节WheelJoint

9.5.9 焊接关节WeldJoint

9.5.10 摩擦关节FrictionJoint

9.5.11 绳索关节RopeJoint

第10章 物理引擎——应用到Cocos2d-x

10.1 物体的运动

10.1.1 施加力和冲量

10.1.2 角力矩和角冲量

10.2 碰撞检测

10.2.1 碰撞监听

10.2.2 碰撞过滤

10.3 Box2d的调试渲染

10.4 在Cocos2d-x中使用Box2d

10.4.1 物理世界

10.4.2 物理Sprite

10.4.3 碰撞处理

10.5 Box2d的相关工具

10.5.1 PhysicsEditor介绍

10.5.2 BoxCAD介绍

10.5.3 Physics Body Editor介绍

10.5.4 Vertex Helper介绍

第11章 图元渲染

11.1 使用DrawingPrimitives接口绘制图元

11.1.1 如何绘制图元

11.1.2 半透明效果

11.1.3 抗锯齿

11.2 使用DrawNode绘制图元

11.3 渲染接口详解

11.3.1 绘制点

11.3.2 绘制线段、矩形、多边形与圆形

11.3.3 绘制贝塞尔曲线

11.3.4 绘制CardinalSpline

11.3.5 绘制凯特摩曲线

11.3.6 绘制实心图元

11.4 小结

第12章 Spine骨骼动画

12.1 Spine功能简介

12.2 Spine结构

12.3 使用Spine

12.3.1 加载Spine

12.3.2 播放动画

12.3.3 动画回调

12.3.4 显示控制

12.4 Spine高级技巧

12.4.1 混合动画

12.4.2 缓存Spine骨骼动画

12.4.3 异步加载Spine骨骼

12.4.4 Spine的性能优化

第13章 2D、3D粒子特效

13.1 2D粒子特效

13.1.1 粒子系统简介

13.1.2 手动创建粒子系统

13.1.3 使用Cocos2d-x内置的粒子系统

13.1.4 使用Plist文件加载粒子系统

13.1.5 操作粒子系统

13.2 2D粒子系统运行流程

13.2.1 流程简介

13.2.2 粒子的更新和渲染

13.3 3D粒子特效

13.3.1 组件系统

13.3.2 Particle Universe支持的组件

13.4 使用Particle Universe粒子系统

13.4.1 使用PUParticleSystem3D

13.4.2 PUParticleSystem3D相关接口

13.5 3D粒子系统源码简析

13.5.1 ParticleSystem3D结构

13.5.2 初始化流程

第14章 裁剪与遮罩

14.1 片段测试

14.1.1 裁剪测试

14.1.2 Alpha测试

14.1.3 模板测试

14.1.4 深度测试

14.2 裁剪

14.2.1 使用ClippingRectangleNode

14.2.2 ClippingRectangleNode的实现

14.3 遮罩

14.3.1 ScrollViewDemo示例

14.3.2 HoleDemo示例

14.3.3 详解HoleDemo示例

14.3.4 ClippingNode的实现

第15章 使用Shader——GLSL基

15.1 Shader简介

15.2 图形渲染管线

15.2.1 顶点处理器

15.2.2 片段处理器

15.2.3 插值计算

15.3 GLSL基础语法

15.3.1 数据类型和变量

15.3.2 操作符

15.3.3 变量修饰符、统一变量和属性变量

15.3.4 易变变量

15.3.5 语句与函数

15.3.6 Shader简单示例

15.4 在OpenGL中使用Shader

15.4.1 在OpenGL中创建Shader

15.4.2 属性变量

15.4.3 统一变量

15.4.4 错误处理

15.4.5 清理工作

15.5 在Cocos2d-x中使用Shader

15.5.1 Cocos2d-x的Shader架构

15.5.2 Cocos2d-x内置Shader规则

15.5.3 编写Shader

15.5.4 使用Shader的步骤

第16章 使用Shader——常用特效

16.1 Blur模糊效果

16.2 OutLine描边效果

16.3 RGB、HSV与HSL效果

16.4 调整色相

16.5 流光效果

第2篇 Lua篇

第17章 Lua基础概述

17.1 类型与值

17.2 操作符

17.2.1 算术操作符

17.2.2 关系操作符

17.2.3 逻辑操作符

17.2.4 其他操作符

17.3 语句

17.3.1 赋值语句

17.3.2 语句块

17.3.3 条件语句

17.3.4 循环语句

17.4 函数

17.4.1 定义函数

17.4.2 调用函数

17.4.3 函数参数

17.4.4 尾调用

17.5 闭包与泛型for

17.5.1 闭包

17.5.2 泛型for

第18章 Lua——table

18.1 使用table

18.1.1 创建table

18.1.2 访问table

18.1.3 修改table

18.1.4 删除table

18.1.5 遍历table

18.2 元表metatable

18.2.1 元方法

18.2.2 算术、关系与连接元方法

18.2.3 特殊的元方法

18.2.4 __index元方法

18.2.5 __newindex元方法

18.2.6 __mode元方法

18.3 packages介绍

18.3.1 require()方法

18.3.2 编写模块

18.4 面向对象

18.4.1 定义类

18.4.2 实例化

18.4.3 继承

18.5 table库

18.5.1 插入

18.5.2 排序

18.5.3 pack()和unpack()方法

18.5.4 table长度

第19章 Lua与C的通信

19.1 准备工作

19.1.1 头文件与链接库

19.1.2 lua_State指针

19.1.3 堆栈

19.1.4 压入堆栈

19.1.5 访问堆栈

19.1.6 堆栈的其他操作

19.2 操作table

19.2.1 如何将table传入Lua

19.2.2 如何获取Lua返回的table

19.3 C/C 中调用Lua

19.3.1 执行Lua片段

19.3.2 执行Lua脚本文件

19.3.3 调用Lua函数

19.4 注册C/C 函数给Lua调用

19.5 将C 的类传给Lua

第20章 Cocos2d-x原生Lua框架详解

20.1 Cocos2d-x原生Lua框架结构

20.1.1 Lua核心层

20.1.2 Lua脚本引擎

20.1.3 Cocos2d-x到Lua的转换层

20.1.4 Lua辅助层

20.2 使用Cocos2d-x原生Lua框架

20.2.1 在Cocos2d-x中调用Lua

20.2.2 在Lua中操作Cocos2d-x

20.3 Cocos2d-x原生Lua框架运行流程

20.3.1 LuaEngine初始化流程

20.3.2 加载Lua脚本

20.3.3 Cocos2d-x到Lua的事件分发

20.3.4 Lua辅助层初始化流程

20.3.5 Lua辅助层的实用工具

20.4 使用genbindings.py导出自定义类

20.4.1 各个平台的环境搭建

20.4.2 编写要导出的C 的类

20.4.3 编写ini配置文件

20.4.4 修改并执行genbindings.py

20.4.5 注册并在Lua中使用

20.5 扩展Cocos2d-x Lua

20.5.1 编写扩展方法

20.5.2 注册到类中

20.6 lua-tests导读

第21章 Cocos2d-x Quick框架详解

21.1 Quick简介

21.2 Quick框架结构

21.3 使用Quick

21.3.1 创建Quick项目

21.3.2 及时个Quick程序

21.3.3 开发工具

21.4 Quick运行流程分析

21.4.1 初始化流程

21.4.2 MVC框架运行流程

21.5 Quick脚本框架详解

21.5.1 Quick脚本框架整体结构

21.5.2 Quick框架基础模块

21.5.3 Quick脚本框架初始化流程

第22章 Quick框架实践——MVC框架

22.1 组件系统详解

22.1.1 EventProtocol事件组件

22.1.2 StateMachine状态机组件

22.2 ModelBase详解

22.3 MVC示例详解

22.3.1 代码结构简介

22.3.2 启动流程详解

22.3.3 发射子弹

22.3.4 命中目标

22.4 小结

第3篇 网络篇

第23章 网络游戏——网游开发概述

23.1 弱联网游戏

23.2 强联网游戏

23.3 局域网游戏

第24章 弱联网游戏——Cocos2d-x客户端实现

24.1 客户端请求流程

24.2 Libcurl easy接口详解

24.2.1 关于请求链接

24.2.2 关于Post提交表单

24.2.3 关于读写

24.3 使用多线程执行请求

第25章 弱联网游戏——PHP服务器实现... 362

25.1 环境搭建... 362

25.1.1 安装PHP. 362

25.1.2 安装Nginx. 363

25.1.3 安装MySQL. 363

25.1.4 启动服务... 364

25.2 编写PHP. 365

25.2.1 基本语法... 365

25.2.2 表单处理... 366

25.2.3 操作MySQL. 366

25.3 实现签到服务... 366

第26章 强联网游戏——TCP和Socket 369

26.1 Socket接口与TCP. 369

26.1.1 TCP服务器与客户端交互流程... 370

26.1.2 Socket A

在线预览

第5章 分辨率适配

当在不同的分辨率下运行程序时,就会碰到分辨率适配的问题,如出现黑边、界面的一部分显示在屏幕外,我们希望程序在不同的分辨率下运行都能有良好的表现。在Cocos2d-x中,可以通过选择合适的分辨率适配策略,结合合适的坐标编码,适配各种不同的分辨率。而灵活使用Cocos2d-x的分辨率适配策略,还可以解决各种分辨率适配的难题。本章主要介绍以下内容:

Cocos2d-x适配策略。

分辨率适配经验。

CocoStudio分辨率适配。

5.1 Cocos2d-x适配策略

可以在Cocos2d-x中调用CCEGLView的setDesignResolutionSize方法设置游戏的分辨率策略,以及我们的设计分辨率。

setDesignResolutionSize()方法包含3个参数,分别是设计分辨率的宽和高,以及分辨率的适配策略。下面这行代码设置了960×640的设计分辨率,并使用了SHOW_ALL分辨率适配策略。

Director::getInstance()->getOpenGLView()->setDesignResolutionSize(960, 640, ResolutionPolicy::SHOW_ALL);

5.1.1 分辨率适配策略

Cocos2d-x的分辨率适配一般不是为每一种分辨率设计一种布局方案,而是在一种分辨率下进行设计(也就是设计分辨率),然后通过分辨率适配策略,让程序能够适应不同的分辨率。Cocos2d-x提供以下5种分辨率适配策略。

EXACT_FIT以设置的分辨率为标准,按照该分辨率对x和y进行拉伸。

NO_BORDER不留黑边,不拉伸,等比缩放,有一个方向(上下或左右)可能超出屏幕。

SHOW_ALL设置的分辨率区域内全部可见,但上下左右都可能出现黑边。

FIXED_HEIGHT锁定分辨率的高度,宽度不管,可能出现黑边也可能超出屏幕。

FIXED_WIDTH锁定分辨率的宽度,高度不管,可能出现黑边也可能超出屏幕。

通过图5-1~图5-3可以直观地了解到在不同分辨率下,各个分辨率适配策略的表现。以960×640为设计分辨率,然后通过调整窗口的实际分辨率,选择不同的适配模式进行观察。在PC上调用Director的setFrameSize()方法可以自定义窗口的尺寸,但不要在移动设备上设置FrameSize。

首先是EXACT_FIT模式,当在不同的分辨率下运行时,界面的宽和高都会根据我们的设计分辨率进行缩放,例如,当设计分辨率是100×200,在200×300的分辨率下运行时,宽会放大2.0,高会放大1.5,当实际分辨率小于设计分辨率时,Cocos2d-x又会相应地缩小界面使其适配,如图5-1所示。

图5-1 EXACT_FIT模式

NO_BORDER模式下会根据实际分辨率进行等比缩放,不留黑边。首先按照EXACT_FIT模式的缩放规则计算出宽和高的缩放值,按照高的缩放值进行等比缩放。当实际分辨率无法完整放下缩放后的界面时,会有一部分内容显示在屏幕外,如图5-1所示,当界面以NO_BORDER模式进行适配时,红色边框为界面的完整内容,红色边框左下角的红色原点为OpenGL窗口的原点坐标,如图5-2所示。

图5-2 NO_BORDER模式

SHOW_ALL模式下会根据实际分辨率进行等比缩放,显示界面的完整内容,与NO_BORDER模式相反,其会先按照EXACT_FIT模式的缩放规则计算出宽和高的缩放值,按照低的缩放值进行等比缩放。由于是按照小的分辨率进行缩放,所以左右和上下都有可能出现黑边,图5-3右侧图片中的红点处为OpenGL窗口的原点坐标,如图5-3所示。

FIXED_HEIGHT和FIXED_WIDTH模式比较类似,它们会将高度或宽度锁定,按照高度或宽度进行等比缩放,另外一个方向既可能超出,也有可能留下黑边。这两种模式会先按照EXACT_FIT模式的缩放规则计算出宽和高的缩放值,FIXED_HEIGHT取高度缩放值进行等比缩放,保障设计分辨率的高度刚好铺满设计分辨率,FIXED_WIDTH取宽度进行等比缩放,保障设计分辨率的宽度刚好铺满设计分辨率。

图5-3 SHOW_ALL模式

5.1.2 坐标编码

当我们的程序在不同的分辨率下运行时,setDesignResolutionSize()方法会对整个程序按照适配策略根据设计分辨率和实际分辨率进行缩放。在对坐标进行编码时,需要使用相对坐标编码,而根据窗口尺寸可以进行相对坐标的编码,如希望将一个节点放置在屏幕的正中间,就需要将其坐标的x和y分别设置为窗口尺寸的宽和高的1/2。相对左下角原点的坐标则可以直接使用坐标,设置相对位置可以使得程序在不同的分辨率下运行,我们的对象都能够显示在正确的位置上。

在使用相对坐标编码时,Director单例中有几个方法可以获取尺寸,下面了解一下这几个获取尺寸相关的方法。

getWinSize,获取OpenGL窗口的单位尺寸。

getWinSizeInPixels,获取OpenGL窗口的实际像素尺寸。

getVisibleSize,获取可视窗口的尺寸。

getVisibleOrigin,获取可视窗口左下角坐标的位置。

另外GLView对象还提供了以下两个接口来获取其他的尺寸。

getFrameSize,获取设备或窗口的尺寸。

getDesignResolutionSize,获取设置的设计分辨率。

如图5-4直观地演示了上面描述的各种尺寸,WinSize和WinSizeInPixels分别是当前整个OpenGL窗口的单位尺寸和像素尺寸。VisibleSize和VisibleOrigin可以共同构成当前窗口中实际可见部分内容的矩形范围,FrameSize为当前窗口或设备的真实尺寸。

图5-4 WinSize与VisibleSize

WinSize分别为图5-4中左右两图的红色框范围,虽然看上去范围不同,但这是一个单位尺寸,所以值并没有变化,也就是原图尺寸960×640,一般等同于设计分辨率的尺寸,也是OpenGL窗口的单位尺寸。

WinSizeInPixels也对应图5-4两图中的红色框范围,但这个尺寸为实际占用的像素尺寸,所以在不同分辨率下有不同的值(程序逻辑中使用的坐标是单位尺寸,而非像素尺寸)。

VisibleSize表示可视内容的尺寸,在图5-4左图中为红色框范围,右图则为黄色框范围,也就是可以看到的有内容的显示区域尺寸。

VisibleOrigin表示可视内容的左下角坐标,分别是左右图中左下角的红点的位置,左图中OpenGL窗口原点的坐标与红点重叠,而右图中OpenGL窗口的原点为红色框的左下角,VisibleOrigin的Y轴比原点高了64个像素。

FrameSize为窗口或设备的实际尺寸,也就是图5-4中两个窗口的窗口大小1200×640。

Cocos2d-x推荐使用VisibleSize和VisibleOrigin进行相对位置的计算,就是因为根据它们来计算可以保障我们的对象能够处于可视范围中。

WinSize和(0,0)坐标构成了OpenGL窗口,VisibleSize和VisibleOrigin构成了可视窗口,可视窗口不会大于OpenGL窗口,因为OpenGL窗口以外的内容都是不可见的!但OpenGL窗口范围内的对象并不一定可见,如当屏幕窗口容不下OpenGL窗口时。可视窗口可以理解为OpenGL窗口和设备实际分辨率窗口相交的矩形区域。

5.1.3 OpenGL窗口与可视化窗口

绝大部分的游戏都可以使用FIXED_HEIGHT或FIXED_WIDTH模式来实现简单的分辨率适配,只需要在背景上将可能有黑边的内容进行填充即可。这两种模式与SHOW_ALL有些类似,就是都可能导致黑边或超出,但有一种本质区别,即它们的OpenGL窗口不同,这对于坐标编码是有巨大影响的!OpenGL窗口不同,说的是原点位置不同,WinSize、VisibleSize不同。

在图5-5中,使用FIXED_HEIGHT和SHOW_ALL模式都是同样的表现,左右都会有同样的黑边,但FIXED_HEIGHT模式下的OpenGL窗口和可视化窗口对应的是图5-5中的黄色矩形区域(包括左右的黑边),而SHOW_ALL模式下的OpenGL窗口和可视化窗口对应的是图5-5中的红色矩形区域(不包括黑边)。

图5-5 OpenGL窗口和可视化窗口

直观的表现就是,在(0,0)的位置创建一个对象,FIXED_HEIGHT模式下会出现在黄色矩形区域的左下角,而SHOW_ALL模式下会出现在红色矩形区域的左下角。SHOW_ALL模式下的黑边部分是不会出现任何显示对象的,因为不在OpenGL窗口中。而FIXED_HEIGHT模式则可以正常显示,所以只要背景图片大一些,将左右的黑边区域遮住,即可简单地解决适配黑边的问题。正是由于这种实现方式,FIXED_HEIGHT和FIXED_WIDTH模式才可以在背景上对可能有黑边的内容进行填充来解决黑边的问题。

5.1.4 setDesignResolutionSize详解

在了解了适配策略和Cocos2d-x的各种尺寸之后,下面来进一步了解setDesign- ResolutionSize()方法,setDesignResolutionSize()方法中会简单判断传入的设计分辨率的宽度和高度,以及分辨率适配策略,将这些参数保存并调用updateDesignResolutionSize()方法更新分辨率。

void GLView::setDesignResolutionSize(float width, float height,

ResolutionPolicy resolutionPolicy

{

CCASSERT(resolutionPolicy != ResolutionPolicy::UNKNOWN, "should set

resolutionPolicy");

if (width == 0.0f || height == 0.0f

{

return;

}

_designResolutionSize.setSize(width, height);

_resolutionPolicy = resolutionPolicy;

updateDesignResolutionSize();

}

在updateDesignResolutionSize()方法中,首先根据屏幕尺寸和设计分辨率计算出x和y方向的缩放值,然后根据分辨率适配模式选择终的缩放值,计算完缩放值之后,再计算视口的大小。

void GLView::updateDesignResolutionSize

{

if (_screenSize.width > 0 && _screenSize.height > 0

&& _designResolutionSize.width > 0 && _designResolutionSize.height

> 0

{

_scaleX = (float)_screenSize.width / _designResolutionSize.width;

_scaleY = (float)_screenSize.height / _designResolutionSize.height;

//NO_BORDER模式下取大的缩放值等比缩放

if (_resolutionPolicy == ResolutionPolicy::NO_BORDER

{

_scaleX = _scaleY = MAX(_scaleX, _scaleY);

}

//SHOW_ALL模式下取小的缩放值等比缩放

else if (_resolutionPolicy == ResolutionPolicy::SHOW_ALL

{

_scaleX = _scaleY = MIN(_scaleX, _scaleY);

}

//FIXED_HEIGHT模式下取y轴缩放值等比缩放,并将设计分辨率的宽度调整为全屏的

宽度

else if ( _resolutionPolicy == ResolutionPolicy::FIXED_HEIGHT) {

_scaleX = _scaleY;

_designResolutionSize.width = ceilf(_screenSize.width/_scaleX);

}

//FIXED_WIDTH模式下取x轴缩放值等比缩放,并将设计分辨率的高度调整为全屏的

高度

else if ( _resolutionPolicy == ResolutionPolicy::FIXED_WIDTH) {

_scaleY = _scaleX;

_designResolutionSize.height = ceilf(_screenSize.height/_

scaleY);

}

//计算视口的尺寸,并设置视口的矩形区域

float viewPortW = _designResolutionSize.width _scaleX;

float viewPortH = _designResolutionSize.height _scaleY;

_viewPortRect.setRect((_screenSize.width - viewPortW) / 2,

_screenSize.height - viewPortH) / 2, viewPortW, viewPortH);

//重置Director的成员变量来适应可视化矩形

auto director = Director::getInstance();

director->_winSizeInPoints = getDesignResolutionSize();

director->_isStatusLabelUpdated = true;

director->setGLDefaultValues();

}

}

5.2 分辨率适配经验

5.2.1 宽度或高度锁定

我们希望所有的机型都能够很地适配,不要拉伸!不要黑边!FIXED_HEIGHT或FIXED_WIDTH模式是比较容易做到的。

要做到上面的要求,需要选取一个范围,即要适配的分辨率比例的范围。我们都知道iPhone 5的比例非常长,应该没有什么机器比这个比例更长的了,所以一般笔者将iPhone 5的比例设置为要适配的极限比例,也就是说,如果有比iPhone 5更长的手机,笔者就基本放弃这个机型了。接下来选择一个扁的比例,一般在平板电脑上的比例会更扁一些,纵观主流的分辨率,基本都在iPhone 5和iPad之间,所以笔者习惯将要适配的比例在iPhone 5到iPad之间(这里的是以横屏游戏为例,如果是竖屏游戏,只需要把宽和高对调一下即可)。也就是说,假设选择固定高度的FIXED_HEIGHT模式,那么就要选择一个宽和窄的宽度。

选择好比例之后,需要好好设计一下游戏内容,以方便不同分辨率的适配,主要包含游戏的背景、游戏的内容区域,以及UI等。

背景的设计是非常重要的一步,因为背景设计的好坏,直接决定了是否有黑边,以及游戏内容的布局。首先,背景图需要有多大?其次,游戏区域只能有多大?这些问题需要根据游戏的内容来设计。

如果是一个横屏的游戏,可以将游戏区域放在游戏的正中间,游戏内容可以根据游戏区域的原点为相对坐标计算,这时候两边各有一部分区域是可裁剪的。

如果是一个竖屏的雷电射击游戏,可以将游戏区域放在正下方,上方是可裁剪区域,敌人从上方出现,可以将上方的可裁剪区域也纳入游戏区域,敌机根据左上角为原点设置相对坐标。

如果是一个消除类游戏,如果是横屏的,一般把游戏区域放在正中间,左右两边裁剪;如果是竖屏的,一般也把游戏区域放在正中间,上下两边是可裁剪区域。

5.2.2 计算设计分辨率

使用FIXED_HEIGHT或FIXED_WIDTH模式结合一个比较大的背景,一般可以解决大部分游戏的分辨率适配问题,但如果游戏背景并不是锁定宽度或高度的,那么就需要选择其他的分辨率适配策略了。

下面介绍一个简单的适配示例,如图5-6所示。首先背景尺寸是1280×800,这个分辨率没有任何讲究,是美工随便给出的一个分辨率,是一个足够大的尺寸,宽度和高度都不进行锁定,而是根据实际设备的分辨率进行动态调整,这个分辨率尽管不怎么标准,但还是可以用来完成适配。

图5-6 分辨率480×320

游戏中有两部分UI,主界面的菜单面板是居中对齐,getWinSize得到的大小的一半即是居中的位置,面板设置锚点为(0.5,0.5),并设置居中的位置即可。第二部分UI是顶部的信息栏,信息栏的位置是靠上居中,信息栏设置锚点为(0.5,1.0),然后设置getWinSize的width×0.5f为x坐标,height为y坐标即可。

在这里选择的策略是SHOW_ALL,但是设计分辨率需要动态计算出来(一般的代码这里都会设置一个分辨率),因为要使用好1280×800的背景图,关键有以下几点:

不拉伸,不留黑边。

根据手机的分辨率调整可视区域(设置的标准分辨率)。

当目标分辨率比背景还要宽时,把目标分辨率等比缩小,直到分辨率内容全部在可视区域内。

当目标分辨率比背景还要高时,把目标分辨率等比缩小,直到分辨率内容全部在可视区域内。

当目标分辨率比背景小时,把目标分辨率等比放大,直到分辨率内容全部在可视区域内。

我们的背景分辨率是1280×800,720是笔者自己定义的一个值,因为笔者不希望整个背景太宽,所以进行了限制,然后根据实际的分辨率与预期分辨率计算出期望的高和宽(要么高变,要么宽变),代码如下。

float height = 800.0f;

float width = 1280.0f;

float ratio = sz.width / sz.height;

float maxratio = width / height;

float minratio = width / 720.0f;

if (ratio > maxratio

{

//比宽的还要宽

height = width / ratio;

}

else if(ratio < minratio

{

//比窄的还要窄

width = height ratio;

……

媒体评论

本书作者拥有丰富的一线研发经验,对Cocos引擎也有着深入而独到的理解。整个写作期间,他对这本书倾注了大量的心血,精心打磨,多次对不满意的地方推翻重写。这份执着和热忱加精益求精的态度令人感动。这本书内容新颖,紧跟技术趋势,注重实际应用,讲述而深入,对游戏开发人员而言是一本不可多得的专业好书,认真阅读一定大有裨益。

——Cocos2d-x创始人 王哲

网友评论(不代表本站观点)

来自鬼***3(**的评论:

用于进阶,一本很不错的书

2017-04-10 19:10:05
来自匿名用**的评论:

活动时买的,很划算

2017-04-22 20:23:14
来自s***y(**的评论:

cool……

2017-04-23 20:29:20
来自w***h(**的评论:

不错不错不错

2017-04-26 01:07:02
来自匿名用**的评论:

很满意的一次购物

2017-06-16 10:52:37
来自机器丶**的评论:

好用的工具书!!!

2017-10-23 09:43:49
登录后即可发表评论

免责声明

更多相关图书
在线咨询