1. 程式人生 > >Cocos2d-x教程(17)-Box2D 物理引擎

Cocos2d-x教程(17)-Box2D 物理引擎

 歡迎加入 Cocos2d-x 交流群: 193411763 轉載時請註明原文地址:

物理引擎並非每款遊戲的必需品,但它卻可以更好的模擬現實世界的真實感。

此篇文章我們將初步講解Box2D的使用方法。

想要精通Box2D並非簡單的事情,但簡單的使用Box2D卻並非什麼難事,首先我們需要了解幾個常用的概念:

1.世界 b2World  所有的物理效果都是要在物理世界中模擬的,物理世界就是一個大集合,容納所有剛體,夾具,形狀等

2.物體 b2Body   也就是我們物理學中的剛體,一旦建立,則形態不會發生改變

3.形狀 b2Shape 形狀是依附於夾具的,具有摩擦(friction)和恢復(restitution)等屬性,主要用於碰撞檢測


4.夾具 b2Fixture  是一種把形狀附加到物體上的關係,利用形狀可以建立夾具,再將夾具加到物體之上,物體便擁有碰撞能力

5.關節 b2Join     可以將多個物體固定到一起,可以限定一個活動範圍,常用屬性有 限制(Limits) 和 馬達(Motors)

注意事項:

1.物理世界依據的是牛頓定律,並獨立於正常的渲染世界的,兩個世界一個負責遊戲畫面渲染,一個負責物理模擬,他們之間存在資料互動。

2.不要試圖在碰撞檢測的發放中改變物體的狀態,我們可以將需要刪除的物體用容器儲存起來,在驅動方法執行完後非同步處理這些不需要的資料。

3.Box2D世界裡的最佳物體大小是0.1~10個單位長度的物體,因此我們也應該儘量將物體大小設定在這個範圍內,不應直接使用畫素值,而應該一個轉換率。我們在檔案中宣告一個巨集定義 " #define PTM_RATIO 32

 " 單位是畫素/米

使用物理引擎的步驟:

1.初始化一個物理世界
2.建立一個精靈
3.為精靈設定物體及夾具

之後這個精靈便能夠受物理效果的影響了。

下面新建一個工程,新建一個類,命名為Box2dHandler,我們將在該類中管理所有與物理引擎相關的內容。

我們習慣建立一個精靈類的派生類作為物理世界中的精靈物件,儘管這一步驟並非必須,但是你會發現有了這樣的一個類,在之後處理資料時會方便很多。(Cocos2d-x 版本中已經提供了CCPhysicsSprite類)下面在Box2dHandler.h檔案中引入標頭檔案

#include "cocos2d.h"

#include "Box2D.h"

USING_NS_CC;

#define PTM_RATIO 32

加入下列程式碼:


我們在物理世界建立一個精靈時,便可以通過B2Sprite類來建立,當然前提是你希望這個物件受到物理效果的影響。

下面我們繼續在.h檔案中新增Box2dHandler類,在Box2dHandler類中將包含所有相關的物理操作。


注意第30行,我們建立了一個GLESDebugDraw的物件,這個類的封裝是位於"GLES-Render.h"和"GLES-Render.cpp"檔案中的,這兩個檔案需要我們手動引入,檔案目錄為:cocos2d-x-2.2.1/samples/Cpp/TestCpp/Classes/Box2DTestBed

下面我們將這些方法一一實現:









這樣,基本的方法就已經全部完成,當然,update函式以及碰撞檢測的函式中的函式體部分根據需求不同會有變化,我們這裡並沒有新增太多的內容,下面我們來看一下Box2dHandler類的使用方法,開啟專案中的HelloWorld.cpp檔案,引入Box2dHandler類的標頭檔案,並在Init()方法中加入下列程式碼:


由於我們在物理世界中,將y軸重力設定成了-10,所以執行專案後,我們會看到螢幕上又兩個精靈從落下,一個位於螢幕中心,一個位於頂部,兩個精靈的周圍有紅色的半透明矩形,當物體落到底部後,控制檯會輸出"開始碰撞",矩形也會變成灰色,說明已經處於休眠狀態,當再次收到物理效果影響時便會啟用。