新書推薦:
《
养育女孩 : 官方升级版
》
售價:NT$
230.0
《
跨界:蒂利希思想研究
》
售價:NT$
500.0
《
千万别喝南瓜汤(遵守规则绘本)
》
售價:NT$
203.0
《
大模型启示录
》
售價:NT$
510.0
《
东法西渐:19世纪前西方对中国法的记述与评价
》
售價:NT$
918.0
《
养育男孩:官方升级版
》
售價:NT$
230.0
《
小原流花道技法教程
》
售價:NT$
500.0
《
少女映像室 唯美人像摄影从入门到实战
》
售價:NT$
505.0
|
編輯推薦: |
请单击【显示全部信息】按钮浏览详细信息。
游戏开发高手,四年时间,三易其稿,精心打磨,成就这本精良之作
Cocos2d-x创始人王哲先生倾情推荐!
专注于Cocos2d-x引擎底层机制,致力于让初学者成为一个基础扎实、靠谱的程序员
快速入门 基础框架 UI与交互 CocoStudio工具链,都是干货,满满诚意
内容新颖,以当前流行的Cocos2d-x游戏引擎版本3.x为主进行讲解
深入讲解了指针、内存、纹理等大多数初学者掌握不牢固的重要知识点
深入剖析了Cocos2d-x引擎在Android、Win32和iOS等系统下的运行流程
深入剖析了大量隐藏在背后的细节、解决问题的方法和思路,以及各种实用技巧和建议
思路分析为主,实现方法次之,举一反三,将这些能力应用于其他引擎的学习中
风格简洁,图文并茂,字斟句酌,表述严谨,将知识准确地呈现在读者面前
内容虽然基础,但却极具深度,既适合基础薄弱的程序员入门,也适合想透彻研究Cocos2d-x引擎的程序员进阶
提供QQ交流群和E-mail等交流方式,为读者答疑解惑
推荐阅读(请点丛书链接查看)
《Coco
|
內容簡介: |
《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
|
關於作者: |
王永宝,自高一起就自学编程,至今10年有余。酷爱游戏开发,熟练掌握CC 、Lua和C#等编程语言,擅长网络编程、高并发服务端架构设计、客户端框架设计和OpenGL等技术。2010年参加广东省专业杯软件设计大赛,在31所院校的86支队伍的激烈竞争中,凭借一个月内使用三门语言开发的塔防游戏而获得了一等奖。同年进入深圳市饭后科技有限公司,担任过C 服务端主程、Unity3D主程和Cocos2d-x主程,并作为技术负责人负责了多款游戏的开发。业余时间潜心研究游戏开发,也开发了多款游戏。
|
目錄:
|
第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 使用中文配置文件csvxmlplist
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
|
內容試閱:
|
第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_FUNCMySprite,导致create调用的是父类Sprite的方法。
3.3 多个对象执行同一个Action
当希望多个对象执行同一个Action时,并不能这样操作:
Action* act = MoveTo::create...;
sprite1-runActionact;
sprite2-runActionact;
因为每个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-setPositionYgetPositionY dis;
然后,这个对象就突然消失不见了,笔者以为是其他地方改变了其位置,或者被隐藏了或意外地删掉了,最后笔者跟踪到代码里面进行调试才发现,括号中的getPositionY返回的并不是自己的Y坐标,而是this的Y坐标,this != node,所以其就偏到屏幕外去了,在节点中操作其他节点时,代码不要输入太快!
|
|