雨松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...