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

2021-09-08 00:09:25 字數 2005 閱讀 5249

前言:這次我要翻譯的兩篇教程,其實和大家比較關心的「超級瑪利」有關,就是如何使用cocos2d和box2d製作乙個帶有滾動背景的platform遊戲。但是,這兩篇教程並沒有教大家如何製作超級瑪利。但是,一些關鍵技術點還是有涉及到。相信看完這兩篇文章,應該能對大家有所啟發。如果哪位朋友有空,能利用本教程製作乙個超級瑪利遊戲,並且分享出來的話,那就太好了。如果能再寫一篇教程,那就再好不過了。我在此再給出一些超級瑪利的資源鏈結。希望有興趣的朋友可以嘗試一下,有問題大家可以一起**一下。

譯文:因為我實在是找不到乙個這樣的教程,它教您如何使用box2d來製作乙個滾動背景,同時把視角固定在玩家身上。所以,我自己來寫乙個這樣的教程。在遊戲畫面中,玩家幾乎總是固定在螢幕的某個地方,但是,背景在移動。所以,你看起來好像就是玩家在遊戲世界裡面以第一視角在走一樣。

如果您對box2d的一些基礎知識還不了解的話,建議您先看我翻譯的box2d基礎教程。

- (void) addscrollingbackgroundwithtilemap
上面的**載入「scroller.tmx」,然後把它載入到當前層中,注意要把「scroller.tmx」新增到resource目錄下去。如果你去檢視cctmxtiledmap的原始碼的話,你會看到,那些tiles實際上都被建立成了ccsprite物件。但是,話說回來,我在這個例子中沒有使用任何tileset來畫地圖層,所以你在螢幕上看不到任何東西。接下來的**是根據物件層中的物件來建立box2d的物件。

- (void) drawcollisiontiles 

}

這裡的drawcollisiontiles方法把tilemap中的碰撞矩形讀出來,然後位置和長寬資訊建立相應的box2d物件。這裡需要注意的是,讀取座標點使用的資料型別一定要是float型,否則會出現你在tilemap編輯器中畫出來的矩形區域與你程式生成的矩形區域大小不一致的問題!!!大家一定要記住!還有,這裡我把friction設定成了0。這會使我們的主角(其它就是個圓)沿著平台滑動。如果你把這個值設定成非0值,比如0.4,那麼球會在平台上面滾動。

下面我們看看makebox2dobjat方法:

- (void) makebox2dobjat:(cgpoint)p 

withsize:(cgpoint)size

dynamic:(bool)d

rotation:(long)r

friction:(long)f

density:(long)dens

restitution:(long)rest

boxid:(int)boxid

上面這個方法負責建立box2d的物件。這是標準的建立box2d物件的方式。

let』s continue…

現在,把所有的**都拿出來吧。。。

-(id) init  

} b2vec2 pos = playerbody->getposition();

cgpoint newpos = ccp(-1 * pos.x * ptm_ratio + 50, self.position.y * ptm_ratio);

[self setposition:newpos];

}

接下來,上面的**是標準的box2d**,它負責處理box2d世界的**。根據body的位置來更新sprite的位置。實際給背景新增滾動的**,只有最後3行。(說實話,本教程基本上都是知識的回顧。只有這3句話是新的,呵呵)

首先,我們獲得玩家在box2d世界中的位置,然後我們需要把它轉換成cocos2d的畫素值,通過乘以prm_ratio。y值還是不變,因為,我們只想讓背景在x軸方向變化,就是水平滾動。而螢幕是從右邊滾動到左邊,所以要乘以-1.而50在這裡只是讓玩家每次都遠離螢幕左邊一些。如果你不新增這個50的話,那麼玩家每次都會在螢幕的左邊。而且是只有半邊球會露出來。

sample code

這裡有本教程的完整源**。

cocos2d實現語音 Cocos2d 聲音API

param url 聲音路徑 cc.audioengine.playmusic url loop 停止背景 param releasedata 是否釋放聲音資料,預設為false cc.audioengine.stopmusic releasedata 暫停背景 cc.audioengine.pau...

cocos2d使用問題

最近在使用3.6版本的richtext遇到getcontentsize的時候會是 var richtext new ccui.richtext richtext.ignorecontentadaptwithsize false richtext.setcontentsize cc.size 500,...

cocos2d之Box2D詳解 刪除物理世界物件

cocos2d之box2d詳解 刪除物理世界物件 dionysoslai 2014 5 8 物理世界物件,有創造,就有銷毀。通常,我們在更新函式中會這樣寫到 void helloworld update float dt 在這裡,我們做幾件事,一是 遍歷物理世界中的物件 將物理世界物件資料,轉換成我...