第1章 开学典礼 1
1.1出场人物介绍 1
1.2入学要求——本书适合人群 2
1.3这内容有点糟糕——本书风格 2
1.4你需要这些技能——学Cocos2d-x需要什么知识 3
1.5我们为什么要学Cocos2d-x 4
1.6先给我们的代码找个温馨的家——环境搭建 4
1.6.1紫色风暴之VS2010 4
1.6.2我的Cocos2d-x版本 5
1.6.3看看前辈们的毕业设计——运行官方Demo 6
1.7广告时间——提供一些学习资源 8
第2章 不离不弃的HelloWorld 10
2.1简单到无法想象——直接运行HelloCpp项目 10
2.2新建Cocos2d-x项目遇到的麻烦——成功新建一个HelloWorld 12
2.2.1创建Cocos2d-x项目 12
2.2.2解决编译报错的方案1——直接复制源文件 14
2.2.3解决编译报错的方案2——修改项目配置 17
2.3 HelloWorld,没有想象中的简单——简单解析HelloWorld 19
2.3.1 HelloWorld是如何显示到窗口的 19
2.3.2场景其实不是真正的场景 20
2.4实例来了 23
第3章 我们来学习怎么爬行 29
3.1环游世界——场景 29
3.2一切的主宰——导演 30
3.2.1加载第一个场景 30
3.2.2简单的切换场景 30
3.2.3包含特效的切换场景 32
3.2.4赠送的——推进和弹出场景 34
3.3你走你的,我走我的——层 36
3.4比对象还要可爱的对象——精灵来了 37
3.5我得下命令——菜单 38
3.6当个背包客——节点 40
第4章 我们来学习怎么走路 43
4.1吉他独奏《天空之城》——播放声音 43
4.2控件篇1——我最爱的九妹和按钮事件 44
4.2.1你好,九妹——可拉伸图片 44
4.2.2解决使用extensions库时编译报错的问题 46
4.2.3九妹和按钮搭配 48
4.2.4丰富多彩的按钮事件 49
4.2.5啰嗦一下——CCControlButton特别的小功能 51
4.3控件篇2——我不是DJ之圆形音量按钮 51
4.3.1圆形音量按钮 51
4.4控件篇3——我要战斗之血量条 54
4.4.1又是一个音量控制按钮 54
4.4.2我要的血量条 55
4.5动作篇1——简简单单的运动 56
4.5.1你想去哪,你想走多远——CCMoveTo和CCMoveBy 56
4.5.2我要减肥——CCScaleTo和CCScaleBy 58
4.5.3卡牌翻转特效——用CCScaleTo就可以实现 61
4.5.4闪亮登场——CCBlink 62
4.6动作讲解2——更复杂的运动 63
4.6.1我要你按照我的路线走——CCBezierTo和CCBezierBy 63
4.6.2我没让你停,重复动作——CCRepeatForever 66
4.6.3动作一起做,一边走一边转一边跳——CCSequence 67
4.7动作讲解3——动作监听 69
4.7.1小若,到家了告诉我一声——动作结束监听 69
4.7.2动作家族族谱 70
4.8屏幕触摸事件 72
4.8.1屏幕事件初探 72
4.8.2复数形式的函数——每个CCLayer都能获取屏幕事件 75
4.8.3单数形式的函数——截断事件,一个CCLayer的垄断 77
第5章 是时候跑起来了——《LittleRunner》 80
5.1这是一个什么游戏 80
5.2找个主角回来——创建主角精灵 81
5.2.1创建筛选器 81
5.2.2创建实体基类 82
5.2.3创建主角类 83
5.2.4创建游戏场景 84
5.2.5修改游戏窗口大小 87
5.3其实她不想跑——创建无限滚动地图 87
5.3.1每一帧都可以操作——scheduleUpdate初探 87
5.3.2翻滚吧,地图——地图无限滚动 89
5.4开心的时候——让主角跳起来 91
5.4.1 CCControlButton的应用——创建跳跃按钮 91
5.4.2 CCJumpBy的应用——给主角添加跳跃动作 93
5.5金钱诱惑——加入怪物 95
5.5.1怪物诞生 95
5.5.2怪物巢穴——创建怪物管理器 97
5.5.3贪婪的主角——怪物碰撞检测 99
5.5.4疼了就退后——增加主角受伤时的动作 103
5.6监控一切——创建分数标签、血量条等属性对象 105
第6章 精灵来了第二季 109
6.1一大波精灵来袭——大量精灵单独绘制的缺陷 109
6.2把相同的精灵装上车——使用CCSpriteBatchNode优化绘制 110
6.2.1一次渲染——CCSpriteBatchNode的特别之处 110
6.2.2什么是纹理——CCTexture简单解说 112
6.3遇到不同的精灵怎么办——TexturePacker工具使用 114
6.3.1同一张图片,同一个纹理 114
6.3.2将多张图片打包到一起 115
6.3.3加载打包后的图片 117
6.4是动画,不是动作——CCAnimation 118
6.4.1用打包前的图片创建动画 118
6.4.2用打包后的图片创建动画 121
6.4.3额外赠送——动画创建辅助类 123
第7章 游戏实例之《跑跑跑》 127
7.1更丰富的世界——使用Tiled地图 127
7.1.1世界诞生——创建跑步场景 127
7.1.2 Tiled地图来了——使用Tiled Map Editor创建地图文件 129
7.1.3你报错了吗——Tiled Editor常见路径错误 130
7.2嘿,培养新人——创建新的主角 131
7.2.1主角诞生——创建实体类和主角类 131
7.2.2固定主角出生点——对象层的使用 134
7.2.3让主角跑——添加主角动画 136
7.3更智能的主角——添加角色控制器 137
7.3.1创建控制器基类 137
7.3.2带着它就能跑——主角移动控制器 138
7.3.3焦点是主角——让地图随着主角滚动 141
7.4更多的内容 144
7.4.1让主角上下移动——三方移动控制器 144
7.4.2添加障碍物——Tiled障碍层的使用 148
7.4.3添加能吃的物品以及胜利条件 153
第8章 用多线程做定时器?你疯了——schedule很强大 158
8.1我爱单线程——schedule介绍 158
8.2每一帧都有我——scheduleUpdate和 update 158
8.3定时器可以这么做——schedule和回调函数 160
8.3.1不调用update函数,调用自己的函数 160
8.3.2真正的定时器 162
8.4让一切都停下来——unSchedule 162
8.5触发器可以这么做——scheduleOnce和回调函数 164
8.6额外赠送,我总是很关注我暗恋的女孩——观察者模式 165
8.6.1你喜欢谁?我帮你留意——观察者模式扫盲 165
8.6.2 Cocos2d-x提供的观察者模式工具类——CCNotificationCenter 166
8.6.3 addObserver和postNotification函数传递数据的区别 170
8.6.4额外赠送——自己实现简单的观察者 172
第9章 野外生存训练 177
9.1师父走了,你怎么办——学会查看官方Demo 177
9.2迟早都要学会——学习查看Demo源代码 178
9.3别忘了开源——学习查看Cocos2d-x源代码 179
9.3.1为什么addObserver和postNotification不能同时传递数据 179
9.4物竞天择,没用的就要被淘汰——rtain和release 183
9.4.1为什么会有retain 183
9.4.2真正的凶手autoRelease 183
9.4.3看代码实际点 183
9.4.4原理来了 186
9.4.5实际情况 187
9.4.6倒底什么时候要retain 187
9.5再传授几招 188
9.5.1在调试项目时,跟踪并进入Cocos2d-x的源码 188
9.5.2什么?你忘了保存记忆?我们一起十年了啊——保存数据 189
9.6我能摆脱编译的噩梦——读取Csv配置文件 191
9.6.1什么是Csv文件——Csv格式文件扫盲 191
9.6.2如何创建一个Csv文件 192
9.6.3预热——编写字符串工具类 193
9.6.4辅助工具——编写文本读取工具类 196
9.6.5进入主题——编写Csv文件读取工具类 197
第10章 睡觉的时候不要吃东西——有限状态机 205
10.1花5分钟告诉你什么是有限状态机 205
10.1.1简单认识 205
10.1.2一个很“好玩”的游戏 205
10.1.3实现简单有限状态机的类 206
10.2状态模式之我很胖但我很强 209
10.2.1什么是状态模式 209
10.2.2用状态模式实现有限状态机 211
10.3真正的状态机来了 216
10.3.1创建状态机类 216
10.3.2被释放的木头类 218
10.4事件驱动,你想象不到的强大 221
10.4.1彻底抛弃update函数——新的状态机类 221
10.4.2更智能的状态类 224
10.4.3见证新的运作情况 225
第11章 我比Csv更厉害——强大的Lua 228
11.1让Lua和C++牵手 228
11.1.1 Lua的堆栈和全局表 228
11.1.2 Lua和C++的第一次通信 228
11.2Demo讲解之Lua和C++牵手 229
11.2.1引入头文件 230
11.2.2开始使用 231
11.2.3执行Lua脚本 232
11.2.4重置栈顶索引,将全局变量放到堆栈中 233
11.2.5最后一步,C++取得字符串 233
11.3简单解析Lua的堆栈 234
11.4来点高难度的,获取Lua表结构的数据 235
11.4.1什么是table 235
11.4.2获取table变量 236
11.4.3 lua_gettable函数 236
11.5C++调用Lua函数 239
11.6Lua调用C++的函数 240
第12章 额外奉献,状态机代码生成工具——SMC 244
12.1加快状态机开发速度——SMC是什么 244
12.2永远都从HelloWorld开始 245
12.2.1这是令牌——sm配置文件 245
12.2.2化令牌为力量——使用Smc.jar将配置文件转换为代码 246
12.2.3一劳永逸——更方便的代码转换方式 247
12.2.4整装待发——导入所需文件到项目中 247
12.2.5最后的最后——编写主体类 248
12.2.6简单解析原理 249
12.3实例之SMC版木头写代码 252
12.3.1木头的逻辑 252
12.3.2编写剧本——sm配置文件 253
12.3.3主角诞生——编写Mutou主体类 255
12.3.4导演开拍——编写触发状态切换的功能 259
第13章 自力更生——自己定一个UI模块 264
13.1刚开始必须要轻松一下——UI模块思路简介 264
13.1.1它能为我们做些什么——UI模块包含的功能 264
13.1.2一览众山小——UI模块设计思路图 265
13.2XML文件和属性模块 266
13.2.1一切的源头——UI的XML配置文件 266
13.2.2知识补充1——TinyXML介绍 268
13.2.3知识补充2——TinyXML的HelloWorld 268
13.2.4知识补充3——用TinyXML读取UI模块的XML配置文件 272
13.2.5封装,我们要记住封装——XML标签节点对象 276
13.2.6我负责保存,你负责修饰——XML标签节点属性设置器 283
13.3尝点甜头——创建控件 286
13.4主角来了——组件 288
13.4.1控件基类——MMBase 289
13.4.2普通窗口控件——MMNormalWin 290
13.4.3标签控件——MMLabel 291
13.4.4甜点来了——测试新的控件类 293
13.5控件管理模块 296
13.5.1我是老大——MMWinManager控件管理器 296
13.5.2我是先锋——MMWinSystem控件系统 300
13.5.3我是前台——MMWinDesktop控件顶层桌面 304
13.6控件工厂 305
13.6.1抽象工厂之MMWinBaseFactory 305
13.6.2控件工厂之MMWinFactory 306
13.6.3装饰工厂之MMWinProperityFactory 307
13.6.4最后的事情——运行项目 310
13.7更完整的UI模块 311
第14章 倾情奉献——因为偷懒而诞生的《卡牌塔防》游戏(上篇) 313
14.1开篇——最后的游戏实例 313
14.1.1为什么是塔防游戏 313
14.1.2《卡牌塔防》功能简介——我们能学到哪些知识 313
14.2启程——关卡编辑器 315
14.2.1一个英雄一个坑——炮台坐标编辑器 315
14.2.2按照我给的路径走——怪物坐标编辑器 335
14.2.3添加更多方便的操作 343
14.3磨刀不误砍柴工——预备知识 350
14.3.1导演的助手——场景管理器 350
14.3.2数据读取模块 353
14.3.3全局参数 354
14.3.4请说英文好吗?不,说中文——118N工具类 356
14.3.5导入UI模块和TinyXml模块 360
第15章 倾情奉献——因为偷懒而诞生的《卡牌塔防》游戏(下篇) 363
15.1英雄诞生 363
15.1.1创建关卡场景 363
15.1.2地图层 364
15.1.3实体基类 367
15.1.4英雄管理器1——炮台对象 370
15.1.5英雄管理器2——英雄对象 375
15.1.6英雄管理器3——炮台和英雄的关系 379
15.1.7英雄管理器4——加入创建英雄的功能 380
15.2怪物来袭 382
15.2.1怪物管理器 382
15.2.2移动控制器1——控制器基类 388
15.2.3移动控制器2——移动控制器基类 389
15.2.4移动控制器3——按指定坐标列表移动 391
15.2.5怪物来了 395
15.3英雄进攻 399
15.3.1英雄的一次攻击流程 399
15.3.2在Hero里获取怪物列表 400
15.3.3查找并锁定攻击目标 403
15.3.4英雄的攻击 404
15.3.5子弹管理器1——子弹类 407
15.3.6子弹管理器2——子弹管理器 410
15.3.7子弹管理器3——英雄开始发射子弹 414
15.4华丽的装饰 415
15.4.1怪物血量条 415
15.4.2炮台操作按钮——英雄华丽升级 419
15.4.3怪物起点和终点魔法台 423
第16章 倾情奉献——因为偷懒而诞生的《卡牌塔防》游戏(终结篇) 427
16.1关卡信息UI 427
16.1.1利用自定义UI模块制作关卡信息面板 427
16.1.2关卡信息数据刷新——CCNotificationCenter的应用 432
16.1.3怪物数量刷新 437
16.1.4怪物安息——怪物死亡后塔魂数量刷新 438
16.1.5堡垒安息——怪物到达堡垒后扣除魔力值 439
16.1.6打怪升级——英雄升级扣除塔魂 443
16.2谢幕 444
16.2.1关卡选择——根据关卡数加载游戏 445
16.2.2胜利条件判断 448
16.2.3失败条件判断 452
16.3移植游戏到Android平台 452
16.3.1傻瓜式的Android环境搭建1——准备工作 453
16.3.2傻瓜式的Android环境搭建2——解压和安装 454
16.3.3傻瓜式的Android环境搭建3——测试一下吧 457
16.3.4不需要Cygwin——生成并导入Android项目 458
16.3.5怎么编译C++文件——创建Builder 459
16.3.6开始编译——Android.mk文件 464
第17章 额外的一些东西 468
17.1常见错误及解决方案 468
17.1.1调用可变参数函数时,总是莫名报错 468
17.1.2无法解析的外部符号(或命令) 468
17.1.3 Android移植编译报错——undefined reference to 469
17.1.4使用了TinyXML后,移植到Android中运行报错 469
17.1.5 CCLabelTTF变成了一个黑块——多线程引起的Bug 470
17.2最后的内容 470
17.2.1不管游戏多快,一帧就是一帧,我们能做很多事情 470
17.2.2给读者的惊喜——丁小若寄语 471
17.2.3请提供你的意见以及你发现的Bug 471