Android游戲開(kāi)發(fā)實(shí)踐之人物移動(dòng)地圖的平滑滾動(dòng)處理
如圖所示為程序效果動(dòng)畫(huà)圖

地圖滾動(dòng)的原理
在本人之前博客的文章中介紹過(guò)人物在屏幕中的移動(dòng)方式,因?yàn)橹捌吹挠螒虻貓D是完全填充整個(gè)手機(jī)屏幕的,所以無(wú)需處理地圖的平滑滾動(dòng)。這篇文章我著重的向 大家介紹一下控制人物移動(dòng)后地圖滾動(dòng)的處理方式。舉個(gè)例子 如上圖所示 比如人物向右移動(dòng),如果地圖貼在屏幕左邊邊界 將先移動(dòng)人物在地圖的坐標(biāo),當(dāng)人物在屏幕中超過(guò)三分之二后 則將地圖向人物行走的反方向移動(dòng)給玩家一種人物還在向右移動(dòng)的假象,其實(shí)這時(shí)候人物只是播放向右行走的動(dòng)畫(huà) 在屏幕中的坐標(biāo)不變 ,當(dāng)?shù)貓D向人物行走反方向移動(dòng)到不能移動(dòng)的時(shí)候 則表示 地圖右側(cè)邊界已經(jīng)貼住手機(jī)屏幕右側(cè)邊界 這樣地圖則不能在移動(dòng) 這時(shí)候?qū)⒁苿?dòng)人物在屏幕上的坐標(biāo)直到人物貼住屏幕右側(cè)邊界,其它三個(gè)方向原理完全一樣。

代碼的實(shí)現(xiàn)方式
還是以人物向右移動(dòng)為例,我們須要三個(gè)坐標(biāo) 一個(gè)是m_HeroPos 來(lái)保存人物在地圖中的X坐標(biāo) 一個(gè)是 mScreenPos 來(lái)保存人物在屏幕中的顯示坐標(biāo) mMapPos 來(lái)保存地圖在手機(jī)屏幕中的顯示坐標(biāo),按鍵盤(pán)右鍵后人物在地圖中的坐標(biāo)加上8像素(表示行走的步長(zhǎng)),當(dāng)人物的坐標(biāo)超過(guò)屏幕的三分之二的時(shí)候需要檢測(cè)地圖是 否已經(jīng)在邊界, 使用地圖繪制在屏幕中的X坐標(biāo) 加上地圖的寬度 判斷是否等于屏幕的寬度如果等式不成立 則表示地圖可以向左放移動(dòng) 這時(shí)候后人物mScreenPos人物顯示坐標(biāo)將不變 mMapPos地圖顯示坐標(biāo)將向左移動(dòng)人物一個(gè)步長(zhǎng)的位置,如果之前的等式成立 則表示地圖無(wú)法在向左移動(dòng) 這時(shí)候mScreenPos人物顯示坐標(biāo)將向右移動(dòng)人物一個(gè)步長(zhǎng)的位置 直到屏幕右側(cè)邊界 mMapPos地圖顯示坐標(biāo)不會(huì)改變。其三個(gè)方向的移動(dòng)算法完全一樣。
如圖所示地圖在平滑的滾動(dòng)

拓展學(xué)習(xí)之卡馬特地圖緩沖算法
這個(gè)游戲demo 還不能稱(chēng)之為完美 在與物理層碰撞中還是存在一點(diǎn)問(wèn)題 不過(guò) 最重要的是 沒(méi)有使用卡馬克地圖緩沖算法, 下面我詳細(xì)介紹一個(gè)卡馬克地圖緩沖算法原理。我們需要一張地圖換沖圖, 為了實(shí)現(xiàn)平滑滾動(dòng)的效果緩沖圖的大小應(yīng)該是手機(jī)屏幕寬高 ,這樣內(nèi)存中就會(huì)常駐 一張 手機(jī)屏幕大小的緩沖圖。 如果人物向下方行走則表示地圖向上移動(dòng),這時(shí)候屏幕 將被切割出來(lái)了2部分, 上半部分為緩沖圖向上移動(dòng)后的緩沖內(nèi)容,下半部分則就是我們需要更新地圖的部分,將更新后的下半部分與地圖緩沖的上半部分結(jié)合起來(lái)繪制在屏幕中則完成了一 次地圖更新,這樣可以大大提升游戲繪制地圖的效率。如果不使用這種方式來(lái)更新地圖 則地圖每移動(dòng)一次 都須要雙for循環(huán)重新一個(gè)tile一個(gè)tile的繪制一遍效率會(huì)很低下。
如圖所示 地圖向上移動(dòng)后更新綠色的地圖部分 與 將上次緩沖的紅色部分結(jié)合起來(lái)就是新的游戲地圖,其它方向原理完全一樣。

如圖所示:如果游戲中可以按右下方式來(lái)移動(dòng)主角 那么以屏幕右下角為圓心 地圖就會(huì)被切割成4個(gè)部分下圖中紅色區(qū)域須要更新其中 3 個(gè)部分 地圖左邊超出的部分 地圖下面超出的部分 地圖左下方超出的部分,更新的原理和上面一樣。

這么看來(lái)卡馬克不愧是個(gè)游戲領(lǐng)域的天才,馬克地圖緩沖算法不愧是最最優(yōu)秀的地圖算法之一,大家如有有興趣可以去查一查關(guān)于卡馬特的資料,他確實(shí)是一個(gè)頂尖的游戲開(kāi)發(fā)工程師。
- Android仿開(kāi)心消消樂(lè)大樹(shù)星星無(wú)限循環(huán)效果
- Android游戲源碼分享之2048
- Unity3D游戲引擎實(shí)現(xiàn)在Android中打開(kāi)WebView的實(shí)例
- Android 游戲開(kāi)發(fā)之Canvas畫(huà)布的介紹及方法
- Android游戲開(kāi)發(fā)之碰撞檢測(cè)(矩形碰撞、圓形碰撞、像素碰撞)
- Android五子棋游戲程序完整實(shí)例分析
- 以一個(gè)著色游戲展開(kāi)講解Android中區(qū)域圖像填色的方法
- Android高仿2048小游戲?qū)崿F(xiàn)代碼
- Android開(kāi)心消消樂(lè)代碼實(shí)例詳解
- Android 2d游戲開(kāi)發(fā)之貪吃蛇基于surfaceview
相關(guān)文章
Android使用Retrofit2.0技術(shù)仿微信發(fā)說(shuō)說(shuō)
這篇文章主要為大家詳細(xì)介紹了Android使用Retrofit2.0技術(shù)仿微信發(fā)說(shuō)說(shuō),實(shí)現(xiàn)拍照,選圖庫(kù),多圖案上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
Android監(jiān)聽(tīng)來(lái)電和去電的實(shí)現(xiàn)方法
這篇文章主要介紹了Android監(jiān)聽(tīng)來(lái)電和去電的實(shí)現(xiàn)方法,涉及Android中BroadcastReceiver組件的使用及AndroidManifest.xml權(quán)限操作的相關(guān)技巧,需要的朋友可以參考下2016-08-08
Android利用Espresso進(jìn)行UI自動(dòng)化測(cè)試的方法詳解
因?yàn)槲沂歉鉧ndroid開(kāi)發(fā)的,所以被分到了自動(dòng)化測(cè)試小組,所以了解了一些UI自動(dòng)化測(cè)試。下面這篇文章主要給大家介紹了關(guān)于Android利用Espresso進(jìn)行UI自動(dòng)化測(cè)試的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-12-12
Android View事件機(jī)制 21問(wèn)21答
這篇文章主要介紹了Android View事件機(jī)制 21問(wèn)21答 的相關(guān)資料,需要的朋友可以參考下2016-02-02
關(guān)于Android發(fā)送短信獲取送達(dá)報(bào)告的問(wèn)題(推薦)
最近公司開(kāi)發(fā)一個(gè)項(xiàng)目,要求app能夠發(fā)送短信并獲取送達(dá)報(bào)告。實(shí)現(xiàn)代碼非常簡(jiǎn)單的,下面小編給大家分享關(guān)于Android發(fā)送短信獲取送達(dá)報(bào)告的問(wèn)題,感興趣的朋友一起看看吧2017-03-03
Kotlin定義其他類(lèi)的實(shí)現(xiàn)詳解
這篇文章主要介紹了Kotlin定義其他類(lèi)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09
Android自定義View實(shí)現(xiàn)圓形進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)圓形進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
Android Java實(shí)現(xiàn)余弦匹配算法示例代碼
這篇文章主要介紹了Android Java實(shí)現(xiàn)余弦匹配算法示例代碼的相關(guān)資料,這里通過(guò)java 算法實(shí)現(xiàn)余弦匹配算法實(shí)現(xiàn)比較的實(shí)例,需要的朋友可以參考下2016-11-11
Android將應(yīng)用調(diào)試log信息保存在SD卡的方法
Android將應(yīng)用調(diào)試log信息保存在SD卡的方法大家都知道嗎,下面腳本之家小編給大家分享Android將應(yīng)用調(diào)試log信息保存在SD卡的方法,感興趣的朋友參考下2016-04-04

