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