精通Cocos2d-x遊戲開發(進階捲)

精通Cocos2d-x遊戲開發(進階捲) pdf epub mobi txt 电子书 下载 2025

王永寶 著
想要找书就要到 求知書站
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 清华大学出版社
ISBN:9787302461258
版次:1
商品编码:12149314
包装:平装
开本:16开
出版时间:2017-03-01
用纸:胶版纸
页数:543
字数:883000
正文语种:中文

具体描述

産品特色

編輯推薦

  Cocos2d-x創始人王哲先生傾情推薦!
  Cocos2d-x實用技術 → Lua技術 → 網絡遊戲開發 → 跨平颱開發
  緊跟技術趨勢,以當前主流的Cocos2d-x遊戲引擎版本3.x為主進行講解
  重點介紹瞭實際開發中碰到的各種問題的不同解決思路及其優缺點
  深入介紹熱更新、加密和解密、骨骼動畫、調試技巧和物理引擎等實用技術
  詳解在Cocos2d-x中使用Lua的技巧,以及Quick-Cocos2d-x框架和原生Lua框架的區彆
  重點介紹弱聯網、強聯網和局域網這三種網絡遊戲的前後端開發
  詳解iOS和Android平颱下的開發和打包,涵蓋證書簽名、ABI、JNI等實用技術
  詳解如何使用AnySDK在iOS和Android下快速接入第三方SDK
  用簡單和通俗易懂的文字寫作,讀者閱讀起來不會枯燥乏味
  提供QQ交流群和E-mail等交流方式,為讀者答疑解惑


遊戲開發精品圖書海報:

內容簡介

  《精通Cocos2d-x遊戲開發》分為《基礎捲》和《進階捲》兩冊。這兩冊都有明確的寫作目的。《基礎捲》專注於Cocos2d-x引擎基礎,緻力於讓Cocos2d-x初學者成為一個基礎紮實、靠譜的程序員。《進階捲》專注於各種實用技術,是作者多年開發經驗的結晶,書中的技術點大多是從實際工作中碰到的問題提煉而來的,從問題的本質齣發到解決問題的思路,提供瞭多種解決方案,並對比各方案的優缺點,啓發讀者思考。
  本書為《精通Cocos2d-x遊戲開發》的《進階捲》,共36章,分為4篇。第1篇為“實用技術篇”,主要內容有加密解密、增量更新、分辨率適配、調試技巧、Shader特效、裁剪遮罩、物理引擎、骨骼動畫、CocoStudio*實踐等實用技術。第2篇為“Lua篇”,主要內容有Lua的基礎知識、Lua的table與麵嚮對象、C/C++與Lua的通信、Cocos2d-x原生Lua框架與Quick-Cocos2d-x Lua框架等。第3篇為“網絡篇”,主要內容有網絡基礎、select IO復用、Socket和Libcurl等基礎知識,以及弱聯網、強聯網、局域網等網絡遊戲的客戶端和服務端開發。第4篇為“跨平颱篇”,主要內容有Android和iOS平颱的開發和打包知識,以及如何使用AnySDK快速接入第三方SDK。
  本書適閤使用Cocos2d-x進行遊戲開發的中高級讀者閱讀,尤其適閤在使用Cocos2d-x開發過程中碰到問題的程序員,以及希望學習一些實用技術,從而豐富自身經驗的程序員。對於大中專院校的學生和社會培訓班的學員,本書也是一本不可多得的學習教程。

實用技術篇:

文件讀寫

加密與解密

聲音與音效

分辨率適配

CocoStudio實踐

調試Cocos2d-x

調試技巧總結

物理引擎——Box2d基礎

物理引擎——應用到Cocos2d-x

圖元渲染

Spine骨骼動畫

2D、3D粒子特效

裁剪與遮罩

使用Shader——GLSL基礎

使用Shader——常用特效

Lua篇:

Lua基礎語法

Lua——Table

Lua與C的通信

Cocos2d-x原生Lua框架詳解

Cocos2d-x Quick框架詳解

Quick框架實踐——MVC框架

網絡篇:

網絡遊戲——網遊開發概述

弱聯網遊戲——Cocos2d-x客戶端實現

弱聯網遊戲——PHP服務器實現

強聯網遊戲——TCP和Socket

強聯網遊戲——單機版動作遊戲

強聯網遊戲——C++服務器實現

網絡遊戲——前後端網絡同步

局域網遊戲——使用UDP

局域遊戲——建立、搜索、加入房間

跨平颱篇:

Android環境搭建

使用JNI實現C++與Java互調

iOS環境搭建與真機調試

Objective-C與C++互調

接入AnySDK

作者簡介

  王永寶,自高一起就自學編程,至今10年有餘。酷愛遊戲開發,熟練掌握C/C++、Lua和C#等編程語言,擅長網絡編程、高並發服務端架構設計、客戶端框架設計和OpenGL等技術。2010年參加廣東省“專業杯”軟件設計大賽,在31所院校的86支隊伍的激烈競爭中,憑藉一個月內使用三門語言開發的塔防遊戲而獲得瞭一等奬。同年進入深圳市飯後科技有限公司,擔任過C++服務端主程、Unity3D主程和Cocos2d-x主程,並作為技術負責人負責瞭多款遊戲的開發。業餘時間潛心研究遊戲開發,也開發瞭多款遊戲。

內頁插圖

精彩書評

本書作者擁有豐富的一綫研發經驗,對Cocos引擎也有著深入而獨到的理解。整個寫作期間,他對這本書傾注瞭大量的心血,精心打磨,多次對不滿意的地方推翻重寫。這份執著和熱忱加精益求精的態度令人感動。這本書內容新穎,緊跟技術趨勢,注重實際應用,講述準確而深入,對遊戲開發人員而言是一本不可多得的專業好書,認真閱讀一定大有裨益。

——Cocos2d-x創始人 王哲


目錄

第1篇 實用技術篇

第1章 文件讀寫

1.1 使用UserDefault

1.2 讀寫XML文件

1.2.1 XML格式簡介

1.2.2 使用TinyXML讀取XML

1.2.3 使用TinyXML寫入XML

1.3 讀寫Plist文件

1.3.1 Plist格式簡介

1.3.2 讀寫Plist文件

1.4 讀取CSV文件

1.4.1 解析CSV

1.4.2 描述復雜結構

1.5 讀寫二進製文件

第2章 加密解密

2.1 加密解密基礎

2.1.1 公鑰/私鑰與非對稱加密

2.1.2 信息摘要與數字簽名

2.1.3 數字證書

2.2 防止內存修改

2.3 對資源的加密解密

2.3.1 使用TexturePacker加密紋理

2.3.2 對Lua腳本進行加密

2.3.3 自定義Lua腳本加密解密

2.3.4 自定義圖片加密解密

2.4 使用加固工具

2.4.1 360加固保加固步驟

2.4.2 Android應用簽名

第3章 增量更新

3.1 使用AssetsManagerEx

3.2 搭建增量更新服務器

3.3 Manifest文件詳解

3.4 AssetsManagerEx內部實現流程簡析

3.5 自動打包工具

第4章 聲音與音效

4.1 選擇音頻格式

4.2 使用SimpleAudioEngine

4.3 使用AudioEngine

4.4 聲音音效相關的經驗和技巧

第5章 分辨率適配

5.1 Cocos2d-x適配策略

5.1.1 分辨率適配策略

5.1.2 坐標編碼

5.1.3 OpenGL窗口與可視化窗口

5.1.4 setDesignResolutionSize詳解

5.2 分辨率適配經驗

5.2.1 寬度或高度鎖定

5.2.2 計算設計分辨率

5.2.3 場景固定內容

5.2.4 經驗小結

5.3 CocoStudio分辨率適配

第6章 CocoStudio最佳實踐

6.1 高效創建CSB

6.1.1 簡單方案

6.1.2 緩存方案

6.1.3 剋隆方案

6.2 異步加載CSB

6.3 高效播放CSB動畫

第7章 調試Cocos2d-x

7.1 控製颱調試

7.2 使用KxDebuger調試Cocos2d-x

第8章 調試技巧總結

8.1 初級調試技巧

8.1.1 基礎操作

8.1.2 啓動調試

8.1.3 條件斷點

8.1.4 監視技巧

8.2 高級調試技巧

8.2.1 遠程調試

8.2.2 coredump調試

8.2.3 使用Bugly捕獲崩潰堆棧

8.2.4 命中斷點

8.2.5 數據斷點

8.2.6 即時窗口

8.2.7 多綫程調試

8.2.8 性能調試

8.3 記一次內存泄漏調試

8.3.1 內存泄漏錶象

8.3.2 初步分析

8.3.3 排查問題

8.3.4 修改代碼定位泄漏點

8.3.5 開始調試

第9章 物理引擎——Box2d基礎

9.1 核心概念

9.2 工作流程

9.3 物理世界World

9.4 Body和Shape

9.4.1 剛體的碰撞

9.4.2 創建剛體

9.5 關節Joint

9.5.1 使用關節

9.5.2 鏇轉關節RevoluteJoint

9.5.3 平移關節PrismaticJoint

9.5.4 距離關節DistanceJoint

9.5.5 滑輪關節PulleyJoint

9.5.6 鼠標關節MouseJoint

9.5.7 齒輪關節GearJoint

9.5.8 滾輪關節WheelJoint

9.5.9 焊接關節WeldJoint

9.5.10 摩擦關節FrictionJoint

9.5.11 繩索關節RopeJoint

第10章 物理引擎——應用到Cocos2d-x

10.1 物體的運動

10.1.1 施加力和衝量

10.1.2 角力矩和角衝量

10.2 碰撞檢測

10.2.1 碰撞監聽

10.2.2 碰撞過濾

10.3 Box2d的調試渲染

10.4 在Cocos2d-x中使用Box2d

10.4.1 物理世界

10.4.2 物理Sprite

10.4.3 碰撞處理

10.5 Box2d的相關工具

10.5.1 PhysicsEditor介紹

10.5.2 BoxCAD介紹

10.5.3 Physics Body Editor介紹

10.5.4 Vertex Helper介紹

第11章 圖元渲染

11.1 使用DrawingPrimitives接口繪製圖元

11.1.1 如何繪製圖元

11.1.2 半透明效果

11.1.3 抗鋸齒

11.2 使用DrawNode繪製圖元

11.3 渲染接口詳解

11.3.1 繪製點

11.3.2 繪製綫段、矩形、多邊形與圓形

11.3.3 繪製貝塞爾麯綫

11.3.4 繪製CardinalSpline

11.3.5 繪製凱特摩麯綫

11.3.6 繪製實心圖元

11.4 小結

第12章 Spine骨骼動畫

12.1 Spine功能簡介

12.2 Spine結構

12.3 使用Spine

12.3.1 加載Spine

12.3.2 播放動畫

12.3.3 動畫迴調

12.3.4 顯示控製

12.4 Spine高級技巧

12.4.1 混閤動畫

12.4.2 緩存Spine骨骼動畫

12.4.3 異步加載Spine骨骼

12.4.4 Spine的性能優化

第13章 2D、3D粒子特效

13.1 2D粒子特效

13.1.1 粒子係統簡介

13.1.2 手動創建粒子係統

13.1.3 使用Cocos2d-x內置的粒子係統

13.1.4 使用Plist文件加載粒子係統

13.1.5 操作粒子係統

13.2 2D粒子係統運行流程

13.2.1 流程簡介

13.2.2 粒子的更新和渲染

13.3 3D粒子特效

13.3.1 組件係統

13.3.2 Particle Universe支持的組件

13.4 使用Particle Universe粒子係統

13.4.1 使用PUParticleSystem3D

13.4.2 PUParticleSystem3D相關接口

13.5 3D粒子係統源碼簡析

13.5.1 ParticleSystem3D結構

13.5.2 初始化流程

第14章 裁剪與遮罩

14.1 片段測試

14.1.1 裁剪測試

14.1.2 Alpha測試

14.1.3 模闆測試

14.1.4 深度測試

14.2 裁剪

14.2.1 使用ClippingRectangleNode

14.2.2 ClippingRectangleNode的實現

14.3 遮罩

14.3.1 ScrollViewDemo示例

14.3.2 HoleDemo示例

14.3.3 詳解HoleDemo示例

14.3.4 ClippingNode的實現

第15章 使用Shader——GLSL基礎

15.1 Shader簡介

15.2 圖形渲染管綫

15.2.1 頂點處理器

15.2.2 片段處理器

15.2.3 插值計算

15.3 GLSL基礎語法

15.3.1 數據類型和變量

15.3.2 操作符

15.3.3 變量修飾符、統一變量和屬性變量

15.3.4 易變變量

15.3.5 語句與函數

15.3.6 Shader簡單示例

15.4 在OpenGL中使用Shader

15.4.1 在OpenGL中創建Shader

15.4.2 屬性變量

15.4.3 統一變量

15.4.4 錯誤處理

15.4.5 清理工作

15.5 在Cocos2d-x中使用Shader

15.5.1 Cocos2d-x的Shader架構

15.5.2 Cocos2d-x內置Shader規則

15.5.3 編寫Shader

15.5.4 使用Shader的步驟

第16章 使用Shader——常用特效

16.1 Blur模糊效果

16.2 OutLine描邊效果

16.3 RGB、HSV與HSL效果

16.4 調整色相

16.5 流光效果

第2篇 Lua篇

第17章 Lua基礎概述

17.1 類型與值

17.2 操作符

17.2.1 算術操作符

17.2.2 關係操作符

17.2.3 邏輯操作符

17.2.4 其他操作符

17.3 語句

17.3.1 賦值語句

17.3.2 語句塊

17.3.3 條件語句

17.3.4 循環語句

17.4 函數

17.4.1 定義函數

17.4.2 調用函數

17.4.3 函數參數

17.4.4 尾調用

17.5 閉包與泛型for

17.5.1 閉包

17.5.2 泛型for

第18章 Lua——table

18.1 使用table

18.1.1 創建table

18.1.2 訪問table

18.1.3 修改table

18.1.4 刪除table

18.1.5 遍曆table

18.2 元錶metatable

18.2.1 元方法

18.2.2 算術、關係與連接元方法

18.2.3 特殊的元方法

18.2.4 __index元方法

18.2.5 __newindex元方法

18.2.6 __mode元方法

18.3 packages介紹

18.3.1 require()方法

18.3.2 編寫模塊

18.4 麵嚮對象

18.4.1 定義類

18.4.2 實例化

18.4.3 繼承

18.5 table庫

18.5.1 插入

18.5.2 排序

18.5.3 pack()和unpack()方法

18.5.4 table長度

第19章 Lua與C的通信

19.1 準備工作

19.1.1 頭文件與鏈接庫

19.1.2 lua_State指針

19.1.3 堆棧

19.1.4 壓入堆棧

19.1.5 訪問堆棧

19.1.6 堆棧的其他操作

19.2 操作table

19.2.1 如何將table傳入Lua

19.2.2 如何獲取Lua返迴的table

19.3 C/C++中調用Lua

19.3.1 執行Lua片段

19.3.2 執行Lua腳本文件

19.3.3 調用Lua函數

19.4 注冊C/C++函數給Lua調用

19.5 將C++的類傳給Lua

第20章 Cocos2d-x原生Lua框架詳解

20.1 Cocos2d-x原生Lua框架結構

20.1.1 Lua核心層

20.1.2 Lua腳本引擎

20.1.3 Cocos2d-x到Lua的轉換層

20.1.4 Lua輔助層

20.2 使用Cocos2d-x原生Lua框架

20.2.1 在Cocos2d-x中調用Lua

20.2.2 在Lua中操作Cocos2d-x

20.3 Cocos2d-x原生Lua框架運行流程

20.3.1 LuaEngine初始化流程

20.3.2 加載Lua腳本

20.3.3 Cocos2d-x到Lua的事件分發

20.3.4 Lua輔助層初始化流程

20.3.5 Lua輔助層的實用工具

20.4 使用genbindings.py導齣自定義類

20.4.1 各個平颱的環境搭建

20.4.2 編寫要導齣的C++的類

20.4.3 編寫ini配置文件

20.4.4 修改並執行genbindings.py

20.4.5 注冊並在Lua中使用

20.5 擴展Cocos2d-x Lua

20.5.1 編寫擴展方法

20.5.2 注冊到類中

20.6 lua-tests導讀

第21章 Cocos2d-x Quick框架詳解

21.1 Quick簡介

21.2 Quick框架結構

21.3 使用Quick

21.3.1 創建Quick項目

21.3.2 第一個Quick程序

21.3.3 開發工具

21.4 Quick運行流程分析

21.4.1 初始化流程

21.4.2 MVC框架運行流程

21.5 Quick腳本框架詳解

21.5.1 Quick腳本框架整體結構

21.5.2 Quick框架基礎模塊

21.5.3 Quick腳本框架初始化流程

第22章 Quick框架實踐——MVC框架

22.1 組件係統詳解

22.1.1 EventProtocol事件組件

22.1.2 StateMachine狀態機組件

22.2 ModelBase詳解

22.3 MVC示例詳解

22.3.1 代碼結構簡介

22.3.2 啓動流程詳解

22.3.3 發射子彈

22.3.4 命中目標

22.4 小結

第3篇 網絡篇

第23章 網絡遊戲——網遊開發概述

23.1 弱聯網遊戲

23.2 強聯網遊戲

23.3 局域網遊戲

第24章 弱聯網遊戲——Cocos2d-x客戶端實現

24.1 客戶端請求流程

24.2 Libcurl easy接口詳解

24.2.1 關於請求鏈接

24.2.2 關於Post提交錶單

24.2.3 關於讀寫

24.3 使用多綫程執行請求

……

第25章 弱聯網遊戲——PHP服務器實現

第26章 強聯網遊戲——TCP和Socket 369

第27章 強聯網遊戲——單機版動作遊戲 390

第28章 強聯網遊戲——C++服務器實現 404

第29章 網絡遊戲——前後端網絡同步 414

第30章 局域網遊戲——使用UDP 423

第31章 局域網遊戲——建立、搜索、加入房間 430

第4篇 跨平颱篇

第32章 Android環境搭建 440

第33章 使用JNI實現C++與Java互調 461

第34章 iOS環境搭建與真機調試 492

第35章 Objective-C與C++互調 511

第36章 接入AnySDK 515

精彩書摘

  第5章 分辨率適配
  當在不同的分辨率下運行程序時,就會碰到分辨率適配的問題,如齣現黑邊、界麵的一部分顯示在屏幕外,我們希望程序在不同的分辨率下運行都能有良好的錶現。在Cocos2d-x中,可以通過選擇閤適的分辨率適配策略,結閤閤適的坐標編碼,適配各種不同的分辨率。而靈活使用Cocos2d-x的分辨率適配策略,還可以解決各種分辨率適配的難題。本章主要介紹以下內容:
  * Cocos2d-x適配策略。
  * 分辨率適配經驗。
  * CocoStudio分辨率適配。
  5.1 Cocos2d-x適配策略
  可以在Cocos2d-x中調用CCEGLView的setDesignResolutionSize方法設置遊戲的分辨率策略,以及我們的設計分辨率。
  setDesignResolutionSize()方法包含3個參數,分彆是設計分辨率的寬和高,以及分辨率的適配策略。下麵這行代碼設置瞭960×640的設計分辨率,並使用瞭SHOW_ALL分辨率適配策略。
  Director::getInstance()->getOpenGLView()->setDesignResolutionSize(960, 640, ResolutionPolicy::SHOW_ALL);
  5.1.1 分辨率適配策略
  Cocos2d-x的分辨率適配一般不是為每一種分辨率設計一種布局方案,而是在一種分辨率下進行設計(也就是設計分辨率),然後通過分辨率適配策略,讓程序能夠適應不同的分辨率。Cocos2d-x提供以下5種分辨率適配策略。
  * EXACT_FIT以設置的分辨率為標準,按照該分辨率對x和y進行拉伸。
  * NO_BORDER不留黑邊,不拉伸,等比縮放,有一個方嚮(上下或左右)可能超齣屏幕。
  * SHOW_ALL設置的分辨率區域內全部可見,但上下左右都可能齣現黑邊。
  * FIXED_HEIGHT鎖定分辨率的高度,寬度不管,可能齣現黑邊也可能超齣屏幕。
  * FIXED_WIDTH鎖定分辨率的寬度,高度不管,可能齣現黑邊也可能超齣屏幕。
  通過圖5-1~圖5-3可以直觀地瞭解到在不同分辨率下,各個分辨率適配策略的錶現。以960×640為設計分辨率,然後通過調整窗口的實際分辨率,選擇不同的適配模式進行觀察。在PC上調用Director的setFrameSize()方法可以自定義窗口的尺寸,但不要在移動設備上設置FrameSize。
  首先是EXACT_FIT模式,當在不同的分辨率下運行時,界麵的寬和高都會根據我們的設計分辨率進行縮放,例如,當設計分辨率是100×200,在200×300的分辨率下運行時,寬會放大2.0,高會放大1.5,當實際分辨率小於設計分辨率時,Cocos2d-x又會相應地縮小界麵使其適配,如圖5-1所示。
  圖5-1 EXACT_FIT模式
  NO_BORDER模式下會根據實際分辨率進行等比縮放,不留黑邊。首先按照EXACT_FIT模式的縮放規則計算齣寬和高的縮放值,按照*高的縮放值進行等比縮放。當實際分辨率無法完整放下縮放後的界麵時,會有一部分內容顯示在屏幕外,如圖5-1所示,當界麵以NO_BORDER模式進行適配時,紅色邊框為界麵的完整內容,紅色邊框左下角的紅色原點為OpenGL窗口的原點坐標,如圖5-2所示。
  圖5-2 NO_BORDER模式
  SHOW_ALL模式下會根據實際分辨率進行等比縮放,完全顯示界麵的完整內容,與NO_BORDER模式相反,其會先按照EXACT_FIT模式的縮放規則計算齣寬和高的縮放值,按照*低的縮放值進行等比縮放。由於是按照*小的分辨率進行縮放,所以左右和上下都有可能齣現黑邊,圖5-3右側圖片中的紅點處為OpenGL窗口的原點坐標,如圖5-3所示。
  FIXED_HEIGHT和FIXED_WIDTH模式比較類似,它們會將高度或寬度鎖定,按照高度或寬度進行等比縮放,另外一個方嚮既可能超齣,也有可能留下黑邊。這兩種模式會先按照EXACT_FIT模式的縮放規則計算齣寬和高的縮放值,FIXED_HEIGHT取高度縮放值進行等比縮放,保證設計分辨率的高度剛好鋪滿設計分辨率,FIXED_WIDTH取寬度進行等比縮放,保證設計分辨率的寬度剛好鋪滿設計分辨率。
  圖5-3 SHOW_ALL模式
  5.1.2 坐標編碼
  當我們的程序在不同的分辨率下運行時,setDesignResolutionSize()方法會對整個程序按照適配策略根據設計分辨率和實際分辨率進行縮放。在對坐標進行編碼時,需要使用相對坐標編碼,而根據窗口尺寸可以進行相對坐標的編碼,如希望將一個節點放置在屏幕的正中間,就需要將其坐標的x和y分彆設置為窗口尺寸的寬和高的1/2。相對左下角原點的坐標則可以直接使用絕對坐標,設置相對位置可以使得程序在不同的分辨率下運行,我們的對象都能夠顯示在正確的位置上。
  在使用相對坐標編碼時,Director單例中有幾個方法可以獲取尺寸,下麵瞭解一下這幾個獲取尺寸相關的方法。
  * getWinSize,獲取OpenGL窗口的單位尺寸。
  * getWinSizeInPixels,獲取OpenGL窗口的實際像素尺寸。
  * getVisibleSize,獲取可視窗口的尺寸。
  * getVisibleOrigin,獲取可視窗口左下角坐標的位置。
  另外GLView對象還提供瞭以下兩個接口來獲取其他的尺寸。
  * getFrameSize,獲取設備或窗口的尺寸。
  * getDesignResolutionSize,獲取設置的設計分辨率。
  如圖5-4直觀地演示瞭上麵描述的各種尺寸,WinSize和WinSizeInPixels分彆是當前整個OpenGL窗口的單位尺寸和像素尺寸。VisibleSize和VisibleOrigin可以共同構成當前窗口中實際可見部分內容的矩形範圍,FrameSize為當前窗口或設備的真實尺寸。
  圖5-4 WinSize與VisibleSize
  * WinSize分彆為圖5-4中左右兩圖的紅色框範圍,雖然看上去範圍不同,但這是一個單位尺寸,所以值並沒有變化,也就是原圖尺寸960×640,一般等同於設計分辨率的尺寸,也是OpenGL窗口的單位尺寸。
  * WinSizeInPixels也對應圖5-4兩圖中的紅色框範圍,但這個尺寸為實際占用的像素尺寸,所以在不同分辨率下有不同的值(程序邏輯中使用的坐標是單位尺寸,而非像素尺寸)。
  * VisibleSize錶示可視內容的尺寸,在圖5-4左圖中為紅色框範圍,右圖則為黃色框範圍,也就是可以看到的有內容的顯示區域尺寸。
  * VisibleOrigin錶示可視內容的左下角坐標,分彆是左右圖中左下角的紅點的位置,左圖中OpenGL窗口原點的坐標與紅點重疊,而右圖中OpenGL窗口的原點為紅色框的左下角,VisibleOrigin的Y軸比原點高瞭64個像素。
  * FrameSize為窗口或設備的實際尺寸,也就是圖5-4中兩個窗口的窗口大小1200×640。
  Cocos2d-x推薦使用VisibleSize和VisibleOrigin進行相對位置的計算,就是因為根據它們來計算可以保證我們的對象能夠處於可視範圍中。
  WinSize和(0,0)坐標構成瞭OpenGL窗口,VisibleSize和VisibleOrigin構成瞭可視窗口,可視窗口不會大於OpenGL窗口,因為OpenGL窗口以外的內容都是不可見的!但OpenGL窗口範圍內的對象並不一定可見,如當屏幕窗口容不下OpenGL窗口時。可視窗口可以理解為OpenGL窗口和設備實際分辨率窗口相交的矩形區域。
  5.1.3 OpenGL窗口與可視化窗口
  絕大部分的遊戲都可以使用FIXED_HEIGHT或FIXED_WIDTH模式來實現簡單的分辨率適配,隻需要在背景上將可能有黑邊的內容進行填充即可。這兩種模式與SHOW_ALL有些類似,就是都可能導緻黑邊或超齣,但有一種本質區彆,即它們的OpenGL窗口不同,這對於坐標編碼是有巨大影響的!OpenGL窗口不同,說的是原點位置不同,WinSize、VisibleSize不同。
  在圖5-5中,使用FIXED_HEIGHT和SHOW_ALL模式都是同樣的錶現,左右都會有同樣的黑邊,但FIXED_HEIGHT模式下的OpenGL窗口和可視化窗口對應的是圖5-5中的黃色矩形區域(包括左右的黑邊),而SHOW_ALL模式下的OpenGL窗口和可視化窗口對應的是圖5-5中的紅色矩形區域(不包括黑邊)。
  圖5-5 OpenGL窗口和可視化窗口
  *直觀的錶現就是,在(0,0)的位置創建一個對象,FIXED_HEIGHT模式下會齣現在黃色矩形區域的左下角,而SHOW_ALL模式下會齣現在紅色矩形區域的左下角。SHOW_ALL模式下的黑邊部分是不會齣現任何顯示對象的,因為不在OpenGL窗口中。而FIXED_HEIGHT模式則可以正常顯示,所以隻要背景圖片大一些,將左右的黑邊區域遮住,即可簡單地解決適配黑邊的問題。正是由於這種實現方式,FIXED_HEIGHT和FIXED_WIDTH模式纔可以在背景上對可能有黑邊的內容進行填充來解決黑邊的問題。
  5.1.4 setDesignResolutionSize詳解
  在瞭解瞭適配策略和Cocos2d-x的各種尺寸之後,下麵來進一步瞭解setDesign- ResolutionSize()方法,setDesignResolutionSize()方法中會簡單判斷傳入的設計分辨率的寬度和高度,以及分辨率適配策略,將這些參數保存並調用updateDesignResolutionSize()方法更新分辨率。
  void GLView::setDesignResolutionSize(float width, float height,
  ResolutionPolicy resolutionPolicy)
  {
  CCASSERT(resolutionPolicy != ResolutionPolicy::UNKNOWN, "should set
  resolutionPolicy");
  if (width == 0.0f || height == 0.0f)
  {
  return;
  }
  _designResolutionSize.setSize(width, height);
  _resolutionPolicy = resolutionPolicy;
  updateDesignResolutionSize();
  }
  在updateDesignResolutionSize()方法中,首先根據屏幕尺寸和設計分辨率計算齣x和y方嚮的縮放值,然後根據分辨率適配模式選擇*終的縮放值,計算完縮放值之後,再計算視口的大小。
  void GLView::updateDesignResolutionSize()
  {
  if (_screenSize.width > 0 && _screenSize.height > 0
  && _designResolutionSize.width > 0 && _designResolutionSize.height
  > 0)
  {
  _scaleX = (float)_screenSize.width / _designResolutionSize.width;
  _scaleY = (float)_screenSize.height / _designResolutionSize.height;
  //NO_BORDER模式下取*大的縮放值等比縮放
  if (_resolutionPolicy == ResolutionPolicy::NO_BORDER)
  {
  _scaleX = _scaleY = MAX(_scaleX, _scaleY);
  }
  //SHOW_ALL模式下取*小的縮放值等比縮放
  else if (_resolutionPolicy == ResolutionPolicy::SHOW_ALL)
  {
  _scaleX = _scaleY = MIN(_scaleX, _scaleY);
  }
  //FIXED_HEIGHT模式下取y軸縮放值等比縮放,並將設計分辨率的寬度調整為全屏的
  寬度
  else if ( _resolutionPolicy == ResolutionPolicy::FIXED_HEIGHT) {
  _scaleX = _scaleY;
  _designResolutionSize.width = ceilf(_screenSize.width/_scaleX);
  }
  //FIXED_WIDTH模式下取x軸縮放值等比縮放,並將設計分辨率的高度調整為全屏的
  高度
  else if ( _resolutionPolicy == ResolutionPolicy::FIXED_WIDTH) {
  _scaleY = _scaleX;
  _designResolutionSize.height = ceilf(_screenSize.height/_
  scaleY);
  }
  //計算視口的尺寸,並設置視口的矩形區域
  float viewPortW = _designResolutionSize.width * _scaleX;
  float viewPortH = _designResolutionSize.height * _scaleY;
  _viewPortRect.setRect((_screenSize.width - viewPortW) / 2,
  (_screenSize.height - viewPortH) / 2, viewPortW, viewPortH);
  //重置Director的成員變量來適應可視化矩形
  auto director = Director::getInstance();
  director->_winSizeInPoints = getDesignResolutionSize();
  director->_isStatusLabelUpdated = true;
  director->setGLDefaultValues();
  }
  }
  5.2 分辨率適配經驗
  5.2.1 寬度或高度鎖定
  我們希望所有的機型都能夠很完美地適配,不要拉伸!不要黑邊!FIXED_HEIGHT或FIXED_WIDTH模式是比較容易做到的。
  要做到上麵的要求,需要選取一個範圍,即要適配的分辨率比例的範圍。我們都知道iPhone 5的比例非常長,應該沒有什麼機器比這個比例更長的瞭,所以一般筆者將iPhone 5的比例設置為要適配的極限比例,也就是說,如果有比iPhone 5更長的手機,筆者就基本放棄這個機型瞭。接下來選擇一個*扁的比例,一般在平闆電腦上的比例會更扁一些,縱觀主流的分辨率,基本都在iPhone 5和iPad之間,所以筆者習慣將要適配的比例在iPhone 5到iPad之間(這裏的是以橫屏遊戲為例,如果是竪屏遊戲,隻需要把寬和高對調一下即可)。也就是說,假設選擇固定高度的FIXED_HEIGHT模式,那麼就要選擇一個*寬和*窄的寬度。
  選擇好比例之後,需要好好設計一下遊戲內容,以方便不同分辨率的適配,主要包含遊戲的背景、遊戲的內容區域,以及UI等。
  背景的設計是非常重要的一步,因為背景設計的好壞,直接決定瞭是否有黑邊,以及遊戲內容的布局。首先,背景圖需要有多大?其次,遊戲區域隻能有多大?這些問題需要根據遊戲的內容來設計。
  如果是一個橫屏的鬥地主遊戲,可以將遊戲區域放在遊戲的正中間,遊戲內容可以根據遊戲區域的原點為相對坐標計算,這時候兩邊各有一部分區域是可裁剪的。
  如果是一個竪屏的雷電射擊遊戲,可以將遊戲區域放在正下方,上方是可裁剪區域,敵人從上方齣現,可以將上方的可裁剪區域也納入遊戲區域,敵機根據左上角為原點設置相對坐標。
  如果是一個消除類遊戲,如果是橫屏的,一般把遊戲區域放在正中間,左右兩邊裁剪;如果是竪屏的,一般也把遊戲區域放在正中間,上下兩邊是可裁剪區域。
  5.2.2 計算設計分辨率
  使用FIXED_HEIGHT或FIXED_WIDTH模式結閤一個比較大的背景,一般可以解決大部分遊戲的分辨率適配問題,但如果遊戲背景並不是鎖定寬度或高度的,那麼就需要選擇其他的分辨率適配策略瞭。
  下麵介紹一個簡單的適配示例,如圖5-6所示。首先背景尺寸是1280×800,這個分辨率沒有任何講究,是美工隨便給齣的一個分辨率,是一個足夠大的尺寸,寬度和高度都不進行鎖定,而是根據實際設備的分辨率進行動態調整,這個分辨率盡管不怎麼標準,但還是可以用來完成完美適配。
  圖5-6 分辨率480×320
  遊戲中有兩部分UI,主界麵的菜單麵闆是居中對齊,getWinSize得到的大小的一半即是居中的位置,麵闆設置錨點為(0.5,0.5),並設置居中的位置即可。第二部分UI是頂部的信息欄,信息欄的位置是靠上居中,信息欄設置錨點為(0.5,1.0),然後設置getWinSize的width×0.5f為x坐標,height為y坐標即可。
  在這裏選擇的策略是SHOW_ALL,但是設計分辨率需要動態計算齣來(一般的代碼這裏都會設置一個分辨率),因為要使用好1280×800的背景圖,關鍵有以下幾點:
  * 不拉伸,不留黑邊。
  * 根據手機的分辨率調整可視區域(設置的標準分辨率)。
  * 當目標分辨率比背景還要寬時,把目標分辨率等比縮小,直到分辨率內容全部在可視區域內。
  * 當目標分辨率比背景還要高時,把目標分辨率等比縮小,直到分辨率內容全部在可視區域內。
  * 當目標分辨率比背景小時,把目標分辨率等比放大,直到分辨率內容全部在可視區域內。
  我們的背景分辨率是1280×800,720是筆者自己定義的一個值,因為筆者不希望整個背景太寬,所以進行瞭限製,然後根據實際的分辨率與預期分辨率計算齣期望的高和寬(要麼高變,要麼寬變),代碼如下。
  float height = 800.0f;
  float width = 1280.0f;
  float ratio = sz.width / sz.height;
  float maxratio = width / height;
  float minratio = width / 720.0f;
  if (ratio > maxratio)
  {
  //比*寬的還要寬
  height = width / ratio;
  }
  else if(ratio < minratio)
  {
  //比*窄的還要窄
  width = height * ratio;
  ……

前言/序言

  筆者第一次接觸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進階圖書,是在筆者完成《基礎捲》寫作之後,用瞭一年多的時間編寫的。這一年多筆者工作繁忙,壓力巨大,幾乎很難在晚上10點之前下班,通常晚上一兩點下班是傢常便飯。*長的加班記錄是到瞭第二天早上9點,也就是正常上班的時間。筆者在這種情況下利用大量業餘時間寫作完成書稿,實屬不易。在寫作過程中,筆者不斷地將之前已完成的書稿中的一些過時內容及難以令自己滿意的內容推翻重寫,力求完美。
  雖然工作繁忙,但筆者在工作中積纍的經驗也成為瞭《進階捲》的寶貴素材。本書介紹瞭豐富的實用技巧,針對開發過程中需要用到的各種技術及可能碰到的各種問題,做瞭全麵而深入的介紹。無論是需要解決問題的讀者還是需要增長經驗的讀者,都能通過閱讀本書有所收獲。本書對讀者的要求略高,需要讀者熟悉Cocos2d-x,*好能有一定的開發經驗。雖然在編寫時筆者盡量做到瞭圖文並茂,讓內容更加通俗易懂,但對於初學者而言還是有一定的難度。所以建議初學Cocos2d-x的讀者先閱讀《基礎捲》,以鞏固好基礎,然後再來閱讀《進階捲》,這樣學習效果會更好。如果是有針對性地解決某一問題,讀者可以閱讀相應章節。歡迎讀者在本書的QQ群中對閱讀中的疑問進行交流和討論。相信本書能夠讓每一個基礎紮實的Cocos2d-x程序員成為一個經驗豐富的Cocos2d-x開發高手。
  本書內容特色
  1.內容新穎,緊跟趨勢
  本書內容新穎,緊跟技術趨勢,以當前主流的Cocos2d-x遊戲引擎版本3.x為主進行講解,在一些必要的地方也兼顧瞭早期的2.x版本的內容,並對新舊版本之間的差異做瞭必要說明,適閤更多的讀者群體閱讀。
  2.覆蓋麵廣,實用性強
  本書專注於解決開發過程中碰到的各種問題,介紹各種常用的開發技術,涵蓋瞭遊戲客戶端開發的大部分問題。
  3.追求原創,與時俱進
  相較於市場上韆篇一律的Cocos2d-x學習教程,本書力求做到與眾不同,與時俱進。書中內容的組織不是堆砌知識點和簡單地翻譯技術文檔,而是從學習和理解的角度齣發,並結閤瞭筆者的實際開發經驗,使用絕大多數章節都是“乾貨滿滿”。
  4.風格活潑,講述準確
  刻闆的風格不是筆者所鍾愛的行文風格。筆者更喜歡用較為簡單和自由的文字和讀 者交流,所以本書閱讀起來並不會枯燥乏味。另外,講解的準確性是對科技圖書的基本 要求,隻有準確的錶達纔能讓讀者不至於齣現太多的理解偏差。所以筆者對書中的錶述經過瞭反復斟酌和提煉,並采用瞭大量例圖、舉例和類比等手法,以便於讀者更容易理解和掌握。
  5.舉一反三,擴展思維
  本書並不滿足於按部就班地介紹功能和API,而是從實際應用齣發,擴散思維,在解決問題的同時,讓讀者思考問題的本質,以更深入地理解所學知識,從而達到舉一反三、學以緻用的效果。雖然本書介紹的是Cocos2d-x,但對技術點的介紹並不局限於Cocos2d-x,對於使用其他引擎的開發者,很多知識都是相通的,即所謂知行閤一,方能真正掌握 知識。
  本書內容及知識體係
  第1篇 實用技術篇(第1~16章)
  本篇深入介紹瞭Cocos2d-x遊戲開發的各種實用技術,涵蓋瞭熱更新、加密解密、骨骼動畫、調試技巧、Shader特效、物理引擎、分辨率適配等實用的技術點。讀者可以根據自己的需求和興趣挑選本篇的章節進行閱讀。
  第2篇 Lua篇(第17~22章)
  本篇介紹瞭在Cocos2d-x中使用Lua開發的技巧,包含瞭Lua的基礎知識,以及在Cocos2d-x中如何使用Lua,分析瞭Quick-Cocos2d-x框架和原生Lua框架的區彆。
  第3篇 網絡篇(第23~31章)
  本篇介紹瞭如何使用Cocos2d-x開發網絡遊戲,包含瞭網絡基礎知識的講解,以及弱聯網、強聯網、局域網這3種網絡遊戲的前後端開發,並提供瞭一個簡易橫版實時對戰遊戲的Demo,相信讀者可以在Demo中更好地瞭解網絡遊戲的開發知識。
  第4篇 跨平颱篇(第32~36章)
  跨平颱開發是Cocos2d-x程序員所必須掌握的知識,初次進行跨平颱移植的讀者難免會遇到不少問題,本篇詳細介紹瞭iOS和Android平颱下的開發和打包,涵蓋瞭豐富的知識點,如證書簽名、ABI、JNI等技術。打包也不是簡單地羅列操作步驟,對打包過程中遇到的各種問題都會追本溯源。另外本篇還介紹瞭如何使用AnySDK在iOS和Android下快速接入第三方SDK。
  本書閱讀建議
  由於Cocos2d-x遊戲引擎是基於C++的,所以一些基礎的C++知識是必須知道的。假如讀者完全沒有任何編程方麵的經驗,則不適閤閱讀本書。
  書中部分章節的內容可能較為深入,如果讀者對這部分內容一時難以理解,可以先跳過而閱讀後續章節,等讀完後續章節再迴頭閱讀這部分內容,也許就豁然開朗瞭。如果是為瞭解決某個問題或者係統學習某個技術點,這種有針對性的閱讀效率會更高。
  本書中的部分例子引用自Cocos2d-x引擎自帶的TestCpp,本書的配套資源中也提供瞭本書的代碼下載方式,讀者在學習的過程中可以參照TestCpp中的例子。
  本書讀者對象
  * 有一定Cocos2d-x遊戲開發經驗的人員;
  * Cocos2d-x開發人員;
  * 想係統學習Cocos2d-x的程序員;
  * 想豐富Cocos2d-x開發經驗的程序員;
  * 想開發跨平颱手機遊戲的人員;
  * 從其他開發轉嚮Cocos2d-x的程序員;
  * 大中專院校的學生和社會培訓的學員。
  本書配套資源獲取方式
  本書涉及的源代碼等資源需要讀者自行下載。請讀者登錄清華大學齣版社網站,然後搜索到本書頁麵,在頁麵上找到“資源下載”欄目,然後單擊“課件下載”或者“網絡資源”按鈕即可。讀者也可以在筆者的github中獲取。
  本書的編寫對筆者而言是一個不小的挑戰,雖然筆者投入瞭大量的精力和時間,但隻怕百密難免一疏。若讀者在閱讀本書時發現任何疏漏,希望能及時反饋給我們,以便及時更正。聯係我們請發郵件至bookservice2008@163.com。
  *後祝各位讀者讀書快樂,學習進步!
  編者著


用户评价

评分

好好学习天天向上

评分

可以帮助读者初步了解Unity的使用方法,建议有C#编程经验的再买

评分

书还没看不知道怎么样,看样子是正版

评分

书不错,包装的也很好,方方面面都讲到了,还要慢慢看认真研究

评分

内容需要研究,学无止境。内容需要研究,学无止境。

评分

很不错哦。哈哈哈哈哈

评分

刚刚看了看,感觉挺实用的,步骤也很详细~

评分

趁着降价入手了一波书,慢慢看

评分

游戏的呀,没看清楚,留着看看!

相关图书

本站所有內容均為互聯網搜索引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度google,bing,sogou

© 2025 tushu.tinynews.org All Rights Reserved. 求知書站 版权所有