登入帳戶  | 訂單查詢  | 購物車/收銀台(0) | 在線留言板  | 付款方式  | 運費計算  | 聯絡我們  | 幫助中心 |  加入書簽
會員登入 新用戶登記
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2023年度TOP分類瀏覽雜誌 臺灣用戶
品種:超過100萬種各類書籍/音像和精品,正品正價,放心網購,悭钱省心 服務:香港台灣澳門海外 送貨:速遞郵局服務站

新書上架簡體書 繁體書
暢銷書架簡體書 繁體書
好書推介簡體書 繁體書

十月出版:大陸書 台灣書
九月出版:大陸書 台灣書
八月出版:大陸書 台灣書
七月出版:大陸書 台灣書
六月出版:大陸書 台灣書
五月出版:大陸書 台灣書
四月出版:大陸書 台灣書
三月出版:大陸書 台灣書
二月出版:大陸書 台灣書
一月出版:大陸書 台灣書
12月出版:大陸書 台灣書
11月出版:大陸書 台灣書
十月出版:大陸書 台灣書
九月出版:大陸書 台灣書
八月出版:大陸書 台灣書

『簡體書』Cocos2d-x实战:C++卷(第2版)

書城自編碼: 2943274
分類:簡體書→大陸圖書→計算機/網絡圖形圖像/多媒體
作者: 关东升
國際書號(ISBN): 9787302454144
出版社: 清华大学出版社
出版日期: 2017-02-01
版次: 2
頁數/字數: 636页
書度/開本: 32开 釘裝: 平装

售價:HK$ 143.6

我要買

 

** 我創建的書架 **
未登入.


新書推薦:
索恩丛书·盛清统治下的太监与皇帝
《 索恩丛书·盛清统治下的太监与皇帝 》

售價:HK$ 88.5
透过器物看历史(全6册)
《 透过器物看历史(全6册) 》

售價:HK$ 490.6
我在台北故宫博物院读名画
《 我在台北故宫博物院读名画 》

售價:HK$ 109.8
尼罗河往事:古埃及文明4000年
《 尼罗河往事:古埃及文明4000年 》

售價:HK$ 76.2
一个人·谁也不是·十万人(诺贝尔文学奖得主反思自我的巅峰之作)
《 一个人·谁也不是·十万人(诺贝尔文学奖得主反思自我的巅峰之作) 》

售價:HK$ 54.9
重写晚明史(全5册  精装)
《 重写晚明史(全5册 精装) 》

售價:HK$ 781.8
汉末晋初之际政治研究
《 汉末晋初之际政治研究 》

售價:HK$ 132.2
强者破局:资治通鉴成事之道
《 强者破局:资治通鉴成事之道 》

售價:HK$ 80.6

 

建議一齊購買:

+

HK$ 129.1
《Cocos2d-x实战:Lua卷(第2版)》
+

HK$ 196.4
《iOS开发指南 从Hello World到App Store》
+

HK$ 148.5
《从零开始学Swift》
+

HK$ 90.7
《iOS实战:苹果“生态圈”编程卷(Swift版)》
+

HK$ 146.2
《iOS实战:入门与提高卷(Swift版)》
+

HK$ 231.4
《Cocos2d-x实战:JS卷——Cocos2d-JS开发》
內容簡介:
本书系统介绍了基于C++语言的Cocos2dx游戏编程和开发技术。介绍了使用Cocos2dx中的核心类、瓦片地图、物理引擎、音乐音效、数据持久化、GUI控件、3D特性、网络通信、数据交换格式、内存管理、性能优化、平台移植、代码版本管理以及应用商店发布产品。
全书分为六篇: 基础篇、进阶篇、数据与网络篇、设计与优化篇、平台移植篇和实战篇。
基础篇是第2章~第8章,内容包括: Cocos2dx简介、环境搭建、字符串、标签、菜单、精灵、场景、层、动作、特效、动画和Cocos2dx用户事件。
进阶篇是第9章~第14章,内容包括: 游戏音乐与音效、粒子系统、瓦片地图、物理引擎、Cocos2dx GUI控件和Cocos2dx中的3D特性。
数据与网络篇是第15章~第19章,内容包括: Cocos2dx数据结构、数据持久化、数据交换格式、基于HTTP的网络通信和基于Node.js的Socket.IO网络通信。
设计与优化篇是第20章~第22章,内容包括: Cocos2dx中的常用设计模式、Cocos2dx中的内存管理和数据性能优化。
平台移植篇是第23章~第25章,内容包括: 从Win32平台到Android平台移植、从Win32平台到iOS平台移植和Cocos2dx多分辨率屏幕适配。
实战篇是第26章~第29章,内容包括: 使用Git管理程序代码版本、项目实战——迷失航线手机游戏、把迷失航线游戏发布到Google play、发布到苹果App Store。
目錄
目录
序(王哲)Ⅰ

前言Ⅲ

第1章准备开始

1.1本书学习路线图

1.2如何使用实例代码

基础篇

第2章Cocos2dx简介与环境搭建

2.1移动平台游戏引擎简介

2.2Cocos2d家谱

2.3Cocos2dx设计目标

2.4在Windows平台下开发Cocos2dx游戏

2.4.1使用Visual Studio开发工具

2.4.2下载和使用Cocos2dx案例

2.4.3生成API文档

本章小结

第3章Hello Cocos2dx

3.1第一个Cocos2dx游戏

3.1.1创建工程

3.1.2工程文件结构

3.1.3代码解释

3.2Cocos2dx核心概念

3.2.1导演

3.2.2场景

3.2.3层

3.2.4精灵

3.2.5菜单

3.3Node与Node层级架构

3.3.1Node中重要的操作

3.3.2Node中重要的属性

3.3.3游戏循环与调度

3.4Cocos2dx坐标系

3.4.1UI坐标

3.4.2OpenGL坐标

3.4.3世界坐标和模型坐标

3.4.4Win32平台下设置屏幕

本章小结

第4章字符串、标签和菜单

4.1Cocos2dx中的字符串

4.1.1使用const char*和std::string

4.1.2使用cocos2d::String

4.1.3Win32平台下中文乱码问题

4.2使用标签

4.2.1使用标签类Label

4.2.2位图字体

4.2.3图片集标签

4.2.4标签中文无法显示问题

4.3使用菜单

4.3.1文本菜单

4.3.2精灵菜单和图片菜单

4.3.3开关菜单

本章小结

第5章精灵

5.1Sprite精灵类

5.1.1创建Sprite精灵对象

5.1.2实例: 使用纹理对象创建Sprite对象

5.2精灵的性能优化

5.2.1使用纹理图集

5.2.2使用精灵帧缓存

本章小结

第6章场景与层

6.1场景与层的关系

6.2场景过渡

6.2.1场景过渡相关函数

6.2.2场景过渡动画

6.3场景的生命周期

6.3.1生命周期函数

6.3.2多场景过渡生命周期

本章小结

第7章动作、特效和动画

7.1动作

7.1.1瞬时动作

7.1.2间隔动作

7.1.3组合动作

7.1.4动作速度控制

7.1.5函数调用

7.2特效

7.2.1网格动作

7.2.2实例: 特效演示

7.3动画

7.3.1帧动画

7.3.2实例: 帧动画使用

本章小结

第8章Cocos2dx用户事件

8.1事件处理机制

8.1.1事件分发器

8.1.2触摸事件

8.1.3实例: 单点触摸事件

8.1.4实例: 使用Lambda表达式

8.1.5键盘事件

8.1.6鼠标事件

8.2在层中进行事件处理

8.2.1触摸事件

8.2.2实例: 单点触摸事件

8.3加速度计与加速度事件

8.3.1加速度计

8.3.2使用事件分发器

8.3.3使用层加速度计事件

8.3.4实例: 运动的小球

本章小结

进阶篇

第9章游戏背景音乐与音效

9.1Cocos2dx中音频文件

9.1.1音频文件介绍

9.1.2Cocos2dx跨平台音频支持

9.2使用Audio引擎

9.2.1音频文件的预处理

9.2.2播放背景音乐

9.2.3停止播放背景音乐

9.2.4背景音乐播放暂停与继续

9.3实例: 设置背景音乐与音效

9.3.1AppDelegate实现

9.3.2HelloWorld场景实现

9.3.3设置场景实现

本章小结

第10章粒子系统

10.1问题的提出

10.2粒子系统基本概念

10.2.1实例: 打火机

10.2.2粒子发射模式

10.2.3粒子系统属性

10.3Cocos2dx内置粒子系统

10.3.1内置粒子系统

10.3.2实例: 内置粒子系统

10.4自定义粒子系统

10.4.1代码创建

10.4.2plist文件创建

本章小结

第11章瓦片地图

11.1地图性能问题

11.2Cocos2dx中瓦片地图API

11.3实例: 忍者无敌

11.3.1设计地图

11.3.2程序中加载地图

11.3.3移动精灵

11.3.4检测碰撞

11.3.5滚动地图

本章小结

第12章物理引擎

12.1使用物理引擎

12.1.1物理引擎核心概念

12.1.2物理引擎与精灵关系

12.2Cocos2dx 3.x中物理引擎封装

12.2.1Cocos2dx 3.x物理引擎API

12.2.2实例: HelloPhysicsWorld

12.2.3实例: 接触与碰撞检测

12.2.4实例: 使用关节

12.3Box2D引擎

12.3.1Box2D核心概念

12.3.2使用Box2D物理引擎的一般步骤

12.3.3实例: HelloBox2D

12.3.4实例: 接触与碰撞检测

12.3.5实例: 使用关节

本章小结

第13章Cocos2dx GUI控件

13.1按钮

13.2ImageView

13.3文本控件

13.3.1Text

13.3.2TextBMFont

13.3.3RichText

13.4RadioButton和RadioButtonGroup

13.5CheckBox

13.6LoadingBar

13.7滑块控件

本章小结

第14章Cocos2dx中的3D特性

14.1一些3D概念

14.1.1网格和模型

14.1.2相机

14.1.3投影

14.2使用3D精灵

14.2.1创建Sprite3D对象

14.2.2实例: 使用模型和纹理Sprite3D对象

14.33D模型文件格式

14.4使用相机

14.4.1创建和设置Camera对象

14.4.2实例: 使用Camera对象

14.53D粒子系统

14.5.1创建PUParticleSystem3D对象

14.5.2实例: 创建Particle Universe
3D粒子

本章小结

数据与网络篇

第15章Cocos2dx数据结构

15.1Cocos2dx中两大类Ref和Value

15.1.1Cocos2dx根类Ref

15.1.2包装类Value

15.2Ref列表结构

15.2.1Array结构

15.2.2实例: Array结构

15.2.3VectorT结构

15.2.4实例: Vector结构

15.3Ref字典结构

15.3.1Dictionary结构

15.3.2实例: Dictionary结构

15.3.3MapK,V结构

15.3.4实例: MapK,V结构

15.4Value列表结构ValueVector

15.4.1ValueVector常用API

15.4.2实例: 使用ValueVector结构

15.5Value字典结构ValueMap和ValueMapIntKey

15.5.1ValueMap和ValueMapIntKey常用API

15.5.2实例: 使用ValueMap结构

本章小结

第16章数据持久化

16.1使用FileUtils访问文件

16.1.1Cocos2dx中的目录

16.1.2实例: 文件读写

16.1.3实例: 路径搜索

16.2持久化概述

16.3UserDefault数据持久化

16.3.1UserDefaultAPI

16.3.2实例: 保存背景音乐和音效设置

16.4属性列表数据持久化

16.4.1属性列表概述

16.4.2实例: MyNotes

16.4.3使用Dictionary读写属性列表文件

16.4.4使用ValueMap读写属性列表文件

16.4.5使用ValueVector读取属性列表文件

16.5SQLite数据库数据持久化

16.5.1SQLite数据库介绍

16.5.2Visual Studio下SQLite数据库开发环境设置

16.5.3实例: 重构MyNotes

16.5.4创建数据库

16.5.5SQLite数据库管理工具

16.5.6查询数据

16.5.7修改数据

本章小结

第17章数据交换格式

17.1CSV数据交换格式

17.1.1文档结构

17.1.2CSV格式解码

17.2XML数据交换格式

17.2.1文档结构

17.2.2SAX解析

17.2.3DOM解析

17.3JSON数据交换格式

17.3.1文档结构

17.3.2JSON框架jsoncpp和rapidjson比较

17.3.3实例: rapidjson解码

17.3.4实例: rapidjson编码

本章小结

第18章基于HTTP的网络通信

18.1网络结构

18.1.1客户端服务器结构网络

18.1.2点对点结构网络

18.2HTTP与HTTPS协议

18.3使用cURL开发客户端

18.3.1cURL与libcurl库

18.3.2Visual Studio下libcurl库开发环境设置

18.3.3实例: 重构MyNotes

18.4使用HttpClient开发客户端

18.4.1HttpClientAPI

18.4.2Visual Studio下HttpClient开发环境设置

18.4.3实例: 重构MyNotes

本章小结

第19章基于Node.js的Socket.IO网络通信

19.1Node.js

19.1.1Node.js安装

19.1.2Node.js测试

19.2使用Socket.IO

19.2.1Socket.IO服务器端开发

19.2.2Cocos2dx的Socket.IO客户端

本章小结

设计与优化篇

第20章Cocos2dx中的常用设计模式

20.1单例设计模式

20.1.1问题提出

20.1.2实现原理

20.1.3应用案例

20.2委托设计模式

20.2.1问题提出

20.2.2实现原理

20.2.3应用案例

20.3观察者设计模式与通知机制

20.3.1问题提出

20.3.2实现原理

20.3.3通知机制

本章小结

第21章Cocos2dx中的内存管理

21.1C内存管理

21.1.1内存分配区域

21.1.2动态内存分配

21.2Ref内存管理

21.2.1内存引用计数

21.2.2自动释放池

21.2.3Ref内存管理规则

21.3Ref内存管理设计模式

21.3.1使用静态构造函数

21.3.2使用访问器

21.4其他类型内存管理

21.4.1Value内存管理

21.4.2VectorT和MapK,V内存管理

本章小结

第22章性能优化

22.1工具

22.1.1Xcode中Instruments工具使用

22.1.2使用Windows任务管理器

22.1.3Visual Studio内存泄漏检测工具Visual
Leak Detector

22.1.4左下角的文字是什么

22.2使用SpriteBatchNode批次渲染

22.3合理使用缓存

22.3.1场景与资源

22.3.2缓存创建和清除时机

22.4图片与纹理优化

22.4.1选择图片格式

22.4.2拼图

22.4.3纹理像素格式

22.4.4纹理缓存异步加载

22.4.5背景图片优化

22.5声音优化

22.5.1声音格式优化

22.5.2声音预处理与清除

22.6多线程并发访问

22.6.1std::thread多线程技术

22.6.2异步预处理声音

22.7SQLite数据库优化

22.7.1表结构优化

22.7.2查询优化

22.7.3插入或删除优化

22.8数据交换格式优化

本章小结

平台移植篇

第23章从Win32平台到Android平台移植

23.1搭建交叉编译和打包环境

23.1.1Android SDK安装

23.1.2管理Android SDK

23.1.3管理Android开发模拟器

23.1.4Android NDK安装

23.1.5设置环境变量

23.2交叉编译、打包和运行

23.2.1使用cocos命令行工具

23.2.2Android.mk编译文件

23.3移植问题汇总

23.3.1中文乱码问题

23.3.2SQLite3数据库移植问题

23.3.3JSON框架rapidjson移植问题

23.3.4libcurl库移植问题

23.3.5libNetwork库移植问题

23.3.6横屏与竖屏设置问题

本章小结

第24章从Win32平台到iOS平台移植

24.1iOS开发环境搭建

24.1.1Xcode安装和卸载

24.1.2Xcode操作界面

24.2从Visual Studio工程到Xcode工程

24.2.1添加源文件

24.2.2添加资源文件

24.2.3Xcode中编译并运行

24.3移植问题汇总

24.3.1中文乱码问题

24.3.2SQLite3数据库移植问题

24.3.3JSON框架rapidjson移植问题

24.3.4libcurl库移植问题

24.3.5声音移植问题

24.3.6使用PVR纹理格式

24.3.7横屏与竖屏设置问题

本章小结

第25章Cocos2dx多分辨率屏幕适配

25.1屏幕适配问题的提出

25.2Cocos2dx屏幕适配

25.2.1三种分辨率

25.2.2分辨率适配策略

25.2.3纹理图集资源适配

25.2.4瓦片地图资源适配

本章小结

实战篇

第26章使用Git管理程序代码版本

26.1代码版本管理工具Git

26.1.1版本控制历史

26.1.2术语和基本概念

26.1.3Git环境配置

26.1.4Git常用命令

26.2代码托管服务GitHub

26.2.1创建和配置GitHub账号

26.2.2创建代码库

26.2.3删除代码库

26.2.4派生代码库

26.2.5GitHub协同开发

26.3实例: Cocos2dx游戏项目协同开发

26.3.1提交到GitHub代码库

26.3.2克隆GitHub代码库

26.3.3重新获得GitHub代码库

本章小结

第27章Cocos2dx敏捷开发项目实战迷失航线手机游戏

27.1迷失航线游戏分析与设计

27.1.1迷失航线故事背景

27.1.2需求分析

27.1.3原型设计

27.1.4游戏脚本

27.2任务1: 游戏工程的创建与初始化

27.2.1迭代1.1: 创建工程

27.2.2迭代1.2: 多分辨率支持

27.2.3迭代1.3: 通用类与基类维护

27.2.4迭代1.4: 发布到GitHub

27.3任务2: 创建Loading场景

27.3.1迭代2.1: 添加场景和层

27.3.2迭代2.2: Loading动画

27.3.3迭代2.3: 异步加载纹理缓存

27.3.4迭代2.4: 异步预处理声音

27.4任务3: 创建Home场景

27.4.1迭代3.1: 添加场景和层

27.4.2迭代3.2: 添加菜单

27.5任务4: 创建设置场景

27.6任务5: 创建帮助场景

27.7任务6: 游戏场景实现

27.7.1迭代6.1: 创建敌人精灵

27.7.2迭代6.2: 创建玩家飞机精灵

27.7.3迭代6.3: 创建炮弹精灵

27.7.4迭代6.4: 初始化游戏场景

27.7.5迭代6.5: 游戏场景菜单实现

27.7.6迭代6.6: 玩家飞机发射炮弹

27.7.7迭代6.7: 炮弹与敌人的接触检测

27.7.8迭代6.8: 玩家飞机与敌人的接触检测

27.7.9迭代6.9: 玩家飞机生命值显示

27.7.10迭代6.10: 显示玩家得分情况

27.8任务7: 游戏结束场景

本章小结

第28章把迷失航线游戏发布到Google play应用商店

28.1谷歌Android应用商店Google
play

28.2Android设备测试

28.3还有最后一公里

28.3.1添加图标

28.3.2生成数字签名文件

28.3.3应用程序打包

28.4发布产品

28.4.1上传APK

28.4.2填写商品详细信息

28.4.3定价和发布范围

本章小结

第29章把迷失航线游戏发布到苹果App Store

29.1苹果的App Store

29.2还有最后一公里

29.2.1添加图标

29.2.2添加启动界面

29.2.3修改发布产品属性

29.3iOS设备测试

29.3.1Xcode设置

29.3.2设备设置

29.4为发布进行编译

29.4.1创建开发者证书

29.4.2创建App ID

29.4.3创建描述文件

29.4.4发布编译

29.5发布上架

29.5.1创建应用

29.5.2应用定价

29.5.3基本信息输入

29.5.4上传应用

29.5.5提交审核

29.6常见审核通不过的原因

29.6.1功能问题

29.6.2用户界面问题

29.6.3商业问题

29.6.4不当内容

29.6.5其他问题

本章小结
內容試閱
前言Cocos2dx实战系列图书自第1版出版后,得到业界一直好评,屡次重印,畅销不衰。随着Cocos2dx版本的变化,很多API有了较大变化,读者希望我们升级Cocos2dx实战系列图书。经过几个月努力,我们终于在2016年8月完成初稿。几个月来,我们夜以继日,几乎推掉一切社交活动,推掉很多企业邀请讲课的机会,不敢有任何的松懈,不敢有任何的犹豫,只专心做一件事情编写此书。书中每一段文字、每一张图片、每一个实例都是我们的用心之作。这次,Cocos2dx实战系列图书升级包括如下4种:《Cocos2dx实战: C卷》第2版《Cocos2dx实战: JS卷Cocos2dJS开发》第2版《Cocos2dx实战: Lua卷》第2版《Cocos2dx实战: 工具卷》第2版
本书是介绍Cocos2dx游戏引擎开发的C编程理论与实践。就是使用C语言开发Cocos2dx的API。关于本系列图书的相关信息请读者关注智捷课堂官方网站http:www.51work6.com。
关于源代码为了更好地为广大读者提供服务,我们专门为本书建立了一个网站,具体网址为www.51work6.combookcocos12.php,大家可以由此查看相关出版信息,并对书中内容发表评论,提出宝贵意见。
勘误与支持我们在网站www.51work6.combookcocos12.php中建立了一个勘误专区,及时地把我们发现的书中的问题和勘误反馈给广大读者。如果读者发现了书中有什么问题,可以在网上留言,也可以发送电子邮件到: eorient@sina.com,我们会在第一时间回复。读者也可以在新浪微博中与作者联系: @tony_关东升。
除关东升外,智捷课堂团队的赵大羽、赵志荣、关锦华也参与了本书的编写。感谢赵大羽老师手绘了书中全部草图,并从专业的角度修改书中图片,力求更加真实、完美地将本书奉献给广大读者。感谢家人理解我的忙碌,并给予极大的关心和照顾,使我能抽出较多时间,投入全部精力专心编写此书。在此感谢清华大学出版社的盛东亮编辑给我们提供了宝贵的意见。
由于时间仓促,书中难免存在不妥之处,请读者原谅,并提出宝贵意见。
关东升2017年1月于北京


第5章精灵
在前面的章节用到了精灵对象但没有深入地介绍,本章我们深入地介绍精灵的使用。精灵是游戏中非常重要的概念,围绕着精灵还有很多概念,如精灵帧缓存、动作和动画等内容。5.1Sprite精灵类
图51Sprite类图
Sprite类图如图51所示,从图中可见Sprite是Node子类,Sprite包含很多类型,例如广告牌精灵类BillBoard也都属于精灵。Sprite类直接继承了Node类,具有Node的基本特征。此外,Cocos2dx现在还提供了3D精灵类Sprite3D,关于Cocos2dx中的3D特征将在第14章详细介绍。5.1.1创建Sprite精灵对象创建精灵对象有多种方式,其中常用的函数如下: 1 static Sprite *create: 创建一个精灵对象,纹理texture表示物体表面细节的一幅或几幅二维图形,也称纹理贴图,当把纹理按照特定的方式映射到物体表面上的时候能使精灵看上去更加真实。该属性需要在创建后设置。2 static Sprite *createconst std::string &filename: 指定图片创建精灵。3 static Sprite *createconst std::string &filename, const Rect &rect: 指定图片和裁剪的矩形区域来创建精灵。4 static Sprite *createWithTextureTexture2D *texture: 指定纹理创建精灵。5 static Sprite *createWithTextureTexture2D *texture, const Rect &rect, bool rotated=false: 指定纹理和裁剪的矩形区域来创建精灵,第三个参数指定是否旋转纹理,默认不旋转。6 static Sprite *createWithSpriteFrameSpriteFrame *pSpriteFrame: 通过一个精灵帧对象创建另一个精灵对象。7 static Sprite *createWithSpriteFrameNameconst std::string &spriteFrameName: 通过指定帧缓存中精灵帧名创建精灵对象。上述create函数在前面的章节中介绍过,而且create函数比较简单,就不再介绍了。5.1.2实例: 使用纹理对象创建Sprite对象使用纹理Texture2D对象创建Sprite对象是使用createWithTexture函数实现的。本节通过一个实例介绍纹理对象创建Sprite对象使用,如图52所示。其中,地面上的草是放在背景见图53中的,场景中的两棵树是从图54所示的树纹理图片中截取出来的。图55所示是树的纹理坐标,注意它的坐标原点在左上角。
图52创建Sprite对象实例
图53场景背景图片
图54树纹理图片
图55树纹理坐标
HelloWorldScene.cpp实现的init函数代码如下:
bool HelloWorld::init
{
if !Layer::init
{
return false;
}
Size visibleSize = Director::getInstance-getVisibleSize;
Vec2 origin = Director::getInstance-getVisibleOrigin;
auto background = Sprite::create"background.png";①
background-setAnchorPointVec2::ZERO;②
this-addChildbackground,0;
auto tree1 = Sprite::create"tree1.png",Rect604, 38, 302, 295;③
tree1-setPositionVec2200,230;
this-addChildtree1,0;
Texture2D* cache = Director::getInstance-getTextureCache-addImage"tree1.png";④
auto tree2 = Sprite::create;⑤
tree2-setTexturecache;⑥
tree2-setTextureRectRect73, 72,182,270;⑦
tree2-setPositionVec2500,200;
this-addChildtree2,0;
return true;
}
其中,代码第①行Sprite::create"background.png"通过background.png图片创建精灵,background.png图片如图53所示; 代码第②行是设置背景的锚点。代码第③行Sprite::create"tree1.png",Rect604, 38, 302, 295通过tree1.png图片和矩形裁剪区域创建精灵,矩形裁剪区域为604, 38, 302, 295,如图55所示。Rect类可以创建矩形裁剪区。Rect构造函数如下:
Rect float x, float y, float width, float height
其中,x,y是UI坐标,坐标原点在左上角; width是裁剪矩形的宽度; height是裁剪矩形的高度。代码第④行通过纹理缓存TextureCache创建纹理Texture2D对象,通过Director的getTextureCache函数可以获得TextureCache实例,TextureCache的addImage"tree1.png"函数可以创建纹理Texture2D对象,其中的tree1.png是纹理图片名。代码第⑤行创建一个空的Sprite对象,所以还要通过后面的很多函数设置它的属性。其中,代码第⑥行tree2setTexturecache是设置纹理,代码第⑦行tree2setTextureRectRect73, 72,182,270是设置纹理的裁剪区域。5.2精灵的性能优化游戏是一种很耗费资源的应用,特别是移动设备中的游戏,性能优化是非常重要的。性能优化有很多方面,这一节只是介绍精灵相关的性能优化; 关于其他方面的优化,会在后面的第22章介绍。精灵的性能优化可以使用精灵表和缓存。下面从这两个方面介绍精灵的性能优化。5.2.1使用纹理图集纹理图集texture atlas也称为精灵表sprite sheet,它把许多小的精灵图片组合到一张大图里面。使用纹理图集或精灵表主要有如下优点:1 减少文件读取次数,读取一张图片比读取一堆小文件要快。2 减少OpenGL ES绘制调用并且加速渲染。3 减少内存消耗。OpenGL ES 1.1仅仅能够使用2的n次幂大小的图片即宽度或者高度是2,4,8,16,32,64,。如果采用小图片OpenGL ES1.1会分配给每张图片2的n次幂大小的内存空间,即使这张图片达不到这样的宽度和高度也会分配大于此图片的2的n次幂大小的空间。那么运用这种图片集的方式将会减少内存碎片。虽然在Cocos2dx 2.0后使用了OpenGL ES 2.0,它不会再分配2的几次幂的内存块了,但是减少读取次数和绘制的优势依然存在。4 Cocos2dx全面支持Zwoptex精灵表制作工具http:www.zwopple.comzwoptex和TexturePacker精灵表制作工具http:www.codeandweb.comtexturepacker,所以创建和使用纹理图集是很容易的。通常可以使用纹理图集制作工具Zwoptex和TexturePacker设计和生成纹理图集文件见图56,以及纹理图集坐标文件plist组成。
图56精灵表文件SpirteSheet.png
plist是属性列表文件,它是一种XML文件。SpriteSheet.plist文件代码如下:
frames

hero1.png②
frame
{{2,1706},{391,327}}③
offset
{6,0}
rotated
sourceColorRect
{{17,0},{391,327}}
sourceSize
{413,327}④
mountain1.png
frame
{{2,391},{934,388}}
offset
{0,-8}
rotated
sourceColorRect
{{0,16},{934,388}}
sourceSize
{934,404}
metadata
format
2
realTextureFileName
SpirteSheet.png
size
{1024,2048}
smartupdate$TexturePacker:SmartUpdate:5f186491d3aea289c50ba9b77716547f:abc353d00773c0ca19d20b55fb028270:755b0266068b8a3b8dd250a2d186c02b$
textureFileName
SpirteSheet.png
上述代码是plist文件,其中代码第①~④行描述了一个精灵帧小的精灵图片位置。代码第②行是精灵帧的名字,一般情况下它的命名与原始的精灵图片名相同; 代码第③行描述了精灵帧的位置和大小,{2,1706}是精灵帧的位置,{391,327}是精灵帧的大小。由于不需要自己编写plist文件,就不再介绍其他的属性了。
提示关于工具Zwoptex和TexturePacker等纹理图集工具的使用,请参考本系列图书的工具卷《Cocos2dx实战: 工具卷》第2版。
使用精灵表文件最简单的方式是使用Sprite的createconst std::string &filename, const Rect &rect函数,其中创建矩形Rect对象可以参考坐标文件中代码第③行的{{2,1706},{391,327}}数据。使用create代码如下:
auto mountain1 = Sprite::create"SpirteSheet.png",Rect2,391, 934, 388;
mountain1-setAnchorPointVec2::ZERO;
mountain1-setPositionVec2-200,80;
mountain1-addChildmountain1,0;
在创建纹理Texture2D对象时,也可以使用精灵表文件。代码如下:
Texture2D* cache = Director::getInstance-getTextureCache-addImage"SpirteSheet.png";
auto hero1 = Sprite::create;
hero1-setTexturecache;
hero1-setTextureRectRect2,1706,391,327;①
hero1-setPositionVec2800,200;
this-addChildhero1,0;
上述代码第①行中的setTextureRect函数,使用坐标文件中描述的数据。5.2.2使用精灵帧缓存精灵帧缓存是缓存的一种。缓存有如下几种: 1 纹理缓存TextureCache: 使用纹理缓存可以创建纹理对象,在上一节已经用到了。2 精灵帧缓存SpriteFrameCache: 能够从精灵表中创建精灵帧缓存,然后再从精灵帧缓存中获得精灵对象,反复使用精灵对象时,使用精灵帧缓存可以节省内存消耗。3 动画缓存AnimationCache: 动画缓存主要用于精灵动画,精灵动画中的每一帧是从动画缓存中获取的。这一节主要介绍精灵帧缓存SpriteFrameCache,要使用精灵帧缓存涉及的类有SpriteFrame和SpriteFrameCache。使用SpriteFrameCache创建精灵对象的主要代码如下:
SpriteFrameCache::getInstance-addSpriteFramesWithFile"SpirteSheet.plist";①
auto mountain1 = Sprite::createWithSpriteFrameName"mountain1.png";②
上述代码第①行是通过SpriteFrameCache创建精灵帧缓存对象,它是采用单例设计模式进行设计的,getInstance函数可以获得SpriteFrameCache单一实例,addSpriteFramesWithFile函数是将精灵帧添加到缓存中,其中SpriteSheet.plist是坐标文件。可以多次调用addSpriteFramesWithFile函数添加更多的精灵帧到缓存中。代码第②行Sprite::createWithSpriteFrameName"mountain1.png"是通过Sprite的createWithSpriteFrameName函数创建精灵对象,其中的参数mountain1.png是SpriteSheet.plist在坐标文件中定义的精灵帧名见SpriteSheet.plist文件代码中的第②行。下面通过一个实例介绍精灵帧缓存使用,如图57所示,在游戏场景中有背景、山和英雄我们把玩家控制的精灵称为英雄,把计算机控制的反方精灵称为敌人。三个精灵。
图57使用精灵帧缓存实例
在HelloWorldScene.cpp实现的init函数代码如下:
bool HelloWorld::init
{
if !Layer::init
{
return false;
}
Size visibleSize = Director::getInstance-getVisibleSize;
Vec2 origin = Director::getInstance-getVisibleOrigin;
auto background = Sprite::create"background.png";①
background-setAnchorPointVec2::ZERO;
this-addChildbackground,0;
SpriteFrameCache *frameCache = SpriteFrameCache::getInstance;②
frameCache-addSpriteFramesWithFile"SpirteSheet.plist";③
auto mountain1 = Sprite::createWithSpriteFrameName"mountain1.png";④
mountain1-setAnchorPointVec2::ZERO;
mountain1-setPositionVec2-200,80;
this-addChildmountain1,0;
SpriteFrame *heroSpriteFrame = frameCache-getSpriteFrameByName"hero1.png";⑤
Sprite *hero1 = Sprite::createWithSpriteFrameheroSpriteFrame;⑥
hero1-setPositionVec2800,200;
this-addChildhero1,0;
return true;
}
上述代码第①行是创建一个背景精灵对象,这个背景精灵对象,并不是通过精灵缓存创建的,而是通过精灵文件直接创建的,事实上也完全可以将这个背景图片放到精灵表中。代码第②行是获得精灵缓存对象。代码第③行是通过addSpriteFramesWithFile函数为精灵缓存添加精灵帧。在前面的介绍中,使用一条语句SpriteFrameCache::getInstanceaddSpriteFramesWithFile"SpriteSheet.plist"替代代码第②和第③行两条语句。在这里分成两条语句是因为后面还要使用frameCache变量。代码第④行是使用Sprite的createWithSpriteFrameName函数创建精灵对象,其中的参数是精灵帧的名字。代码第⑤~⑥行是使用精灵缓存创建精灵对象的另外一种函数,其中代码第⑤行是使用精灵缓存对象frameCache的getSpriteFrameByName函数创建SpriteFrame对象,SpriteFrame对象就是精灵帧对象,事实上在精灵缓存中存放的都是这种类型的对象。代码第⑥行是通过精灵帧对象创建。代码第⑤和⑥行使用精灵缓存方式主要应用于精灵动画时,相关的知识将在精灵动画部分介绍。精灵缓存不再使用后要移除相关精灵帧,否则如果再有相同名称的精灵帧时,就会出现一些奇怪的现象。移除精灵帧的缓存函数如下: 1 void removeSpriteFrameByNameconst std::string & name: 指定具体的精灵帧名移除。2 void removeSpriteFrames: 指定移除精灵缓存。3 void removeSpriteFramesFromFileconst std::string &plist: 指定具体的坐标文件移除精灵帧。4 void removeUnusedSpriteFrames: 移除没有使用的精灵帧。如果为了防止该场景中的精灵缓存对下一个场景产生影响,可以在当前场景所在层的onExit函数中调用这些函数。相关代码如下:
void HelloWorld::onExit
{
Layer::onExit;
SpriteFrameCache::getInstance-removeSpriteFrames;
}
onExit函数是层退出时回调的函数,与init函数类似都属于层的生命周期中的函数。要在h文件中定义,在cpp文件中声明。HelloWorld.h文件的相关代码如下:
#ifndef HELLOWORLD_SCENE_H
#define HELLOWORLD_SCENE_H
#include "cocos2d.h"
class HelloWorld : public cocos2d::Layer
{
public:
virtual bool init;
退出Layer回调函数
virtual void onExit;
CREATE_FUNCHelloWorld;
};
#endif HELLOWORLD_SCENE_H
当然,精灵缓存清除工作也可以放到下一个场景创建时,也就是下一个场景所在层的init函数中实现。相关代码如下:
bool HelloWorld::init
{
SpriteFrameCache::getInstance-removeSpriteFrames;
SpriteFrameCache::getInstance-addSpriteFramesWithFile"SpirteSheet.plist";
}
本章小结通过对本章的学习,了解Cocos2dx中精灵的相关知识和如何创建精灵对象。此外,本章还介绍了精灵的性能优化,优化方式包括使用精灵表和使用精灵帧缓存。

 

 

書城介紹  | 合作申請 | 索要書目  | 新手入門 | 聯絡方式  | 幫助中心 | 找書說明  | 送貨方式 | 付款方式 香港用户  | 台灣用户 | 大陸用户 | 海外用户
megBook.com.hk
Copyright © 2013 - 2024 (香港)大書城有限公司  All Rights Reserved.