cocos2d-x游戏实例(24)-简易动作游戏(2)
小滿(mǎn)(bill man)個(gè)人原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明地址,小滿(mǎn)(bill man)的專(zhuān)欄地址http://blog.csdn.net/bill_man
繼續(xù)上一篇?jiǎng)幼饔螒虻膶?shí)例,加入左右邊界的碰撞,效果如下:
左右邊界的碰撞,需要借助到地圖中的圖素的屬性部分
鼠標(biāo)右鍵屬性,加入collion屬性(自己定義的名字),并把屬性的值設(shè)置為2,這樣我們?cè)谖覀兊某绦蛑蝎@得屬性后我們就可以判斷這個(gè)圖素是否是地圖中的碰撞塊,獲得地圖的屬性主要通過(guò)如下幾句:
CCTMXLayer*?layer?=?map->layerNamed("logic");//獲得相應(yīng)的地圖層
int?tilegid?=?layer->tileGIDAt(playerindex);//獲得GID
CCMutableDictionary<string,CCString?*>?*tiledic?=?map->propertiesForGID(tilegid);//獲得屬性鍵值對(duì)
CCString?*mvalue?=?tiledic->objectForKey("collion");//獲得屬性colloion
int?mv?=?mvalue->toInt();//轉(zhuǎn)為整型數(shù)值
整體的判斷水平碰撞函數(shù)playermaphcollision如下:
首先是獲得主角的站立位置,主角寬高,然后獲得地圖對(duì)象,之后便是一個(gè)for循環(huán),這個(gè)for循環(huán)是從主角的腳底遍歷到頭頂?shù)目v坐標(biāo)值,然后就是對(duì)應(yīng)縱坐標(biāo)值和橫坐標(biāo)值,除以圖素的寬高,獲得對(duì)應(yīng)地圖的索引坐標(biāo),由于我們要分別檢測(cè)左側(cè)和右側(cè)的碰撞,所以相應(yīng)的橫坐標(biāo)也就不同
獲得左側(cè)橫坐標(biāo):indexx?=?(playerpoint.x?-?palyersize.width?/?2)?/?map->getTileSize().width;
獲得右側(cè)橫坐標(biāo):indexx?=?(playerpoint.x?+?palyersize.width?/?2?-?1)?/?map->getTileSize().width;
因?yàn)殄^點(diǎn)在中心,所以左右側(cè)分別就是減去和加上寬度的一半,然后不同之處就是,處理右側(cè)時(shí)候要減一,因?yàn)槲覀冏髠?cè)的碰撞是獲得邊界左側(cè)的,而右側(cè)的碰撞是獲得邊界右側(cè)的。當(dāng)我們的坐標(biāo)屬于以下范圍時(shí)他屬于這個(gè)圖素塊的索引index:(index?-?1)*?圖素寬?<=?x?<?index?*?圖素寬,也就是我們的坐標(biāo)如果等于右側(cè)邊界值,那么他就會(huì)被算在下一個(gè)索引值里,所以在處理右側(cè)時(shí)為了防止等于邊界值時(shí)被誤算入下一塊圖素塊時(shí)出現(xiàn)“卡”在地圖上的情況,在處理右側(cè)碰撞時(shí)減一。
下面就是檢測(cè)如果碰上碰撞塊時(shí)把水平移動(dòng)的標(biāo)志設(shè)置為0,然后校正位置,把主角移動(dòng)到不碰撞的位置上,并且重新設(shè)置主角位置;
另外,修正上一篇中的一個(gè)問(wèn)題,在獲得主角在屏幕中位置時(shí)要獲得主角的絕對(duì)坐標(biāo),要加上地圖的坐標(biāo),因?yàn)槲覀冊(cè)O(shè)置主角的位置時(shí),是設(shè)置在地圖上的,所以主角的位置是相對(duì)與地圖坐標(biāo)的,代碼如下:
如有錯(cuò)誤之處,希望大家多多指正
下一篇繼續(xù)簡(jiǎn)易動(dòng)作游戲
總結(jié)
以上是生活随笔為你收集整理的cocos2d-x游戏实例(24)-简易动作游戏(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: cocos2d-x游戏实例(23)-简易
- 下一篇: cocos2d-x游戏实例(25)-简易