cocos2d x 使用box2d實現物理彈跳效果

2021-06-12 05:43:32 字數 2881 閱讀 5390

一直對物理引擎灰常感興趣。下面的是乙個簡單的物理效果演示。

彈跳的小球球,(呵呵,用了它自己的icon,沒裝ps,小球球沒切好)

使用cocos2d-x新建乙個box2d的模板工程。

把helloworldscene.h換成下面的**,(如果你用的是cocos2d,記得檔案後最是.mm,oc和c++混編時檔案要是mm)

[cpp]view plain

copy

////  helloworldscene.h

//  testbox2d

////  created by yanghui liu on 11-11-4.

//#ifndef __hello_world_h__

#define __hello_world_h__

#include "cocos2d.h"

#include "box2d.h"

using_ns_cc;  

class helloworld : public cocos2d::cclayer ;  

#endif // __hello_world_h__

這個很簡單,就不用說了。

下面是cpp檔案

[cpp]view plain

copy

////  helloworldscene.cpp

//  testbox2d

////  created by yanghui liu on 11-11-4.

//#include "helloworldscene.h"

#include "******audioengine.h"

using

namespace cocos2d;  

using

namespace cocosdenshion;  

#define ptm_ratio 32

helloworld::helloworld()  

helloworld::~helloworld()  

void helloworld::minit()  

void helloworld::tick(cocos2d::cctime dt)  

}  }  ccscene* helloworld::scene()    

下面是相關資料的介紹,我就直接搬過來了。

在我們開始之前,讓我們先交待一下box2d具體是如何運作的。

你需要做的第一件事情就是,當使用cocos2d來為box2d建立乙個world物件的時候。這個world物件管理物理**中的所有物件。

一旦我們已經建立了這個world物件,接下來需要往裡面加入一些body物件。body物件可以隨意移動,可以是怪物或者飛鏢什麼的,只要是參與碰撞的遊戲物件都要為之建立乙個相應的body物件。當然,也可以建立一些靜態的body物件,用來表示遊戲中的台階或者牆壁等不可以移動的物體。

為了建立乙個body物件,你需要做很多事情--首先,建立乙個body定義結構,然後是body物件,再指定乙個shap,再是fixture定義,然後再建立乙個fixture物件。下面會乙個乙個解釋剛剛這些東西。

只要你把所有需要建立的body物件都建立好之後,box2d接下來就會接管工作,並且高效地進行物理**---只要你周期性地呼叫world物件的step函式就可以了。

但是,請注意,box2d僅僅是更新它內部模型物件的位置--如果你想讓cocos2d裡面的sprite的位置也更新,並且和物理**中的位置相同的話,那麼你也需要周期性地更新精靈的位置。

ok,繼續我的**:

建立了world物件的時候需要指定乙個初始的重力向量,上面我設定y軸方向為-30,因此,所有的body都會往螢幕下面下落。

第二個引數設定世界裡面的物件是否可以休眠,乙個休眠的物件將不會花費處理時間,直到它與其實物件發生碰撞的時候才會「醒」過來。

接下來,建立一圈不可見的邊:

首先建立乙個body定義結構體,並且指定它應該放在左下角。

然後,使用world物件來建立body物件。(注意,這裡一定要使用world物件來建立,不能直接new,因為world物件會做一些記憶體管理操作。)

接著,為螢幕的每乙個邊界建立乙個多邊形shape。這些「shape」僅僅是一些線段。注意,我們把畫素轉換成了「meter」。通過除以之前定義的比率來實現的。再建立乙個fixture定義,指定shape為polygon shape。再使用body物件來為每乙個shape建立乙個fixture物件。注意:乙個body物件可以包含許許多多的fixture物件。

接下來,我們建立籃球的body。這個步驟和之前建立地面的body差不多,但是有下面一些差別需要注意一下:

我們指定body的型別為dynamic body。預設值是static body,那意味著那個body不能被移動也不會參與**。很明顯,我們想讓籃球參與**。

設定body的user data屬性為籃球精靈。你可以設定任何東西,但是,你設定成精靈會很方便,特別是當兩個body碰撞的時候,你可以通過這個引數把精靈物件取出來,然後做一些邏輯處理。這裡使用了乙個不同的shape型別--circle shape。在這裡,我們需要為這個fixture指定一些引數,因此,我們沒有使用便捷方法來建立fixture。後面我們會講到這些引數的具體意義。

第一件事情就是呼叫world物件的step方法,這樣它就可以進行物理**了。這裡的兩個引數分別是「速度迭代次數」和「位置迭代次數」--你應該設定他們的範圍在8-10之間。(譯者:這裡的數字越小,精度越小,但是效率更高。數字越大,**越精確,但同時耗時更多。8一般是個折中,如果學過數值分析,應該知道迭代步數的具體作用)。

接下來,我們要使我們的精靈匹配物理**。因此,我們遍歷world物件裡面的所有body,然後看body的user data屬性是否為空,如果不為空,就可以強制轉換成精靈物件。接下來,就可以根據body的位置來更新精靈的位置了。

記得清理記憶體

(譯)使用cocos2d和box2d製作滾動背景

前言 這次我要翻譯的兩篇教程,其實和大家比較關心的 超級瑪利 有關,就是如何使用cocos2d和box2d製作乙個帶有滾動背景的platform遊戲。但是,這兩篇教程並沒有教大家如何製作超級瑪利。但是,一些關鍵技術點還是有涉及到。相信看完這兩篇文章,應該能對大家有所啟發。如果哪位朋友有空,能利用本教...

box2d 碰撞過濾

原帖 碰撞篩選就是乙個防止某些形狀發生碰撞的系統。按照具體需求設定哪些物體跟那些物體發生碰撞,跟哪些物體不發生碰撞。box2d通過種群跟組索引支援碰撞篩選。組索引比較簡單,設定其shapedef的groupindex值即可,例如boxdef.filter.groupindex 1。通過groupin...

Box2D學習筆記

box2d是乙個用於遊戲的2d剛體 庫,程式設計師可以在他們的遊戲裡使用他們,也可以是的自己的物體運動的更可信。讓他看起來更加接近現實。物理引擎是乙個程式性的動畫系統。而不是由動畫師去移動物體。這一切都是建立在牛頓力學的基礎之上。box2d最初是用c 來寫的,之後有被多種語言所實現。box2d中的核...