{{sellerTotalView > 1 ? __("sellers", {number: sellerTotalView}) : __("seller", {number: sellerTotalView}) }}, {{numTotalView > 1 ? __("items", {number: numTotalView}) : __("item", {number: numTotalView}) }}
free FREE

Change Your Zip Code

Inventory information and delivery speeds may vary for different locations.

Location History

{{email ? __('Got it!') : __('Restock Alert')}}

We will notify you by email when the item back in stock.

Cancel
Yami

Jingdong book

精通Cocos2d-x游戏开发 基础卷

{{buttonTypePin == 3 ? __("Scan to view more PinGo") : __("Scan to start")}}

精通Cocos2d-x游戏开发 基础卷

{{__(":people-members", {'people': item.limit_people_count})}} {{ itemCurrency }}{{ item.valid_price }} {{ itemCurrency }}{{ item.invalid_price }} {{ itemDiscount }}
Ends in
{{ itemCurrency }}{{ item.valid_price }}
{{ itemCurrency }}{{ priceFormat(item.valid_price / item.bundle_specification) }}/{{ item.unit }}
{{ itemDiscount }}
{{ itemCurrency }}{{ item.valid_price }} {{ itemCurrency }}{{ priceFormat(item.valid_price / item.bundle_specification) }}/{{ item.unit }} {{ itemCurrency }}{{ item.invalid_price }} {{itemDiscount}}
{{ itemCurrency }}{{ item.valid_price }}
Sale ends in
Sale will starts after Sale ends in
{{ getSeckillDesc(item.seckill_data) }}
{{ __( "Pay with Gift Card to get sale price: :itemCurrency:price", { 'itemCurrency' : itemCurrency, 'price' : (item.giftcard_price ? priceFormat(item.giftcard_price) : '0.00') } ) }} ({{ itemCurrency }}{{ priceFormat(item.giftcard_price / item.bundle_specification) }}/{{ item.unit }}) Details
Best before

Currently unavailable.

We don't know when or if this item will be back in stock.

Unavailable in your area.
Sold Out

Details

Full product details
Editer Recommend

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

游戏开发牛人,四年时间,三易其稿,精心打磨,成就这本精良之作

专注于Cocos2d-x引擎底层机制,致力于让初学者成为一个基础扎实、靠谱的程序员

快速入门 → 基础框架 → UI与交互 → CocoStudio工具链,都是干货,满满诚意

内容新颖,以当前流行的Cocos2d-x游戏引擎版本3.x为主进行讲解

深入讲解了指针、内存、纹理等大多数初学者掌握不牢固的重要知识点

深入剖析了Cocos2d-x引擎在Android、Win32和iOS等系统下的运行流程

深入剖析了大量隐藏在背后的细节、解决问题的方法和思路,以及各种实用技巧和建议

思路分析为主,实现方法次之,举一反三,将这些能力应用于其他引擎的学习中

风格简洁,图文并茂,字斟句酌,表述严谨,将知识准确地呈现在读者面前

内容虽然基础,但却极具深度,既适合基础薄弱的程序员入门,也适合想透彻研究Cocos2d-x引擎的程序员进阶

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


游戏开发图书海报:

Content Description

《Cocos2d-x游戏开发》分为《基础卷》和《进阶卷》两个分册。两卷书籍都有明确的写作目的。《基础卷》专注于Cocos2d-x引擎基础,致力于让Cocos2d-x初学者成为一个基础扎实、靠谱的程序员。《进阶卷》专注于各种实用技术,是作者多年开发经验的结晶,书中的技术点大多是基于实际工作中碰到的问题提炼而来,从问题的本质出发到解决问题的思路,提供了多种解决方案,并对比各方案的优缺点,启发读者思考。
本书为《Cocos2d-x游戏开发》的《基础卷》,共31章,分为4篇。第1篇为《入门篇》,涵盖的主要内容有Cocos2d-x开发环境、学习建议、注意事项及低级错误总结,以及必备的C++编程基础和指针知识等。第2篇为《基础框架篇》,涵盖的主要内容有节点系统、内存管理、场景和层、精灵、动作系统、动画、纹理、文字、运行机制、渲染机制、消息机制和Schedule等。第3篇为《UI与交互篇》,涵盖的主要内容有触摸输入、文本输入、按钮与重力感应输入、Menu和MenuItem,以及GUI框架的功能控件、文本输入、文本显示及容器控件等。第4篇为《CocoStudio工具链篇》,涵盖的主要内容有CocoStudio的UI编辑器、场景编辑器、动画编辑器、2.x编辑器及CocosBuilder等。
本书适合学习Cocos2d-x游戏开发的零基础读者阅读,尤其适合Cocos2d-x自学人员。对于大中专院校的学生和社会培训班的学员,本书也是一本不可多得的学习教程。
快速了解本书精华内容
入门篇
Cocos2d-x启航
使用Cocos2d-x
低级错误大全
图解指针
C++11简介
基础框架篇
节点系统
内存管理
场景和层
精灵详解
动作系统
播放动画
纹理详解
显示文字
运行机制
渲染机制
消息机制
Schedule详解
UI与交互篇
触摸输入
文本输入
按钮与重力感应输入
Menu和MenuItem
GUI框架概述
GUI框架功能控件
GUI框架文本输入和显示
GUI框架容器控件
CocoStudio工具链篇
CocoStudio概述
CocoStudioUI编辑器
CocoStudio场景编辑器
CocoStudio动画编辑器
CocoStudio 2.x编辑器
CocosBuilder
Author Description

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

Comments

永宝拥有丰富的一线研发经验,对Cocos引擎也有着深入而独到的理解。整整的四年时间里,他对这本书倾注了大量的心血,三易其稿,精心打磨。这份执着的热忱和精益求精的态度令人感动。宝剑锋从磨砺出,这本书内容新颖,紧跟趋势,注重本质,讲述准确,由浅入深,层层递进,既能够引领初学者打开Cocos开发世界的大门,也能帮助具有一定经验的开发者更上一层楼,是本不可多得的专业好书。

——Cocos2d-x创始人 王哲

Catalogue

第1篇 入门篇
第1章 Cocos2d-x启航
1.1 特点、内容结构以及建议
1.2 Cocos2d-x简介
1.3 从2.x到3.x
1.4 约定
1.5 启航
1.5.1 Windows
1.5.2 Mac
1.5.3 Linux
1.5.4 Cocos引擎
第2章 使用Cocos2d-x
2.1 Cocos2d-x世界
2.1.1 显示图片
2.1.2 执行逻辑
2.1.3 获取输入
2.2 分析HelloCpp
2.3 小结
第3章 低级错误大全
3.1 create和retain-release
3.2 继承对象的create
3.3 多个对象执行同一个Action
3.4 忘记调用父类的虚函数
3.5 隐藏在代码中的神秘杀手,节点中的节点操作
3.6 普通对象和new出来的对象
3.7 不要忘记init
3.8 addChild失败
3.9 在onEnter中调用parent的addChild
3.10 忘记移除
3.11 重载draw注意事项
3.12 关于引用
3.13 关于命名空间
3.14 关于类之间的互相包含
3.15 关于平台相关的API
3.16 关于update中写逻辑
3.17 关于调试
3.18 小结
第4章 图解指针
4.1 指针与内存
4.2 指针操作
4.3 指针与数组
4.4 函数指针
4.5 野指针和内存泄漏
第5章 C++11简介
5.1 初始化列表
5.2 类型推导
5.3 范围推导
5.4 智能指针和空指针
5.5 Lambda特性
5.6 变长参数模板
5.7 右值引用
5.7.1 分辨左值和右值
5.7.2 移动语义
5.7.3 完美转发
5.8 显式虚函数重载
5.9 小结
第2篇 基础框架篇
第6章 节点系统
6.1 节点的表现
6.1.1 位置
6.1.2 旋转和倾斜
6.1.3 缩放
6.1.4 锚点Anchor
6.1.5 渲染顺序ZOrder
6.1.6 尺寸
6.1.7 懒惰计算
6.1.8 其他属性介绍
6.2 节点的使用
6.2.1 使用Action
6.2.2 使用Schedule
6.3 节点和节点
6.3.1 添加子节点
6.3.2 删除节点
6.3.3 节点查询
6.3.4 节点之间的空间变换
6.4 节点树的渲染
6.5 节点与组件
第7章 内存管理
7.1 内存基础知识
7.1.1 内存区域的划分
7.1.2 new和malloc的区别
7.1.3 堆和栈的区别
7.1.4 代码分析
7.2 内存泄露、野指针和跨动态链接库的内存使用
7.2.1 内存泄露
7.2.2 野指针
7.2.3 动态链接库的内存
7.3 Cocos2d-x的引用计数
7.4 容器对象的内存管理
7.5 复制对象
7.6 内存优化
第8章 场景和层
8.1 Scene场景
8.1.1 场景和Director
8.1.2 切换场景与引用计数
8.1.3 场景切换特效
8.2 Layer层
8.2.1 Layer层详解
8.2.2 LayerColor颜色层详解
8.2.3 LayerGradient渐变层详解
8.2.4 LayerMultiplex复合层详解
第9章 精灵详解
9.1 Sprite详解
9.1.1 使用Sprite
9.1.2 创建Sprite
9.1.3 初始化流程
9.1.4 设置纹理
9.1.5 渲染
9.2 SpriteFrame和SpriteFrameCache详解
9.2.1 SpriteFrame详解
9.2.2 SpriteFrameCache详解
9.2.3 SpriteFrameCache加载流程
9.3 SpriteBatchNode详解
9.3.1 创建SpriteBatchNode
9.3.2 添加与删除SpriteBatchNode
9.3.3 使用SpriteBatchNode
第10章 动作系统
10.1 使用Action
10.2 Action整体框架
10.2.1 Action类
10.2.2 ActionManager类
10.3 Action运行流程
10.3.1 瞬时动作ActionInstant
10.3.2 持续动作ActionInterval
10.3.3 组合动作
10.3.4 函数动作
10.3.5 时间动作
10.4 Action的分类
10.4.1 瞬间动作
10.4.2 持续动作
10.4.3 组合动作
10.4.4 变速动作
10.4.5 扩展动作
10.4.6 特效动作
第11章 播放动画
11.1 播放帧动画
11.2 创建Animation
11.2.1 基于Plist文件自动创建Animation
11.2.2 解析TexturePacker的Plist文件
11.2.3 使用AnimationCache
11.2.4 经验分享
11.3 帧动画框架剖析
11.3.1 帧动画系统结构
11.3.2 Animate运行流程
11.4 进度动画
11.4.1 半径扫描效果
11.4.2 水平扫描效果
11.4.3 垂直扫描效果
11.4.4 四边扩散/收缩效果
第12章 纹理详解
12.1 在Cocos2d-x中使用纹理
12.1.1 Texture的初始化
12.1.2 纹理和Sprite的关系
12.1.3 POT和NPOT
12.1.4 纹理混合 Blend
12.1.5 Alpha预乘
12.1.6 纹理参数
12.1.7 纹理过滤 Texture Filter
12.1.8 纹理环绕
12.1.9 Mip贴图
12.1.10 渲染纹理
12.2 管理纹理
12.2.1 使用TextureCache管理纹理
12.2.2 使用TextureCache加载纹理
12.2.3 异步加载纹理
12.3 纹理格式
12.4 纹理压缩
12.4.1 纹理压缩格式对比
12.4.2 在Cocos2d-x中使用纹理压缩
12.4.3 使ETC1支持透明
第13章 显示文字
13.1 使用Label
13.1.1 LabelTTF详解
13.1.2 LabelBMFont详解
13.1.3 LabelAtlas详解
13.1.4 Label详解
13.2 新Label框架剖析
13.2.1 整体框架
13.2.2 运行流程
13.2.3 STRING_TEXTURE类型Label的运行流程
13.2.4 使用FontAtlas的Label的运行流程
13.2.5 FontAtlas的创建流程
13.3 关于中文显示
13.3.1 使用中文配置文件csv/xml/plist
13.3.2 将代码文件转为UTF-8编码
13.3.3 使用iconv转换中文
13.4 造字工具
13.4.1 使用BMFont工具
13.4.2 使用Hiero工具
第14章 运行机制
14.1 Cocos2d-x内部运行流程
14.1.1 Application详解
14.1.2 Director详解
14.2 Cocos2d-x在Windows下的运行流程
14.3 Cocos2d-x在Android下的运行流程
14.3.1 启动游戏
14.3.2 游戏事件与主循环
14.4 Cocos2d-x在iOS下的运行流程
14.4.1 启动游戏
14.4.2 主循环
第15章 渲染机制
15.1 渲染树VS渲染命令
15.1.1 渲染树
15.1.2 渲染命令
15.2 Cocos2d-x 3.0渲染框架
15.3 渲染命令详解
第16章 消息机制
16.1 事件通知
16.2 NotificationCenter和EventDispatcher
16.2.1 使用EventDispatcher
16.2.2 相关接口
16.2.3 其他监听者
16.2.4 使用NotificationCenter
16.3 内部流程以及注意事项
16.3.1 消息的通知流程
16.3.2 消息的注册流程
16.3.3 消息的注销流程
16.4 小结
第17章 Schedule详解
17.1 Schedule接口简介
17.1.1 回调函数
17.1.2 注册回调
17.1.3 注销回调
17.1.4 时间缩放、暂停、恢复
17.1.5 优先级
17.1.6 线程安全
17.2 Schedule整体结构与运行流程
17.2.1 整体结构
17.2.2 外部流程
17.2.3 更新顺序
17.2.4 注册与注销
17.3 Schedule使用过程中的问题
第3篇 UI与交互篇
第18章 触摸输入
18.1 如何监听触摸消息
18.1.1 监听触摸消息
18.1.2 触摸监听者
18.1.3 触摸消息
18.1.4 注册监听
18.2 触摸输入运行流程
18.3 判断点击
18.4 多点触摸
18.5 点击穿透
第19章 文本输入
19.1 TextFieldTTF简介
19.2 使用TextFieldTTF
19.3 扩展TextFieldTTF
19.4 详解IME
第20章 按钮与重力感应输入
20.1 重力感应
20.1.1 摇一摇
20.1.2 多角度倾斜
20.2 物理按键
第21章 Menu和MenuItem详解
21.1 使用Menu和MenuItem
21.2 结构框架与执行流程
21.2.1 Menu详解
21.2.2 MenuItem详解
21.2.3 执行流程
21.3 MenuItem详解
21.3.1 MenuItemLabel详解
21.3.2 MenuItemAtlasFont详解
21.3.3 MenuItemFont详解
21.3.4 MenuItemSprite详解
21.3.5 MenuItemImage详解
21.3.6 MenuItemToggle详解
21.4 实现TabView
第22章 GUI框架概述
22.1 GUI框架简介
22.1.1 命名空间与头文件
22.1.2 工具方法
22.1.3 九宫缩放
22.2 UIWidget详解
22.2.1 保护节点ProtectNode
22.2.2 高亮相关
22.2.3 位置布局相关
22.2.4 触摸相关
22.2.5 控件焦点
22.2.6 实现自己的Widget
22.3 UILayout详解
22.3.1 Layout背景
22.3.2 裁剪
22.3.3 焦点查找
22.3.4 Layout布局
第23章 GUI框架之功能控件
23.1 UIButton控件
23.1.1 创建Button
23.1.2 加载图片
23.1.3 设置九宫
23.1.4 设置文字
23.2 UICheckBox控件
23.2.1 创建CheckBox
23.2.2 加载图片
23.2.3 选择
23.3 UIImageView控件
23.3.1 创建ImageView
23.3.2 纹理与九宫
23.4 UILoadingBar控件
23.4.1 创建LoadingBar
23.4.2 纹理与九宫
23.4.3 方向与进度
23.5 UISlider控件
23.5.1 创建与加载纹理
23.5.2 九宫
23.5.3 进度与回调
第24章 GUI框架之文本输入和显示
24.1 UIText、UITextAtlas和UITextBMFont文本显示控件
24.2 UIRichText文本显示控件
24.3 UITextField文本输入控件
24.3.1 创建TextField
24.3.2 触摸相关
24.3.3 输入密码
24.3.4 设置、获取文本
24.3.5 输入回调
24.3.6 自动换行与对齐
24.4 UIEditBox文本输入控件
24.4.1 创建EditBox
24.2.2 文本与输入提示文本
24.4.3 输入委托
24.4.4 输入模式
24.4.5 标签与限制
第25章 GUI框架之容器控件
25.1 UIScrollView容器控件
25.1.1 拖曳滚动
25.1.2 InnerContainer详解
25.2 UIListView容器控件
25.3 UIPageView容器控件
25.4 UIWebView容器控件
25.4.1 加载页面
25.4.2 操作页面
25.4.3 页面回调
第4篇 CocoStudio工具链篇
第26章 CocoStudio概述
26.1 CocoStudio是什么
26.2 CocoStudio的设计目标
26.3 使用CocoStudio
26.3.1 使用UI编辑器
26.3.2 使用动画编辑器
26.3.3 使用数据编辑器
26.3.4 使用场景编辑器
26.3.5 使用CocoStudio 2.x
26.4 管理资源
26.5 版本对应
第27章 CocoStudio UI编辑器
27.1 使用UI编辑器
27.2 编写代码
27.2.1 加载UI
27.2.2 UI动画
27.2.3 初始化UI
27.2.4 更新UI
27.3 分辨率适配
27.4 扩展UI编辑器
第28章 CocoStudio场景编辑器
28.1 使用场景编辑器
28.2 组件系统
28.3 触发器
28.3.1 触发器的使用
28.3.2 触发器的代码框架以及运作流程
28.3.3 触发器的扩展
28.4 加载场景
第29章 CocoStudio动画编辑器
第30章 CocoStudio 2.x编辑器
第31章 使用CocosBuilder
Book Abstract

第1章 Cocos2d-x启航
本章主要介绍以下内容:
简单介绍本书的特点、内容结构以及不同人群的阅读建议。
简单介绍Cocos2d-x。
对比Cocos2d-x 3.x以及之前的版本。
版本相关的代码约定。
扫除阻碍,让你的Cocos2d-x跑起来。
1.1 特点、内容结构以及建议
本书的特点是言简意赅、图文并茂、态度严谨、知识面广,一个问题能用一句话说清楚,尽量不说两句,尽量用图片来表达意图。字里行间反复斟酌、扩散思维、举一反三。此书不是一本贴代码的书,但程序离不开代码。它也不是一本TestCpp的注释书,但我们拥抱TestCpp。虽然个人追求简洁,但适当的举例可以帮助理解,不停留在表面的使用,而是深入到内部的实现,扩展到实际应用。三年时间,倾我心血,经过了数次推翻重写,相信会成为一本实用的Cocos2d-x入门到进阶书籍!
Cocos2d-x游戏开发分为上下两卷,本书是上卷《基础卷》,共有4篇,都属于Cocos2d-x的入门基础,与Cocos2d-x紧密相关。基础乃重中之重,而在Cocos2d-x风靡之际,很多Java、ActionScript程序员以及应届生转战Cocos2d-x,基础不甚牢固,相信通过阅读、理解本书,可以起到巩固基础、丰富底蕴的作用,成为一个“靠谱”的Cocos2d-x开发人员。
而下卷《进阶卷》则偏向具体的实战经验,更多的是讲解思路、方法和实践上,包含了物理、适配、热更新、存档、加密等实用技术,客户端网络编程到PHP、C++服务端的开发,以及丰富的跨平台开发经验,可以作为Cocos2d-x游戏开发的案头书,也可作为涉猎书。
对于初学者而言,其中的一些章节描述可能过于深入,对于这些章节中不理解的部分,初学者不必深究,暂且跳过。
第1篇是《入门篇》,主要介绍如何让Cocos2d-x运行起来,新建项目,Cocos2d-x正确的使用方法,一些易犯错误的总结,以及C++11和指针的指引,这部分主要是给没有Cocos2d-x开发经验的人阅读,C++11简介和图解指针这两章适合由Unity3D(简称U3D)、Java或其他语言转到Cocos2d-x的人阅读,易犯错误总结适合Cocos2d-x经验不丰富的人阅读。
第2篇是《基础框架篇》,主要介绍Cocos2d-x最核心的系统,它是Cocos2d-x的基本功,适合需要系统学习或者复习Cocos2d-x的人阅读。
第3篇是《UI与交互篇》,这一篇专门介绍Cocos2d-x的各种交互手段,以及整个GUI架构,同基础框架,也属于Cocos2d-x的基本功。
第4篇是《CocoStudio工具链篇》,工欲善其事必先利其器,这一篇主要围绕CocoStudio工具集为核心,介绍了常用工具的使用,解决了一些使用过程中遇到的问题,适合要了解或学习Cocos2d-x周边工具的人阅读。
1.2 Cocos2d-x简介
Cocos2d-x是从Cocos2d发展而来的移动2D游戏框架,可以用C++、Lua、JavaScript来进行开发。Cocos2d-x项目可以很容易地建立和运行在iOS、Android、黑莓Blackberry等操作系统中。Cocos2d-x还支持Windows、Mac和Linux等桌面操作系统,因此,开发者可以很方便地在桌面操作系统中开发和调试。在操作系统之上,是平台相关的中间层,以及一些第三方的库,如物理、脚本、图形、声音等,中间层之上,是Cocos2d-x的封装,而在最上层,就是使用Cocos2d-x引擎开发的游戏逻辑,整体架构如图1-1所示 (该图来源于Cocos2d-x官网文档)。
图1-1 引擎整体架构
框架实现了各个平台相关的封装,提供了图像渲染、UI系统和输入交互、文件操作、动作动画、消息系统、时间调度、音乐音效播放等一系列实用的基础功能,还包含了物理引擎、脚本绑定等可选功能。
围绕Cocos2d-x引擎周边有Quick-Cocos2d-x,这是在Cocos2d-x的基础上建立的一个以Lua为主的框架,旨在提高开发效率。
Cocos2d-JS是一个基于Cocos2d-x,使用JavaScript的Web游戏框架。
Cocos Code IDE是一个程序员使用的编码工具,主要用于编辑和调试Lua、JavaScript代码。
Cocos Studio则是一套各种资源编辑处理的工具,为Cocos2d-x输出场景、UI、动画等资源。
最后,所有的内容会被集成到Cocos引擎中,Cocos引擎整合了Cocos2d-x及其周边的分支和工具,目的是实现一键安装,建立统一清晰的工作流。
1.3 从2.x到3.x
Cocos2d-x 从2.x版本到3.x版本发生了巨大的变化,这里简单罗列如下:
C++标准使用了新的C++11标准,语法上的差异在第5章中将详细介绍,在Windows系统下,需要使用VS 2012以上的版本才能编译C++11标准的代码。在Mac下的XCode从4.1开始支持C++11特性,但更后面的版本支持得更好。Linux则需要使用GCC 4.7以上的编译器才支持C++11。
渲染方面从渲染树修改为渲染队列,新增的自动批处理渲染大大减少了DrawCall,提高了渲染效率,在第15章中会详细介绍。
命名风格变化很大,摆脱了Cocos2d,摆脱了OC化。
重构了消息机制,将触摸、按键、重力等各种输入从委托模式调整为监听者模式。
新增了3D相关的功能,包括一些简单的3D特效和3D碰撞检测。
容器重做,废弃了原先自定义的系列容器,直接封装了STL容器使用。
简化跨平台项目创建和打包的流程,Cocos2d-x从2.x版本开始就一直致力于简化该过程。
在Node中封装了物理引擎,但这个封装并不恰当。
提供了全局ZOrder顺序,同时关联到渲染和点击触碰。
1.4 约 定
在开始之前,先声明一些约定,以应对Cocos2d-x变化莫测的接口,接口的名字叫什么,本不必纠结,但我们需要将程序跑起来,所以接口的名字错不得。
这里主要声明Cocos2d-x 2.x和3.x版本的名字区别,以便于在介绍代码时,不被版本所困。本书中的代码基本都是以3.0之后的代码为准, 除了一些3.x的新特性外,使用2.x的可以通过遵循我们的约定来使代码运行起来。
代码上的第一个改变是去除了CC前缀,如果读者使用的是2.x版本,那么引擎的类名需要加上CC前缀,而3.x是没有CC前缀的。
常用类和数据结构,CCPoint改为了Vec2,CCObject改为了CCRef。
获取单例接口的调整,从sharedxxxxx改为了getInstance。
变量命名,从m_b touchEnabled 到 _touchEnabled,摒弃了匈牙利命名法。
因为接口改变而导致的编译错误并不难解决,与其介绍所有版本的接口区别,不如直接解决接口错误,这是程序员的基本能力。如果编译错误都解决不了,如何解决更复杂的错误?大部分的代码差异都只是一些名字上的小改动,这种用约定来解决。
约定解决不了的编译错误,如果是对象的方法名改了,可以用“转到定义”的功能来跳转到错误对象的头文件,然后搜索名字最接近的函数。如果是对象的名字被改了,可以通过查看使用了该对象的相关接口来确定该对象的新名字,然后 修改。
一些代码是经历了重构,接口甚至思想都不一样了,我们会在具体的章节中对比、分析,看重构前后有什么区别,是更好还是更坏,好在哪里,坏在哪里。
文中会使用粗体来表示重点内容,用圆括号括起来的内容表示旁白或旁注。
......
第3章 低级错误大全
一些低级错误可能是阻碍一个初学者入门的最大障碍。低级错误可能会狠狠地打击初学者的信心和学习热情!入门篇的目的是为初学者扫清入门障碍,巩固基础,建立对Cocos2d-x的整体认识,降低初学过程的出错几率。
在使用Cocos2d-x时,特别是新手,不犯错误是不可能的,本章将告诉你,Cocos2d-x的代码,不能怎样写!这里面有些是习惯问题,有些是新手比较容易犯的问题,也有些是老手都有可能不小心中招的问题。本章尽量将这些问题的症状和原因一一列出,以便中招的时候能够提供一些线索。
这里总结的一些问题是笔者从Cocos2d-x 1.x版本到现在的Cocos2d-x 3.x发现的问题,随着版本的更新,其中一些问题已经被修复,但大部分的修复只是从运行错误变为了编译错误。本章主要介绍以下内容:
create和retain-release。
继承对象的create。
多个对象执行同一个Action。
忘记调用父类的虚函数。
隐藏在代码中的神秘杀手,节点中的节点操作。
普通对象和new出来的对象。
不要忘记init。
addChild失败。
在onEnter中调用parent的addChild。
忘记移除。
重载draw注意事项。
关于引用。
关于命名空间。
关于类之间的互相包含。
关于平台相关的API。
关于update中写逻辑。
关于调试。
3.1 create和retain-release
这是一位自称有8年C++经验的“大牛”犯下的低级错误,错误是这样产生的,在初始化时使用create方法创建了一个动画对象,在初始化函数中进行测试,这个动画是可以正常播放的。
根据需求,需要在对象被攻击到时播放这个动画,于是将动画对象作为成员变量,在init中使用create方法创建动画对象,初始化后并赋值给成员变量。
将播放动画的代码迁移至update的逻辑中,在触发相应的事件时,播放动画,但运行后就崩溃了,原因是动画对象被释放了。
因为使用create方法创建出来的对象的release在这一帧会被Cocos2d-x调用,如果不希望它被释放,请确保你执行了retain操作。执行之后调用release操作来释放,确保没有内存泄漏。更多关于内存的问题可以参考第7章。
解决这个问题有两种方法,第一种是在每次需要使用一个对象的时候,才调用create方法进行创建,Cocos2d-x中大部分情况下都是这样使用的。第二种是在初始化时创建一次,然后调用对象的retain方法,以避免该对象在外部被释放,后在不需要使用该对象时,调用对象的release方法,以避免内存泄露。
注意:文中retain指执行retain(引用)操作,或调用retain(引用)操作。rease指执行release(释放)操作,调用release(释放)操作。后面为表述方便,直接用retain和release来表达。
3.2 继承对象的create
这是笔者曾经犯过的一个小错误,笔者的对象MySprite继承于Sprite,然后习惯性地使用MySprite::create来创建对象,结果发现create创建出来的对象并不是MySprite而是Sprite。这会导致一些奇怪的表现,而原因正是在MySprite的定义中遗漏了一行代码——CREAT_FUNC(MySprite),导致create调用的是父类Sprite的方法。
3.3 多个对象执行同一个Action
当希望多个对象执行同一个Action时,并不能这样操作:
Action* act = MoveTo::create(...);
sprite1->runAction(act);
sprite2->runAction(act);
因为每个Action只能被一个对象执行,如果希望多个对象执行一个Action,可以使用clone来创建一个新的实例。
3.4 忘记调用父类的虚函数
这是一个很经典,很容易犯的错误,当我第一次碰到这个错误的时候,浪费了很多时间,因此希望能帮大家节省一些时间。如果你继承了某个Cocos2d-x的类,又重写了它的init或者onEnter函数,那么一不小心就可能出现一些比较奇怪的问题,例如,对这个对象施加一个动作,而这个对象没有任何反应,那么首先你会从这个动作上来找问题,而很难想到是因为没有调用到父类的函数。
在很多情况下都需要用到继承、重写虚函数,当重写虚函数的时候,先看一下父类的这个虚函数做了什么。如果这些操作是必须的,就在函数中对父类的虚函数进行调用,如CGameObject继承了Sprite并重写了Sprite的onEnter。
void CGameObject::onEnter()
{
//切记回调父类
Sprite::onEnter();
scheduleUpdate();
}
3.5 隐藏在代码中的神秘杀手,节点中的节点操作
这是笔者2013年碰到的BUG,归功于自动提示,它制造了一个很隐蔽的BUG,笔者将一个节点添加到了另外一个节点中,希望每次单击它都能够向上移动x个单位,于是代码变成了这样:
node->setPositionY(getPositionY() + dis);
然后,这个对象就突然消失不见了,笔者以为是其他地方改变了其位置,或者被隐藏了或意外地删掉了,最后笔者跟踪到代码里面进行调试才发现,括号中的getPositionY返回的并不是自己的Y坐标,而是this的Y坐标,this != node,所以其就偏到屏幕外去了,在节点中操作其他节点时,代码不要输入太快!
……
Introduction

第一次接触Cocos2d-x是在2012年初。当时与一位朋友尝试着制作了一款小游戏,上了App Store平台。在开发中,笔者主要负责游戏美术,这其实不是笔者的长项,所以该游戏的美术效果可以用惨不忍睹来形容。虽然那时候的引擎版本只是1.x,并且开发的游戏相当失败,但通过这个游戏,笔者对Cocos2d-x产生了浓厚的兴趣。

其实Cocos2d-x算不上是一款功能超强的游戏引擎,但它很简洁、小巧,是一款轻量级的游戏引擎。大多数程序员实际上更喜欢简洁的东西,而不是庞然大物。Cocos2d-x简洁的设计结合丰富的Demo,让人可以很快上手,并能使用它开发出一些简单的游戏。其代码的开源及跨平台特性也相当诱人。Cocos2d-x本身的这些特性结合市场的需求,使其很快就成为了手游开发的主流引擎之一。

在Cocos2d-x刚开始火的那一段时间,市面上关于Cocos2d-x的书籍还十分匮乏。笔者利用业余时间对该引擎进行了深入研究,并能使用它开发了几个小游戏,也总结了一些开发经验。之后一段时间,笔者萌生了按照自己的想法写一本Cocos2d-x游戏开发图书的想法。这个想法很快便进入了实施阶段,但进展远没有想象的顺利。其原因一方面是笔者写作的速度跟不上Cocos2d-x的更新速度,另一方面是笔者的工作任务也很重,加之写作期间还开发了四五个游戏作品,这使得笔者本来就不充裕的时间更是捉襟见肘。

的确,Cocos2d-x的更新非常频繁,并且引擎更新的同时带来了很多接口的变化,一些代码甚至需要进行重构。除了原有内容的变化改动之外,日益增加的新功能也加大了写作的难度。虽然2013年底笔者已经完成了初稿,但是回过头来阅读一遍,发现书稿难以达到自己的预期。于是笔者做了一个决定:推翻重写。在经历了几个月的重写之后,Cocos2d-x版本已经升级到了3.0。笔者发现又有许多新增功能和新特性需要重新了解和学习,于是又经历了一段时间的学习和使用,不得不决定再次对该书做较大的改动,几乎又推翻重写了一次。可以说,这几年笔者的业余时间只做了这么一件事情。从开始写作直至完成书稿,整个过程虽然寥寥数语,但却饱含艰辛。在写作的过程中,Cocos2d-x的书籍如雨后春笋,加上自己工作繁忙,写作时间所限,甚至还有放弃的念头。但写一本自己满意的Cocos2d-x图书的信念支撑笔者走到了最后。当然,这一切对笔者而言很有意义,也很有价值:其一是有机会能和读者共享自己的心得体会;其二是自己也得到了提升。毕竟写书相对于写代码而言需要考虑的东西更多。代码写错,还可以改正,而书写错则将误人子弟。

考虑到读者群体的不同,笔者将本书分为《基础卷》和《进阶卷》两个分册。《基础卷》主要是为了让读者夯实Cocos2d-x游戏开发的基础知识,适合没有经验的零基础读者阅读。《进阶卷》的内容全面,且实用性很强,可以拿来就用,快速解决问题,适合想要进阶学习的读者阅读,也可以作为一本解决实际问题的手册使用。当然,对于想要全面而深入学习Cocos2d-x游戏开发的读者而言,则需要系统阅读这两本书方可。

本书是《精通Cocos2d-x游戏开发》的《基础卷》,是一本略有深度的Cocos2d-x入门图书。本书系统地介绍了Cocos2d-x基础语法,并由浅入深介绍了Cocos2d-x游戏引擎底层的实现,同时还引申出了其他相关问题和使用时应该注意的事项。对于初学者,本书的部分内容可能略有些深入,如果遇到难以理解的地方,建议先跳过,等读完后续章节之后再回过头来阅读前面未理解的部分,相信对很多问题就有了新的认识。学习任何知识,基础都是重中之重,相信本书可以帮助读者打下Cocos2d-x游戏开发的坚实基础。

本书内容特色

1.内容新颖,紧跟趋势

本书内容新颖,紧跟技术趋势,以当前主流的Cocos2d-x游戏引擎版本3.x为主进行讲解,在一些必要的地方也兼顾了早期的2.x版本的内容,并对新旧版本之间的差异做了必要说明,适合更多的读者群体阅读。

2.追本溯源,注重核心

本书用较多篇幅介绍了Cocos2d-x游戏引擎的基础框架,并对UI与交互的相关内容做了详细讲解。这些内容都是Cocos2d-x游戏引擎的核心技术,深入理解这些内容,便于读者更好地理解Cocos2d-x游戏引擎的底层实现。

3.追求原创,与时俱进

相较于市场上千篇一律的Cocos2d-x学习教程,本书力求做到与众不同,与时俱进。书中的内容不是堆砌知识点和简单地翻译技术文档,而是从学习和理解的角度出发,并结合作者的实际开发经验,按不同层次读者的学习特性组织内容和讲解,从而达到更好的讲授效果。

4.由浅入深,循序渐进

本书内容编排非常科学,讲解时先抛出一些简单的问题供读者思考,然后发散思维,再逐步扩展到更多、更深入的问题上,继而步步推进,抽丝剥茧,逐层深入,将读者顺利引领到不同阶段的学习之中。

5.风格活泼,讲述准确

刻板的风格不是笔者所钟爱的行文风格。笔者更喜欢用较为简单和自由的文字和读者交流,所以本书阅读起来并不会枯燥乏味。另外,讲解的准确性是科技图书的基本要求,只有准确的表达才能让读者不至于出现太多的理解偏差。所以笔者对书中的表述经过了反复斟酌和提炼,并采用了大量例图、举例和类比等手法,以便于读者更容易理解和掌握。

6.举一反三,扩展思维

本书并不满足于按部就班地介绍功能和API,而是从实际应用出发,扩散思维,在解决问题的同时,让读者思考问题的本质,以更深入地理解所学知识,从而达到举一反三,学以致用的效果。即所谓知行合一,方能真正掌握知识。

本书内容及知识体系

第1篇 入门篇(第1~5章)

本篇属于Cocos2d-x开发的基础铺垫,涵盖的主要内容有Cocos2d-x开发环境搭建、学习建议、注意事项及低级错误总结,以及必备的C++编程基础和指针等。本篇主要是给没有任何Cocos2d-x使用经验的读者作为铺垫阅读。其中,图解指针和C++11简介这两章内容适合由Unity3D(简称U3D)、Java或其他语言转到Cocos2d-x的读者阅读。

第2篇 基础框架篇(第6~17章)

本篇主要介绍了Cocos2d-x的核心框架系统,属于Cocos2d-x开发必练基本功。本篇涵盖的主要内容有节点系统、内存管理、场景和层、精灵、动作系统、播放动画、纹理、文字显示、运行机制、渲染机制、消息机制和Schedule等。学习完本篇,读者可以掌握Cocos2d-x游戏引擎的运行原理及相关开发知识。

第3篇 UI和交互篇(第18~25章)

本篇专门介绍了Cocos2d-x的各种交互手段及整个GUI架构,同基础框架篇一样,本篇也属于Cocos2d-x的必练基本功。本篇涵盖的主要内容有触摸输入、文本输入、按钮与重力感应输入、Menu和MenuItem,以及GUI框架的功能控件、文本输入、文本显示及容器控件等。

第4篇 工具链篇(第26~31章)

工欲善其事必先利其器。本篇主要以CocoStudio的工具集为核心,介绍了常用工具的使用,解决了一些工具在使用过程中遇到的问题,适合想要了解或学习Cocos2d-x周边工具的读者阅读。本篇涵盖的主要内容有CocoStudio的UI编辑器、场景编辑器、动画编辑器、2.x编辑器及CocosBuilder等。

本书阅读建议

由于Cocos2d-x游戏引擎是基于C++的,所以一些基础的C++知识是必须要知道的。假如读者完全没有任何编程方面的经验,就不适合阅读本书。虽然本书中也介绍了部分C++的相关知识,但那是有针对性的,并不是系统地介绍。所以,如果读者没有任何编程基础,可以先阅读一本类似于《C++入门很简单》之类的图书。虽然C++入门并不是想象的那么简单,但这类图书还是可以让你对C++建立一个系统的了解。

书中部分章节的内容可能较为深入,如果读者对这部分内容一时难以理解,则可以先跳过而阅读后续章节,等读完后续章节再回头阅读这部分能容,也许就豁然开朗了。

书中的部分例子引用自Cocos2d-x引擎自带的TestCpp,读者学习的过程中可以参照TestCpp中的例子。虽然本书偏重于理论,但其中介绍到的代码还是可以在TestCpp中编写、修改,并运行起来,从而加深理解。

另外,切勿死记硬背。编程学习不等于应付考试,很多知识点可以现用现查,解决问题就行。读者应该把注意力放在对编程本质的理解上。

本书读者对象

零基础学Cocos2d-x游戏开发的人员;

Cocos2d-x自学人员;

想系统学习Cocos2d-x的程序员;

想巩固和深入理解Cocos2d-x基础的程序员;

想开发跨平台手机游戏的人员;

从其他开发转向Cocos2d-x的程序员;

大中专院校的学生和社会培训的学员。

本书源代码获取方式

本书涉及的源代码大多是Cocos2d-x游戏引擎自身的代码。关于如何获取Cocos2d-x游戏引擎的完整代码,请读者详细阅读本书第1.5节中的介绍。

本书的编写对笔者而言是一个不小的挑战。虽然笔者投入了大量的精力和时间,但只怕百密难免一疏。若读者在阅读本书时发现任何疏漏,希望能及时反馈给我们,以便及时更正,以便于和作者及广大读者交流学习心得,解决学习中遇到的各种问题。

最后祝各位读者读书快乐,学习进步!

作者

Specifications

Brand Jingdong book
Brand Origin China

Disclaimer

Product packaging, specifications and price are subject to change without notice. All information about the products on our website is provided for information purposes only. Please always read labels, warnings and directions provided with the product before use.

View Full Terms of Use
Add to favorites
{{ $isZh ? coupon.coupon_name_sub : coupon.coupon_ename_sub | formatCurrency }}
{{__("Buy Directly")}} {{ itemCurrency }}{{ item.directly_price }}
Quantity
{{ quantity }}
{{ instockMsg }}
{{ limitText }}
{{buttonTypePin == 3 ? __("Scan to view more PinGo") : __("Scan to start")}}
Sold by JD@CHINA
Ship to
{{ __("Ship to United States only") }}
Free shipping over 69
Genuine guarantee

Added to Cart

Keep Shopping

More to Consider

{{ item.brand_name }}

{{ item.item_name }}

{{ item.currency }}{{ item.market_price }}

{{ item.currency }}{{ item.unit_price }}

{{ item.currency }}{{ item.unit_price }}

Coupons

{{ coupon.coupon_name_new | formatCurrency }}
Clip Clipped Over
{{ getCouponDescStr(coupon) }}
{{ coupon.use_time_desc }}
Expires soon {{ formatTime(coupon.use_end_time) }}

Share this item with friends

Cancel

Yami Gift Card

Get this exclusive deal when paying with gift card

Terms and Conditions

Gift card deals are special offers for selected products;

The gift card deals will automatically be activated if a customer uses gift card balance at check out and the balance is sufficient to pay for the total price of the shopping cart products with gift card deals;

You will not be able to activate the gift card deals if you choose other payment methods besides gift card. The products will be purchased at their normal prices;

If your account balance is not enough to pay for the products with gift card deals, you can choose to reload your gift card balance by clicking on the Reload button at either shopping cart page or check out page;

Products that have gift card deals can be recognized by a special symbol showing 'GC Deal';

For any additional questions or concerns, please contact our customer service;

Yamibuy reserves the right of final interpretation.

Sold by Yami

Service Guarantee

Yami Free Shipping over $49
Yami Easy Returns
Yami Ships from United States

Shipping

  • United States

    Standard Shipping is $5.99 (Excluding Alaska & Hawaii). Free on orders of $49 or more.

    Local Express is $5.99 (Available in Parts of CA, NJ, MA & PA). Free on orders of $49 or more.

    2-Day Express (Includes Alaska & Hawaii) starts at $19.99.

Return Policy

Yami is committed to provide our customers with a peace of mind when purchasing from us. Most items shipped from Yamibuy.com can be returned within 30 days of receipt of shipment (For Food, Beverages, Snacks, Dry Goods, Health supplements, Fresh Grocery and Perishables Goods, within 7 days of receipt of shipment due to damages or quality issues; To ensure that every customer receives safe and high-quality products, we do not provide refunds or returns for beauty products once they have been opened or used, except in the case of quality issues; Some products may have different policies or requirements associated with them, please see below for products under special categories, or contact Yami Customer Service for further assistance).
Thank you for your understanding and support.

Learn More

Sold by Yami

Terms and Conditions of Yami E-Gift Card

If you choose “Redeem automatically” as your delivery method, your gift card balance will be reload automatically after your order has been processed successfully;

If you choose “Send to Email”as your delivery method, the card number and CVV will be sent to the email address automatically;

Any user can use the card number and CVV to redeem the gift card, please keep your gift card information safely. If you have any trouble receiving email, please contact Yami customer service;

Yami gift card can be used to purchase both Yami owned or Marketplace products;

Yami gift card will never expire;

Yami gift card balance does not have to be used up at once;

All rights reserved by Yami.

Return Policy

Gift card that has already been consumed is non-refundable.

Sold by JD@CHINA

Service Guarantee

Yami Free Shipping over $49
Yami Easy Returns
Yami Ships from United States

Shipping

  • United States

    Standard Shipping is $5.99 (Excluding Alaska & Hawaii). Free on orders of $49 or more.

    Local Express is $5.99 (Available in Parts of CA, NJ, MA & PA). Free on orders of $49 or more.

    2-Day Express (Includes Alaska & Hawaii) starts at $19.99.

Return Policy

You may return product within 30 days upon receiving the product. Items returned must be new in it's original packing, including the original invoice for the purchase. Customer return product at their own expense.

Sold by JD@CHINA

Service Guarantee

Yami Cross-store Free Shipping over $69
Yami 30-days Return

Yami-China FC

Yami has a consolidation warehouse in China which collects multiple sellers’ packages and combines to one order. Our Yami consolidation warehouse will directly ship the packages to your door. Cross-store free shipping over $69.

Return Policy

You may return products within 30 days upon receiving the products. Sellers take responsibilities for any wrong shipment or missing items. Packing needs to be unopened for any other than quality issues return. We promise to pack carefully, but because goods are taking long journey to destinations, simple damages to packaging may occur. Any damages not causing internal goods quality problems are not allowed to return. If you open the package and any quality problem is found, please contact customer service within three days after receipt of goods.

Shipping Information

Yami Consolidation Service Shipping Fee $9.99(Free shipping over $69)

Sellers in China will ship their orders within 1-2 business days once the order is placed. Packages are sent to our consolidation warehouse in China and combined there. Our Yami consolidation warehouse will directly ship the packages to you via UPS. The average time for UPS to ship from China to the United States is about 10 working days and it can be traced using the tracking number. Due to the pandemic, the delivery time may be delayed by about 5 days. The package needs to be signed by the guest. If the receipt is not signed, the customer shall bear the risk of loss of the package.

Sold by JD@CHINA

Service Guarantee

Free shipping over 69
Genuine guarantee

Shipping

Yami Consolidated Shipping $9.99(Free shipping over $69)


Seller will ship the orders within 1-2 business days. The logistics time limit is expected to be 7-15 working days. In case of customs clearance, the delivery time will be extended by 3-7 days. The final receipt date is subject to the information of the postal company.

Yami Points information

All items are excluding from any promotion or points events on Yamibuy.com

Return Policy

You may return product within 30 days upon receiving the product. Items returned must be new in it's original packing, including the original invoice for the purchase. Customer return product at their own expense.

Yami

Download the Yami App

Back Top

Recommended for You

About the brand

Jingdong book

为您推荐

Yami
欣葉
2种选择
欣叶 御大福 芋头麻薯 180g

周销量 600+

$1.66 $1.99 83折
Yami
欣葉
2种选择
欣叶 御大福 芋头麻薯 180g

周销量 600+

$1.66 $1.99 83折
Yami
欣葉
2种选择
欣叶 御大福 芋头麻薯 180g

周销量 600+

$1.66 $1.99 83折
Yami
欣葉
2种选择
欣叶 御大福 芋头麻薯 180g

周销量 600+

$1.66 $1.99 83折
Yami
欣葉
2种选择
欣叶 御大福 芋头麻薯 180g

周销量 600+

$1.66 $1.99 83折
Yami
欣葉
2种选择
欣叶 御大福 芋头麻薯 180g

周销量 600+

$1.66 $1.99 83折

Reviews{{'('+ commentList.posts_count + ')'}}

Have your say. Be the first to help other guests.

Write a review
{{ totalRating }} Write a review
  • {{i}} star

    {{i}} stars

    {{ parseInt(commentRatingList[i]) }}%

Yami Yami
{{ comment.user_name }}

{{ showTranslate(comment) }}Show Less

{{ strLimit(comment,800) }}Show more

Show Original

{{ comment.content }}

Yami
Show All

{{ formatTime(comment.in_dtm) }} VERIFIED PURCHASE {{groupData}}

{{ comment.likes_count }} {{ comment.likes_count }} {{ comment.reply_count }} {{comment.in_user==uid ? __('Delete') : __('Report')}}
Yami Yami
{{ comment.user_name }}

{{ showTranslate(comment) }}Show Less

{{ strLimit(comment,800) }}Show more

Show Original

{{ comment.content }}

Yami
Show All

{{ formatTime(comment.in_dtm) }} VERIFIED PURCHASE {{groupData}}

{{ comment.likes_count }} {{ comment.likes_count }} {{ comment.reply_count }} {{comment.in_user==uid ? __('Delete') : __('Report')}}

No related comment~

Review

Yami Yami

{{ showTranslate(commentDetails) }}Show Less

{{ strLimit(commentDetails,800) }}Show more

Show Original

{{ commentDetails.content }}

Yami
Show All

{{ formatTime(commentDetails.in_dtm) }} VERIFIED PURCHASE {{groupData}}

{{ commentDetails.likes_count }} {{ commentDetails.likes_count }} {{ commentDetails.reply_count }} {{commentDetails.in_user==uid ? __('Delete') : __('Report')}}

Please write at least one word

Comments{{'(' + replyList.length + ')'}}

Yami Yami

{{ showTranslate(reply) }}Show Less

{{ strLimit(reply,800) }}Show more

Show Original

{{ reply.reply_content }}

{{ formatTime(reply.reply_in_dtm) }}

{{ reply.reply_likes_count }} {{ reply.reply_likes_count }} {{ reply.reply_reply_count }} {{reply.reply_in_user==uid ? __('Delete') : __('Report')}}

Please write at least one word

Cancel

That’s all the comments so far!

Write a review
How would you rate this item?

Please add your comment.

  • A nice nickname will make your comments more popular!
  • The nickname in your account will be changed to the same as here.
Thanks for your review
Our community rely on great reviews like yours to find the best of Asia.

Report

If you find this content inappropriate and think it should be removed from the Yami.com site, let us know please.

Cancel

Are you sure to delete your review?

Cancel

You’ve Recently Viewed

About the brand

Jingdong book