一直對物理引擎灰常感興趣。下面的是乙個簡單的物理效果演示。
彈跳的小球球,(呵呵,用了它自己的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中的核...