cocos2d-x游戏实例(12)-实时拖动主角移动
小滿(bill man)個(gè)人原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明地址,小滿(bill man)的專欄地址http://blog.csdn.net/bill_man
上一篇講解了記錄拖動(dòng)的路徑并使主角按照此路徑移動(dòng)的cocos2d-x實(shí)現(xiàn)。這篇講解另一個(gè)操作方式,這種方式在縱版射擊游戲中有不少的實(shí)現(xiàn),就是觸屏拖動(dòng)主角實(shí)時(shí)移動(dòng),也就是說(shuō)沒(méi)有上一節(jié)那個(gè)記錄路徑然后主角再移動(dòng)的過(guò)程,主角是隨你的手指移動(dòng)的,之后的例子里我也將完整的實(shí)現(xiàn)一個(gè)簡(jiǎn)單的縱版射擊游戲,就采用這種操作方式。
和上一篇一樣,我們也要實(shí)現(xiàn)如下三個(gè)函數(shù):
virtual?void?ccTouchesBegan(CCSet?*pTouches,?CCEvent?*pEvent);
virtual?void?ccTouchesMoved(CCSet?*pTouches,?CCEvent?*pEvent);
virtual?void?ccTouchesEnded(CCSet?*pTouches,?CCEvent?*pEvent);
這個(gè)實(shí)現(xiàn)起來(lái)比上一篇的問(wèn)題要簡(jiǎn)單,但是我們要實(shí)現(xiàn)一個(gè)小算法,就是,我們檢測(cè)我們的觸電在主角的矩形范圍內(nèi)的一個(gè)點(diǎn),那我們的觸點(diǎn)不一定在主角的錨點(diǎn)上,這樣我們不能直接用觸點(diǎn)直接設(shè)置主角的位置,我們需要處理一下,見(jiàn)下圖
如圖p點(diǎn)是我們的觸點(diǎn),a點(diǎn)是我們的錨點(diǎn),我們只要滿足一下公式:
Px?-?Ax?=?dx,Py?-?Ay?=?dy就可以了。
首先來(lái)看ccTouchesBegan的實(shí)現(xiàn):
首先還是獲得觸點(diǎn),然后我們就要獲得主角位置,和上次的程序一樣,主角還是綁定在地圖上的,所以我們要獲得主角的絕對(duì)坐標(biāo),然后判斷觸點(diǎn)是否在主角這個(gè)矩形范圍內(nèi),如果在范圍內(nèi),我們把索引值設(shè)置為-5,-5表示起始點(diǎn)有效,-1表示起始點(diǎn)無(wú)效,然后我們就通過(guò)剛才那個(gè)公式獲得dx和dy(也就是xdelta,ydelta)。
再來(lái)看ccTouchesMoved的實(shí)現(xiàn):
如果索引值為-5,那表示我們就可以控制主角了,然后我們要判斷觸點(diǎn)是否在屏幕范圍內(nèi),如果在屏幕范圍內(nèi),再判斷這個(gè)位置是否和主角當(dāng)前位置相同,如果不同才會(huì)設(shè)置主角位置,這里要說(shuō)到的是我們獲得上一個(gè)位置的方法,當(dāng)然,你也可以通過(guò)一個(gè)變量來(lái)控制,這里介紹通過(guò)計(jì)算得到的方法,首先通過(guò)主角的getposition方法獲得的坐標(biāo)只是主角相對(duì)于地圖的坐標(biāo),我們加上地圖的橫縱坐標(biāo)來(lái)獲得主角的絕對(duì)坐標(biāo),然后再通過(guò)Px?-?Ax?=?dx,Py?-?Ay?=?dy公式獲得上一個(gè)觸點(diǎn)的位置,最后設(shè)置主角位置,注意首先還是通過(guò)Px?-?Ax?=?dx,Py?-?Ay?=?dy公式獲得錨點(diǎn)應(yīng)該移動(dòng)到的位置,然后再減去地圖的位置獲得主角和地圖的相對(duì)坐標(biāo)
再來(lái)看ccTouchesEnded的實(shí)現(xiàn):
很簡(jiǎn)單,就是如果索引值為-5時(shí)重新設(shè)置為-1的“未激活”狀態(tài)。
如有錯(cuò)誤之處,希望大家多多指正
下一篇繼續(xù)游戲?qū)嵗?/p>
總結(jié)
以上是生活随笔為你收集整理的cocos2d-x游戏实例(12)-实时拖动主角移动的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: cocos2d-x游戏实例(11)-触屏
- 下一篇: cocos2d-x游戏实例(13)-简易