⑴ cocos物理引擎碰撞難不難
難。
1、在cocos游戲開發的過程中,物理引擎碰撞物體檢測處理極其重要,所以對其細節的要求極其高。
2、當有碰撞發生的時候,遍歷剛體所在的節點所掛的所有的組件要求百分之百的正確。
⑵ CocosCreator初體驗
機緣巧合,最近接到關於游戲的需求,前後調研了一下Unity3D和CocosCreator,但是考慮到是作為項目的一部分而使用,並且局限於Unity3D的使用條款,為了避免法律問題,最後選擇的是使用CocosCreator來實現。第一次接觸Unity3D和CocosCreator這類的游戲引擎,大約用了一個月的時間,從學習到項目大部分完成,之後要打包成靜態庫供其他客戶端的同事們使用。學習途徑主要是CocosCreator官網文檔和官方Demo(看中文的文檔就是爽!!!)。本片文章的目的主要是記錄一下過程中遇到的問題及解決方案,並不是完整的教程。
本次要做的是一個最簡單的跑酷類游戲,無需使用Tiled(地圖編輯器),spine(骨骼動畫編輯器)。也是做了這個小游戲才發現游戲其實已經發展的很成熟了。
我們可以看到,元素很簡單,背景主要有遠景、中景,通過設置不同的速度來實現現實中跑動的效果。主要的邏輯實現部分是在前景的任務和障礙物。由於沒有使用物理引擎,所以是直接使用CocosCreator的碰撞檢測實現的。主人公可以跳躍越過障礙物,撞開障礙物,收集金幣。按住屏幕,hero跳起,按的時間長一些,主人公的跳躍也會高一些,自然一些的話還是需要簡單的物理公式的。正常情況下hero是在x軸上是沒有速度的,一種情況是當障礙物擋住hero時會有一個和障礙物同樣的速度模擬阻擋的效果,還有一種情況是阻擋產生之後hero產生了位置上的移動,需要一個速度回到原位置。由於CocosCreator提供了碰撞檢測之後的回調函數,所以我們可以很輕松的在回調中做一些相關操作,比如讓碰到的金幣消失之類的。
有位同事做過cocos2d-x的開發,使用的c++,向他請教了一些基礎了知識,但是細節上跟cocosCreator相差恨遠,因為cocosCreator是用cocos2d-js框架並配合可視化的編輯器來實現的。由於是先調研的Unity3D,對這種腳本的方式還是比較能夠接受的。其核心思想是在組件,在編輯器中製作精靈和動畫,然後通過腳本組件來控制其邏輯實現,各種功能都組件化,當我們需要給精靈添加一個功能的時候,就是向其添加一個組件。在這個小游戲的製作過程中用的組件的數量也是有限的,主要是使用了:
編輯器給我們提供了方便的拖拽界面,直接將我們需要使用的圖片導入,就會自動生成精靈文件(但是用過Unity3D之後,還是感覺Unity3D的功能集成度更高一些,而且還可以做3D)。
在編寫腳本的時候也是不能脫離編輯器的,在編寫腳本的時候著實是讓我這個ios程序員有點摸不到頭腦了,JS的使用方式有點讓我不太適應,沒有了xcode的提示功能,寫起來還是有些費勁的。JS也是邊學邊寫,不過得益於官方的Demo幾乎把所有組件都寫了一遍,所以就照著葫蘆畫瓢。寫的時候就發現,其實引擎並沒有幫我們做很多的工作(Unity3D可以直接在編輯器里設置物理屬性,不過聽說下個版本的CocosCreator也會有)。在編寫腳本的過程中,最復雜的就是hero腳本的編寫,需要檢測碰撞和處理hero跳躍過程中的不同狀態。碰撞檢測的話需要自己計算碰撞發生的位置,當做矩形碰撞器來處理的,只計算x軸和y軸的碰撞。x軸發生碰撞的話,hero有一個和障礙物一樣的速度,y軸碰撞一直持續的話就是調整hero的y軸的位置,讓其在障礙物的頂部。跳躍的過程中完成動畫的切換。
與CocosCreator編輯器不同的是,這個編輯器是我寫的一個生成障礙物的一個app,可以方便讓產品配置障礙物的位置。主要的實現思路是使用UICollectionView,界面非常的簡單,主要是配合CocosCreator腳本的實現,需要將顆粒狀的障礙物連成一個長的條狀,所以需要將界上的障礙物顆粒結構化一下,取到障礙物的最底部的顆粒的位置,然後連接在一起的高度,這樣的話就是對每一列的統一種類的障礙物進行深度優先搜索,記錄最低點和搜索過的深度,這樣的生成的JSON文件在CoCosCreator腳本里就可以直接使用了。
⑶ 一文詳述Cocos Creator物理引擎的基本配置
引言
在Cocos Creator游戲開發的過程中,經常需要做物體的碰撞、反彈等物理判斷和檢測處理。
一、開啟物理引擎
1: 編寫腳本來開啟物理引擎;
2: 將這個腳本掛載到場景的根節點;
3: 編寫調試介面決定是否打開物理引擎調試;
4: cc.director.getPhysicsManager().enabled = true; // 打開物理引擎
1. `cc.director.getPhysicsManager().debugDrawFlags 調試標志;`
2. `varBits= cc.PhysicsManager.DrawBits;`
3. `cc.director.getPhysicsManager().debugDrawFlags = Bits.e_jointBit | Bits.e_shapeBit;`
5: cc.PhysicsManager:
1. `enable: 開啟 debugDrawFlags: 調試標志, gravity: 重力加速度,二維向量`
1.書寫組件類
1. `const {ccclass, property} = cc._decorator;`
2. `@ccclass`
3. `export default class EnablePhy extends cc.Component {`
4. ` @property({tooltip:"是否開啟物理引擎"})`
5. ` enablePhy : boolean = false;`
6. ` @property({tooltip:"是否調試模式"})`
7. ` isDebug : boolean = false;`
8. ` @property({tooltip:"重力加速度"})`
9. `gravity : cc.Vec2 = cc.v2(0, -320);`
11. `private phyManager : cc.PhysicsManager;`
12. ` onLoad () {`
13. ` if(this.enablePhy){`
14. ` this.phyManager = cc.director.getPhysicsManager();`
15. ` this.phyManager.enabled = this.enablePhy;`
16. ` if(this.isDebug){`
17. ` this.phyManager.debugDrawFlags = cc.PhysicsManager.DrawBits.e_shapeBit || cc.PhysicsManager.DrawBits.e_jointBit;`
18. ` }else{`
19. ` this.phyManager.debugDrawFlags = 0;`
20. ` }`
21. ` //console.log("系統默認重力加速度:",this.phyManager.gravity);`
22. ` this.phyManager.gravity = this.gravity;`
23. ` }else{`
24. ` this.phyManager.enabled = false;`
25. ` }`
26. ` }`
27. `}`
2.將組件類掛載到根節點上
二、重力加速度
1: 物理引擎會有一個重力加速度,來模擬物理環境,你可以可以把重力加速度改成0,不受重力影響;
2: 修改重力加速度:
1. `cc.director.getPhysicsManager().gravity = cc.v2(0, -320);`
三、物理剛體cc.RigidBody
1: 剛體:形狀不會改變
2: 剛體分為靜態,動態剛體, 不受力的剛體(Kinematic,不受作用力的影響);
3: 剛體是受到物理作用的物體,由剛體帶著節點移動;
4: 剛體組件cc.RigidBoy:
1. `enabledContactListener: 是否開啟碰撞事件的監聽;`
2. `bullet: 是否為子彈屬性,防止高速穿越;`
3. `allowSleep: 是否允許進入休眠狀態,一段時間後如果物體沒有任何狀態改變會進入休眠狀態;`
4. `gravityScale: 該物體收重力的縮放;`
5. `linearDamping: 線性阻尼,衰減線性速度;`
6. `angularDamping: 角速度阻尼,衰減角速度;`
7. `linearVelocity: 剛體的線性速度;`
8. `angularVelocity: 剛體的角速度;`
9. `fixedRotation: 是否固定不旋轉;`
10. `awake: 是否立刻喚醒此剛體;`
11. `active: 是否激活這個剛體,如果不激活,那麼剛體不會參與碰撞;`
四、剛體碰撞器cc.Collider
1: 光有剛體還不夠,還要為每個剛體添加一個物理性狀;
2: 物理形狀的類型:
1. `矩形物理碰撞器;`
2. `圓形物理碰撞器;`
3. `多邊形物理碰撞器;`
4. `鏈條碰撞器: PhysicsChainCollider;`
3: 碰撞器的物理參數:
1. `Tag: 碰撞器的標記,區別一個節點上多個不同的碰撞器;`
2. `Density: 形狀的密度;`
3. `Sensor: 是否為一個碰撞感應器;`
4. `Friction: 摩擦系數;`
5. `Restitution: 彈性系數[0, 1], 0沒有彈性, 1完全彈性碰撞;`
6. `Editing: 可以編輯碰撞器的形狀;`
4: 一定要加物理碰撞器,而不是碰撞系統的碰撞器,非常容易出錯誤
更多cocos教學視頻:
Cocoswww.bycwe.com/promotion_channels/2146264125?cate=710180854
⑷ cocosCreator 怎麼使用物理引擎
Size VisibleRect = Director::getInstance()->getVisibleSize(); Camera *camera = CCCamera::createOrthographic(VisibleRect.width, VisibleRect.height, 0, 1); camera->setCameraFlag(CameraFlag::USER2); camera->setPosition(Vec2(x,y));。
⑸ CocosCreator教程(入門篇)
自動釋放資源: 切換場景後,上一個場景中的資源,從內存中釋放。
延遲載入資源: 意味著不用等待所有資源載入完畢,才顯示場景。(快速切換場景,資源陸續在畫面顯示)
普通圖,子層為一張spriteFrame。
創建方式:拖拽場景節點,到資源管理器。
精靈圖,子層為多張spriteFrame。(精靈圖合成軟體:TexturePacker、Zwoptex)
打包時,將所在目錄中的所有碎圖,合成為圖集。
數字為內容的圖集。
動態字體:.ttf
點陣圖字體:.fnt + .png(存在於同一目錄)
小型動畫
模式: web audio、dom audio
操作流程:
(1)導出:文件 => 資源導出,選擇 .fire場景文件,輸出assets目錄的 .zip壓縮包。
(2)導入:文件 => 資源導入,選擇壓縮包源路徑、解壓路徑,輸出assets目錄內容。
基於size mode,盡量去除spriteFrame無像素的部分,減小圖片尺寸。
作用: 用於變換、子節點定位基準。
對攝像機、渲染組件的了解。
對widget、layout等UI組件的了解。
(1)創建動畫的基本流程
(2)時間曲線(雙擊動畫線,進入編輯窗口)
(3)事件管理(雙擊游標、加減按鈕控制參數個數)
(4)腳本控制
碰撞組件(普通碰撞)
(1)editing——是否為編輯模式
(2)regenerate points——計算圖形邊界,自定生成控制點,數值為控制點的生成密度 / 准確度
(3)ctrl + 點擊——刪除控制點
(4)組件類型:矩形、圓形、多邊形
(5)設置碰撞組(項目 => 項目設置 => 分組設置):
制定分組 => 匹配分組 => 碰撞組件所在節點上,設置所屬分組
(6)腳本控制
Box2D物理引擎(高級碰撞)
(1)audioSource組件
(2)腳本控制
(1)定義 CCClass
(2)實例化
(3)判斷類型
(4)構造函數(ctor)
(5)實例方法
(6)繼承(extends)
(7)父構造函數
(8)完整聲明屬性
properties常用參數
(1)獲得組件所在的節點
(2)獲得其它組件
(3)獲得其它節點及其組件
(4)訪問已有變數里的值(通過模塊訪問)
(1)節點狀態和層級操作
(2)更改節點的變換(位置、旋轉、縮放、尺寸)
(3)顏色和不透明度
(4)常用組件介面
cc.Component 是所有組件的基類,任何組件都包括如下的常見介面:
(1)創建新節點
(2)克隆已有節點
(3)創建預制節點
(4)銷毀節點
(1)載入和切換
(2)通過常駐節點,進行場景資源管理和參數傳遞
(3)場景載入回調
(4)預載入場景
(1)資源屬性的聲明
(2)靜態載入(在屬性檢查器里設置資源)
(3)動態載入
(4)載入遠程資源和設備資源
(5)資源的依賴和釋放
(1)監聽事件
(2)關閉監聽
(3)發射事件
(4)派送事件
(5)事件對象(回調參數的event對象)
(1)滑鼠事件類型和事件對象
(2)觸摸事件類型和事件對象
(3)其它事件
(1)動作控制
(2)容器動作
(3)即時動作
(4)時間間隔動作
(5)動作回調
(6)緩動動作
(1)XMLHttpRequest——短連接
(2)WebSocket——長連接
對象池的概念
在同一場景中,需要多次進行節點的生成、消失時,假如直接進行創建、銷毀的操作,就會很浪費性能。因此,使用對象池,存儲需要消失的節點,釋放需要生成的節點,達到節點回收利用的目的。
工作流程
(1)初始化對象池
(2)從對象池請求對象
(3)將對象返回對象池
清除對象池