Android游戲開發(fā)實踐之人物移動地圖的平滑滾動處理
如圖所示為程序效果動畫圖
地圖滾動的原理
在本人之前博客的文章中介紹過人物在屏幕中的移動方式,因為之前拼的游戲地圖是完全填充整個手機屏幕的,所以無需處理地圖的平滑滾動。這篇文章我著重的向 大家介紹一下控制人物移動后地圖滾動的處理方式。舉個例子 如上圖所示 比如人物向右移動,如果地圖貼在屏幕左邊邊界 將先移動人物在地圖的坐標,當人物在屏幕中超過三分之二后 則將地圖向人物行走的反方向移動給玩家一種人物還在向右移動的假象,其實這時候人物只是播放向右行走的動畫 在屏幕中的坐標不變 ,當?shù)貓D向人物行走反方向移動到不能移動的時候 則表示 地圖右側邊界已經(jīng)貼住手機屏幕右側邊界 這樣地圖則不能在移動 這時候將移動人物在屏幕上的坐標直到人物貼住屏幕右側邊界,其它三個方向原理完全一樣。
代碼的實現(xiàn)方式
還是以人物向右移動為例,我們須要三個坐標 一個是m_HeroPos 來保存人物在地圖中的X坐標 一個是 mScreenPos 來保存人物在屏幕中的顯示坐標 mMapPos 來保存地圖在手機屏幕中的顯示坐標,按鍵盤右鍵后人物在地圖中的坐標加上8像素(表示行走的步長),當人物的坐標超過屏幕的三分之二的時候需要檢測地圖是 否已經(jīng)在邊界, 使用地圖繪制在屏幕中的X坐標 加上地圖的寬度 判斷是否等于屏幕的寬度如果等式不成立 則表示地圖可以向左放移動 這時候后人物mScreenPos人物顯示坐標將不變 mMapPos地圖顯示坐標將向左移動人物一個步長的位置,如果之前的等式成立 則表示地圖無法在向左移動 這時候mScreenPos人物顯示坐標將向右移動人物一個步長的位置 直到屏幕右側邊界 mMapPos地圖顯示坐標不會改變。其三個方向的移動算法完全一樣。
如圖所示地圖在平滑的滾動
拓展學習之卡馬特地圖緩沖算法
這個游戲demo 還不能稱之為完美 在與物理層碰撞中還是存在一點問題 不過 最重要的是 沒有使用卡馬克地圖緩沖算法, 下面我詳細介紹一個卡馬克地圖緩沖算法原理。我們需要一張地圖換沖圖, 為了實現(xiàn)平滑滾動的效果緩沖圖的大小應該是手機屏幕寬高 ,這樣內存中就會常駐 一張 手機屏幕大小的緩沖圖。 如果人物向下方行走則表示地圖向上移動,這時候屏幕 將被切割出來了2部分, 上半部分為緩沖圖向上移動后的緩沖內容,下半部分則就是我們需要更新地圖的部分,將更新后的下半部分與地圖緩沖的上半部分結合起來繪制在屏幕中則完成了一 次地圖更新,這樣可以大大提升游戲繪制地圖的效率。如果不使用這種方式來更新地圖 則地圖每移動一次 都須要雙for循環(huán)重新一個tile一個tile的繪制一遍效率會很低下。
如圖所示 地圖向上移動后更新綠色的地圖部分 與 將上次緩沖的紅色部分結合起來就是新的游戲地圖,其它方向原理完全一樣。
如圖所示:如果游戲中可以按右下方式來移動主角 那么以屏幕右下角為圓心 地圖就會被切割成4個部分下圖中紅色區(qū)域須要更新其中 3 個部分 地圖左邊超出的部分 地圖下面超出的部分 地圖左下方超出的部分,更新的原理和上面一樣。
這么看來卡馬克不愧是個游戲領域的天才,馬克地圖緩沖算法不愧是最最優(yōu)秀的地圖算法之一,大家如有有興趣可以去查一查關于卡馬特的資料,他確實是一個頂尖的游戲開發(fā)工程師。
相關文章
Android使用Notification實現(xiàn)通知功能
這篇文章主要為大家詳細介紹了Android使用Notification實現(xiàn)通知功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11flutter TextField換行自適應的實現(xiàn)
這篇文章主要介紹了flutter TextField換行自適應的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02Android Studio查看Android 5.x源碼的步驟詳解
Google為Android開發(fā)者帶來Android Studio,用來取代Eclipse。從Android Studio出現(xiàn)起,整機開發(fā)和Android源碼閱讀和編輯一定能用上它。這篇文章小編就帶大家學習下如何使用Android Studio查看Android 5.x源碼,有需要的可以參考借鑒。2016-09-09Android開發(fā)之merge結合include優(yōu)化布局
這篇文章主要為大家詳細介紹了Android開發(fā)之merge結合include優(yōu)化布局,感興趣的朋友可以參考一下2016-06-06