第1篇實用技術篇第1章文件讀寫 2
1.1使用UserDefault 2
1.2讀寫XML文件 4
1.2.1XML格式簡介 4
1.2.2使用TinyXML讀取XML 5
1.2.3使用TinyXML寫入XML 6
1.3讀寫Plist文件 7
1.3.1Plist格式簡介 7
1.3.2讀寫Plist文件 8
1.4讀取CSV文件 9
1.4.1解析CSV 10
1.4.2描述復雜結構 11
1.5讀寫二進制文件 11
第2章加密解密 15
2.1加密解密基礎 15
2.1.1公鑰/私鑰與非對稱加密 15
2.1.2信息摘要與數字簽名 16
2.1.3數字證書 17
2.2防止內存修改 17
2.3對資源的加密解密 18
2.3.1使用TexturePacker加密紋理 18
2.3.2對Lua腳本進行加密 19
2.3.3自定義Lua腳本加密解密 22
2.3.4自定義圖片加密解密 24
2.4使用加固工具 27
2.4.1360加固保加固步驟 27
2.4.2Android應用簽名 28
第3章增量更新 32
3.1使用AssetsManagerEx 32
3.2搭建增量更新服務器 35
3.3Manifest文件詳解 36
3.4AssetsManagerEx內部實現流程簡析 38
3.5自動打包工具 40
第4章聲音與音效 51
4.1選擇音頻格式 51
4.2使用SimpleAudioEngine 53
4.3使用AudioEngine 54
4.4聲音音效相關的經驗和技巧 56
第5章分辨率適配 58
5.1Cocos2d-x適配策略 58
5.1.1分辨率適配策略 58
5.1.2坐標編碼 60
5.1.3OpenGL窗口與可視化窗口 61
5.1.4setDesignResolutionSize詳解 62
5.2分辨率適配經驗 63
5.2.1寬度或高度鎖定 63
5.2.2計算設計分辨率 64
5.2.3場景固定內容 66
5.2.4經驗小結 67
5.3CocoStudio分辨率適配 67
第6章CocoStudio最佳實踐 68
6.1高效創建CSB 68
6.1.1簡單方案 68
6.1.2緩存方案 69
6.1.3克隆方案 70
6.2異步加載CSB 74
6.3高效播放CSB動畫 77
第7章調試Cocos2d-x 78
7.1控制臺調試 78
7.2使用KxDebuger調試Cocos2d-x 81
第8章調試技巧總結 84
8.1初級調試技巧 84
8.1.1基礎操作 84
8.1.2啟動調試 86
8.1.3條件斷點 86
8.1.4監視技巧 88
8.2高級調試技巧 90
8.2.1遠程調試 90
8.2.2coredump調試 92
8.2.3使用Bugly捕獲崩潰堆棧 92
8.2.4命中斷點 93
8.2.5數據斷點 96
8.2.6即時窗口 97
8.2.7多線程調試 97
8.2.8性能調試 97
8.3記一次內存泄漏調試 100
8.3.1內存泄漏表象 100
8.3.2初步分析 101
8.3.3排查問題 101
8.3.4修改代碼定位泄漏點 102
8.3.5開始調試 103
第9章物理引擎——Box2d基礎 107
9.1核心概念 107
9.2工作流程 108
9.3物理世界World 110
9.4Body和Shape 111
9.4.1剛體的碰撞 111
9.4.2創建剛體 112
9.5關節Joint 114
9.5.1使用關節 114
9.5.2旋轉關節RevoluteJoint 115
9.5.3平移關節PrismaticJoint 117
9.5.4距離關節DistanceJoint 118
9.5.5滑輪關節PulleyJoint 118
9.5.6鼠標關節MouseJoint 119
9.5.7齒輪關節GearJoint 120
9.5.8滾輪關節WheelJoint 122
9.5.9焊接關節WeldJoint 123
9.5.10摩擦關節FrictionJoint 124
9.5.11繩索關節RopeJoint 125
第10章物理引擎——應用到Cocos2d-x 126
10.1物體的運動 126
10.1.1施加力和沖量 126
10.1.2角力矩和角沖量 127
10.2碰撞檢測 127
10.2.1碰撞監聽 127
10.2.2碰撞過濾 129
10.3Box2d的調試渲染 130
10.4在Cocos2d-x中使用Box2d 130
10.4.1物理世界 131
10.4.2物理Sprite 133
10.4.3碰撞處理 136
10.5Box2d的相關工具 139
10.5.1PhysicsEditor介紹 139
10.5.2BoxCAD介紹 142
10.5.3PhysicsBodyEditor介紹 143
10.5.4VertexHelper介紹 144
第11章圖元渲染 145
11.1使用DrawingPrimitives接口繪制圖元 145
11.1.1如何繪制圖元 145
11.1.2半透明效果 146
11.1.3抗鋸齒 147
11.2使用DrawNode繪制圖元 147
11.3渲染接口詳解 147
11.3.1繪制點 148
11.3.2繪制線段、矩形、多邊形與圓形 148
11.3.3繪制貝塞爾曲線 148
11.3.4繪制CardinalSpline 149
11.3.5繪制凱特摩曲線 149
11.3.6繪制實心圖元 149
11.4小結 150
第12章Spine骨骼動畫 151
12.1Spine功能簡介 151
12.2Spine結構 152
12.3使用Spine 154
12.3.1加載Spine 154
12.3.2播放動畫 155
12.3.3動畫回調 156
12.3.4顯示控制 158
12.4Spine高級技巧 161
12.4.1混合動畫 161
12.4.2緩存Spine骨骼動畫 162
12.4.3異步加載Spine骨骼 163
12.4.4Spine的性能優化 169
第13章2D、3D粒子特效 172
13.12D粒子特效 172
13.1.1粒子系統簡介 172
13.1.2手動創建粒子系統 173
13.1.3使用Cocos2d-x內置的粒子系統 175
13.1.4使用Plist文件加載粒子系統 175
13.1.5操作粒子系統 176
13.22D粒子系統運行流程 179
13.2.1流程簡介 179
13.2.2粒子的更新和渲染 180
13.33D粒子特效 180
13.3.1組件系統 181
13.3.2ParticleUniverse支持的組件 182
13.4使用ParticleUniverse粒子系統 184
13.4.1使用PUParticleSystem3D 184
13.4.2PUParticleSystem3D相關接口 187
13.53D粒子系統源碼簡析 189
13.5.1ParticleSystem3D結構 189
13.5.2初始化流程 190
第14章裁剪與遮罩 194
14.1片段測試 194
14.1.1裁剪測試 195
14.1.2Alpha測試 195
14.1.3模板測試 195
14.1.4深度測試 196
14.2裁剪 197
14.2.1使用ClippingRectangleNode 197
14.2.2ClippingRectangleNode的實現 198
14.3遮罩 199
14.3.1ScrollViewDemo示例 199
14.3.2HoleDemo示例 201
14.3.3詳解HoleDemo示例 203
14.3.4ClippingNode的實現 204
第15章使用Shader——GLSL基礎 212
15.1Shader簡介 212
15.2圖形渲染管線 212
15.2.1頂點處理器 215
15.2.2片段處理器 215
15.2.3插值計算 216
15.3GLSL基礎語法 217
15.3.1數據類型和變量 217
15.3.2操作符 218
15.3.3變量修飾符、統一變量和屬性變量 219
15.3.4易變變量 219
15.3.5語句與函數 220
15.3.6Shader簡單示例 220
15.4在OpenGL中使用Shader 221
15.4.1在OpenGL中創建Shader 221
15.4.2屬性變量 224
15.4.3統一變量 226
15.4.4錯誤處理 227
15.4.5清理工作 228
15.5在Cocos2d-x中使用Shader 228
15.5.1Cocos2d-x的Shader架構 228
15.5.2Cocos2d-x內置Shader規則 229
15.5.3編寫Shader 232
15.5.4使用Shader的步驟 234
第16章使用Shader——常用特效 236
16.1Blur模糊效果 236
16.2OutLine描邊效果 238
16.3RGB、HSV與HSL效果 240
16.4調整色相 241
16.5流光效果 243
第2篇Lua篇
第17章Lua基礎概述 248
17.1類型與值 248
17.2操作符 249
17.2.1算術操作符 249
17.2.2關系操作符 249
17.2.3邏輯操作符 250
17.2.4其他操作符 250
17.3語句 250
17.3.1賦值語句 250
17.3.2語句塊 251
17.3.3條件語句 251
17.3.4循環語句 251
17.4函數 252
17.4.1定義函數 252
17.4.2調用函數 252
17.4.3函數參數 253
17.4.4尾調用 253
17.5閉包與泛型for 254
17.5.1閉包 254
17.5.2泛型for 255
第18章Lua——table 257
18.1使用table 257
18.1.1創建table 257
18.1.2訪問table 258
18.1.3修改table 258
18.1.4刪除table 258
18.1.5遍歷table 259
18.2元表metatable 259
18.2.1元方法 260
18.2.2算術、關系與連接元方法 260
18.2.3特殊的元方法 261
18.2.4__index元方法 262
18.2.5__newindex元方法 262
18.2.6__mode元方法 263
18.3packages介紹 264
18.3.1require()方法 264
18.3.2編寫模塊 265
18.4面向對象 266
18.4.1定義類 266
18.4.2實例化 267
18.4.3繼承 268
18.5table庫 269
18.5.1插入 269
18.5.2排序 269
18.5.3pack()和unpack()方法 270
18.5.4table長度 270
第19章Lua與C的通信 271
19.1準備工作 271
19.1.1頭文件與鏈接庫 272
19.1.2lua_State指針 272
19.1.3堆棧 273
19.1.4壓入堆棧 273
19.1.5訪問堆棧 274
19.1.6堆棧的其他操作 275
19.2操作table 275
19.2.1如何將table傳入Lua 275
19.2.2如何獲取Lua返回的table 276
19.3C/C++中調用Lua 277
19.3.1執行Lua片段 277
19.3.2執行Lua腳本文件 278
19.3.3調用Lua函數 279
19.4注冊C/C++函數給Lua調用 279
19.5將C++的類傳給Lua 281
第20章Cocos2d-x原生Lua框架詳解 284
20.1Cocos2d-x原生Lua框架結構 284
20.1.1Lua核心層 284
20.1.2Lua腳本引擎 285
20.1.3Cocos2d-x到Lua的轉換層 285
20.1.4Lua輔助層 285
20.2使用Cocos2d-x原生Lua框架 285
20.2.1在Cocos2d-x中調用Lua 285
20.2.2在Lua中操作Cocos2d-x 286
20.3Cocos2d-x原生Lua框架運行流程 289
20.3.1LuaEngine初始化流程 289
20.3.2加載Lua腳本 291
20.3.3Cocos2d-x到Lua的事件分發 293
20.3.4Lua輔助層初始化流程 297
20.3.5Lua輔助層的實用工具 298
20.4使用genbindings.py導出自定義類 302
20.4.1各個平臺的環境搭建 303
20.4.2編寫要導出的C++的類 304
20.4.3編寫ini配置文件 304
20.4.4修改并執行genbindings.py 305
20.4.5注冊并在Lua中使用 306
20.5擴展Cocos2d-xLua 307
20.5.1編寫擴展方法 307
20.5.2注冊到類中 309
20.6lua-tests導讀 309
第21章Cocos2d-xQuick框架詳解 310
21.1Quick簡介 310
21.2Quick框架結構 310
21.3使用Quick 312
21.3.1創建Quick項目 312
21.3.2第一個Quick程序 314
21.3.3開發工具 316
21.4Quick運行流程分析 319
21.4.1初始化流程 319
21.4.2MVC框架運行流程 320
21.5Quick腳本框架詳解 321
21.5.1Quick腳本框架整體結構 321
21.5.2Quick框架基礎模塊 322
21.5.3Quick腳本框架初始化流程 323
第22章Quick框架實踐——MVC框架 325
22.1組件系統詳解 325
22.1.1EventProtocol事件組件 326
22.1.2StateMachine狀態機組件 327
22.2ModelBase詳解 329
22.3MVC示例詳解 330
22.3.1代碼結構簡介 331
22.3.2啟動流程詳解 331
22.3.3發射子彈 337
22.3.4命中目標 338
22.4小結 340
第3篇網絡篇
第23章網絡游戲——網游開發概述 344
23.1弱聯網游戲 344
23.2強聯網游戲 345
23.3局域網游戲 346
第24章弱聯網游戲——Cocos2d-x客戶端實現 347
24.1客戶端請求流程 347
24.2Libcurleasy接口詳解 348
24.2.1關于請求鏈接 348
24.2.2關于Post提交表單 349
24.2.3關于讀寫 350
24.3使用多線程執行請求 351
24.4使用LibcurlMulti接口進行非阻塞請求 352
24.4.1Multi接口 352
24.4.2Multi工作流程 353
24.5使用非阻塞的Libcurl實現簽到功能 357
24.5.1初始化界面 358
24.5.2發起請求 358
24.5.3處理結果 359
24.5.4解析結果 360
第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.1Socket接口與TCP 369
26.1.1TCP服務器與客戶端交互流程 370
26.1.2SocketAPI詳解 372
26.1.3WindowsSocketAPI詳解 376
26.2簡單的TCP服務器端與客戶端 376
26.2.1TCP服務器實現 377
26.2.2TCP客戶端實現 379
26.3非阻塞Socket與select()函數 380
26.3.1非阻塞Socket 380
26.3.2select()函數的使用 380
26.3.3調整TCP服務器為Select模型 382
26.4半包粘包 384
26.4.1什么是半包粘包 384
26.4.2處理半包粘包 385
26.5心跳與超時 387
26.5.1TCP的死連接 388
26.5.2檢測死連接 389
第27章強聯網游戲——單機版動作游戲 390
27.1需求分析與類設計 390
27.2創建工程和場景 393
27.3添加實體 396
27.4實體顯示組件 399
27.5消息定義 400
27.6添加SingleProxy 401
27.7游戲的主邏輯 402
第28章強聯網游戲——C++服務器實現 404
28.1服務端需求分析 404
28.2kxServer的使用 404
28.3NetDemoServer服務器 405
28.4接收客戶端請求 409
28.5移植前端代碼 412
28.6梳理流程和總結 412
第29章網絡游戲——前后端網絡同步 414
29.1整理入口場景 414
29.2連接服務器 416
29.3添加OnlineProxy 416
29.4打包與恢復場景 418
29.5實時同步 419
第30章局域網游戲——使用UDP 423
30.1使用UDP 423
30.2UDP通信流程 424
30.2.1sendto()函數 424
30.2.2recvfrom()函數 425
30.3UDP廣播 425
30.3.1什么是網絡號和主機號 426
30.3.2A類、B類、C類地址與廣播地址 426
30.3.3什么是子網和子網掩碼 426
30.3.4本地網絡的定義是什么 427
30.3.5發送廣播 427
30.4簡單的UDP服務器 428
30.5簡單的UDP客戶端 429
第31章局域網游戲——建立、搜索、加入房間 430
31.1建立房間 430
31.2移植后端代碼 432
31.3搜索房間 434
第4篇跨平臺篇
第32章Android環境搭建 440
32.1Android環境搭建基礎 440
32.1.1JDK和JRE 440
32.1.2關于ADK 442
32.1.3關于NDK 443
32.2使用Eclipse打包 443
32.2.1打開Android項目 443
32.2.2解決Java報錯 444
32.2.3設置NDK 448
32.2.4解決打包報錯 450
32.2.5解決運行報錯 451
32.3使用AndroidStudio打包 453
32.3.1cocoscompile命令 453
32.3.2編譯打包AndroidStudio 454
32.3.3打包遇到的問題 455
32.4新建Android項目 456
32.5實用技巧 458
32.5.1關于版本問題 458
32.5.2關于減少包體積 459
第33章使用JNI實現C++與Java互調 461
33.1Android基本概念 461
33.1.1Activity簡介 461
33.1.2Intent簡介 463
33.1.3資源與R.java 463
33.1.4AndroidManifest.xml簡介 463
33.2HelloJNI項目 463
33.2.1使用Eclipse創建項目 463
33.2.2使用AndroidStudio創建項目 465
33.3編寫JNI的C++代碼 467
33.3.1為Eclipse添加Android.mk和hello.c 467
33.3.2在AndroidStudio下編寫JNI 468
33.3.3C++的函數原型 471
33.3.4C++調用Java 472
33.4Java調用C++ 473
33.5在C++程序中使用Java 474
33.6在Cocos2d-x中實現Java和C++的互調 479
33.6.1Cocos2d-x的JNI初始化 480
33.6.2在Cocos2d-x中調用Java 480
33.6.3在Java中調用Cocos2d-x 481
33.7Android.mk和Application.mk詳解 481
33.7.1認識Android.mk 481
33.7.2用Android.mk添加源文件以及指定頭文件目錄 482
33.7.3在Android.mk中引用其他模塊(第三方庫) 482
33.7.4Android.mk的一些變量和函數 484
33.7.5關于Application.mk 484
33.8ABI詳解 485
33.8.1常見的ABI 485
33.8.2如何選擇ABI 485
33.8.3如何生成對應ABI的so 486
33.9調試JNI代碼 486
33.9.1AndroidStudioJNI調試環境搭建 487
33.9.2AndroidStudio的斷點調試 490
第34章iOS環境搭建與真機調試 492
34.1iOS環境搭建 492
34.1.1環境搭建 492
34.1.2Windows移植iOS 493
34.2iOS證書 494
34.2.1Mac的證書 495
34.2.2注冊開發者 495
34.2.3如何獲得證書 495
34.2.4創建證書 496
34.2.5關于證書密鑰 498
34.3iOS真機調試 500
34.3.1無證書調試 500
34.3.2使用證書調試 502
34.4打包IPA 505
34.4.1正確設置簽名證書與授權文件 505
34.4.2使用Xcode打包 506
34.4.3其他打包方式 509
第35章Objective-C與C++互調 511
35.1Objective-C基礎語法 511
35.1.1Objective-C的一些特性 511
35.1.2Objective-C的類 512
35.2Objective-C與C++混編 514
第36章接入AnySDK 515
36.1AnySDK概述 515
36.1.1為什么要接入AnySDK 515
36.1.2AnySDK架構簡介 516
36.1.3AnySDK快速接入指引 517
36.2接入AnySDKAndroid框架 520
36.2.1導入AndroidAnySDKFramework 521
36.2.2初始化AnySDKFramework 522
36.3接入AnySDKiOS框架 526
36.3.1導入AnySDKFramework 527
36.3.2初始化AnySDKFramework 530
36.4登錄流程 531
36.4.1登錄流程簡介 531
36.4.2客戶端接入登錄 532
36.4.3服務端接入登錄 534
36.5支付流程 536
36.5.1支付流程 536
36.5.2客戶端接入支付 537
36.5.3服務端接入支付 539
36.6母包聯調 540
36.6.1調試登錄 540
36.6.2調試支付 541
36.7打包工具 542
36.8小結 543