標籤:android c style blog java http
人物移動地圖的平滑滾動處理
玩過rpg遊戲的朋友應該都知道RPG的遊戲地圖一般都比較大 今天我和大家分享一下在RPG遊戲中如何來處理超出手機螢幕大小的遊戲地圖。
為程式效果動畫圖
地圖滾動的原理
在本人之前部落格的文章中介紹過人物在螢幕中的移動方式,因為之前拼的遊戲地圖是完全填充整個手機螢幕的,所以無需處理地圖的平滑滾動。這篇文章我著重的向 大家介紹一下控制人物移動後地圖滾動的處理方式。舉個例子 如所示 比如人物向右移動,如果地圖貼在螢幕左邊邊界 將先移動人物在地圖的座標,當人物在螢幕中超過三分之二後 則將地圖向人物行走的反方向移動給玩家一種人物還在向右移動的假象,其實這時候人物只是播放向右行走的動畫 在螢幕中的座標不變 ,當地圖向人物行走反方向移動到不能移動的時候 則表示 地圖右側邊界已經貼住手機螢幕右側邊界 這樣地圖則不能在移動 這時候將移動人物在螢幕上的座標直到人物貼住螢幕右側邊界,其它三個方向原理完全一樣。
代碼的實現方式
還是以人物向右移動為例,我們須要三個座標 一個是m_HeroPos 來儲存人物在地圖中的X座標 一個是 mScreenPos 來儲存人物在螢幕中的顯示座標 mMapPos 來儲存地圖在手機螢幕中的顯示座標,按鍵盤右鍵後人物在地圖中的座標加上8像素(表示行走的步長),當人物的座標超過螢幕的三分之二的時候需要檢測地圖是 否已經在邊界, 使用地圖繪製在螢幕中的X座標 加上地圖的寬度 判斷是否等於螢幕的寬度如果等式不成立 則表示地圖可以向左放移動 這時候後人物mScreenPos人物顯示座標將不變 mMapPos地圖顯示座標將向左移動人物一個步長的位置,如果之前的等式成立 則表示地圖無法在向左移動 這時候mScreenPos人物顯示座標將向右移動人物一個步長的位置 直到螢幕右側邊界 mMapPos地圖顯示座標不會改變。其三個方向的移動演算法完全一樣。
地圖在平滑的滾動
拓展學習之卡馬特地圖緩衝演算法
這個遊戲demo 還不能稱之為完美 在與物理層碰撞中還是存在一點問題 不過 最重要的是 沒有使用卡馬克地圖緩衝演算法, 下面我詳細介紹一個卡馬克地圖緩衝演算法原理。我們需要一張地圖換沖圖, 為了實現平滑滾動的效果緩衝圖的大小應該是手機螢幕寬高 ,這樣記憶體中就會常駐 一張 手機螢幕大小的緩衝圖。 如果人物向下方行走則表示地圖向上移動,這時候螢幕 將被切割出來了2部分, 上半部分為緩衝圖向上移動後的緩衝內容,下半部分則就是我們需要更新地圖的部分,將更新後的下半部分與地圖緩衝的上半部分結合起來繪製在螢幕中則完成了一 次地圖更新,這樣可以大大提升遊戲繪製地圖的效率。如果不使用這種方式來更新地圖 則地圖每移動一次 都須要雙for迴圈重新一個tile一個tile的繪製一遍效率會很低下。
地圖向上移動後更新綠色的地圖部分 與 將上次緩衝的紅色部分結合起來就是新的遊戲地圖,其它方向原理完全一樣。
:如果遊戲中可以按右下方式來移動主角 那麼以螢幕右下角為圓心 地圖就會被切割成4個部分中紅色地區須要更新其中 3 個部分 地圖左邊超出的部分 地圖下面超出的部分 地圖左下方超出的部分,更新的原理和上面一樣。
這麼看來卡馬克不愧是個遊戲領域的天才,馬克地圖緩衝演算法不愧是最最優秀的地圖演算法之一,大家如有有興趣可以去查一查關於卡馬特的資料,他確實是一個頂尖的遊戲開發工程師。