卡馬克卷軸演算法實現android版

2021-06-16 08:20:50 字數 1434 閱讀 7500

雨松momo

帶你走進遊戲開發的世界之主角的移動與地圖的平滑滾動

卡馬克卷軸演算法研究_

地圖雙緩衝

矩形相交判斷

將地圖每次移動時的相交區域作為重複利用資源(

緩衝區)

,如圖a1b1c1d1(移動前)和a2b2c2d2(移動後)相交得到的矩形為aabbccdd。

根據判斷矩形是否相交公式為:

通過中心點距離判斷(中心點距離 x<= 矩形1寬度/2 + 矩形2寬度/2)且(中心點距離 y<= 矩形1高度/2 + 矩形2高度/2)

獲取相交矩形公式為:

如果相交,則相交矩形的左上角座標為(max(a1.x,a2.x),max(a1.y,a2.y))和右下角座標(min(d1.x,d2.x),min(d1.y,d2.y))

當每次螢幕移動時,實際是將地圖移動在相反的方向移動,移動後根據當前螢幕所在地圖中的相對位置,將螢幕中的區域貼磚。在每次移動中實際不同的區域只是非aabbccdd

相交區域,所以可以在貼磚時增加判斷當前貼磚區域是否是在相交區域,如果是則不用貼磚,只把相交區域外的區域進行貼磚即可,實際就是少貼磚,減少

cpu的運算量。

注意採用該演算法後,占用內寸不會減少,由於卡馬克卷軸涉及到很多座標運算,所以在當前記憶體消耗中,有時候會多占用一些記憶體資源。

具體實現**如下:

/**

* 滾動螢幕(移動距離可以利用ontouchevent獲得)

* @param distancex x方向移動距離

* @param distancey y方向移動距離

*/public void scrollmap(float distancex, float distancey) {

// todo auto-generated method stub

//觸控位移靈敏度

int newscrleft = screeninmaploc.x + (int)distancex/5;

int newscrtop = screeninmaploc.y + (int)distancey/5;

int mapwidth = mmapview[0].length * tile_width;

int mapheight = mmapview.length * tile_height;

//設定後則是考慮相交區域

lastscrinmaploc = new point(screeninmaploc.x,screeninmaploc.y);

if(newscrleft>0 && newscrleft + screen_width0 && newscrtop + screen_height在模擬器中未使用卡馬克卷軸演算法:

在模擬器中使用卡馬克卷軸演算法:

採用卡馬克卷軸演算法後,cpu

執行耗時有明顯減少。

實現**:

卡馬克卷軸演算法

念 這裡使用簡化的概念,精確的定義請參考計算機圖形學中二維觀察流程。世界座標系 用於標註整個遊戲世界的座標系。攝像機 攝像機攝到的區域才能顯示在螢幕上,攝像機在本文中表現為乙個視窗,視窗內的世界才能顯示到螢幕上進而被看到。移動攝像機到不同的位置就可以觀察不同位置的情形。卡馬克卷軸演算法 如圖所示,當...

卡馬克卷軸演算法

概念 這裡使用簡化的概念,精確的定義請參考計算機圖形學中二維觀察流程。世界座標系 用於標註整個遊戲世界的座標系。卡馬克卷軸演算法 img 如圖所示,當前內容是 1230。當攝像機向右下移動時,其內容應該變為0564,這樣就形成了卷軸的效果。由原位置變化為新位置的具體做法是 使用兩個緩衝區 當前緩衝區...

As3中實現卡馬克卷軸演算法

flash的優化效率挺高的 貌似直接把所有的bitmap放在同乙個sprite裡 直接移動sprite 好像效率也還行 這種方法使用起來相當easy 我曾經嘗試過各種直接操作bitmap的方法 貌似效率都還不如移動整個sprite來得高。flash在介面上 移動的層越少 效率就越高 也就是說 5個b...