斜角地圖其實是平面地圖的一種變化,它是將拼接地圖的圖塊內容,由原先的四方形圖案改變成由45度角俯瞰四方形圖案時的菱形圖案,由這些菱形圖案所拼接完成后的地圖,就是一張由45度角俯瞰的斜角地圖了。
斜角地圖拼接方法同樣也是使用與平面地圖一樣的行與列的方法,事實上它們的原理是一樣的。但是由于地圖拼接時只要取位圖中的菱形部分,因此在貼圖坐標的計算會有所不同,下面就來說明菱形圖塊在貼圖時的差異,如下圖所示,其中的數字式圖塊的編號。
上圖中的左邊是四方形圖塊的拼接,而右邊的則是菱形圖塊的拼接。四方形圖塊拼接方法時:圖塊編號換算成行編號與列編號再換算成貼圖坐標。對于斜角地圖拼接來說,這些步驟都是一樣的,但是在換算貼圖坐標時,由于只要顯示圖塊中的菱形部分,因此在貼圖排列的方式上會有不同,因而貼圖坐標的計算公式也就不一樣了。
此外,在合并兩個圖塊的菱形部分時,
還需要加上一步透明的步驟,不然若直接按照求得的貼圖坐標來進行貼圖,其效果就會如下圖所示:
接下來看看斜角地圖拼接時,各個圖塊編號與實際排列的情形,如下圖所示:
上圖同樣是一張4×3個小圖塊所拼接而成的地圖,其中的數字式圖塊編號。對于每一圖塊首先必須算出它的行編號與列編號,然后才能計算它實際的貼圖坐標,計算行列編號的方法與隨筆“
游戲地圖制作——平面地圖貼圖”所使用的公式一樣,即:
列編號 = 索引值 / 每一列的圖塊個數(行數);
行編號 = 索引值 % 每一列的圖塊個數(行數);
求出行編號與列編號后,就可以計算出圖塊貼圖時左上點的坐標,除此之外,還需要知道圖塊中菱形部分的長度與高度,這里假設圖塊中菱形的寬與高分別是w和h,如下圖所示:
那么圖塊左上點貼圖坐標的計算公式如下:
左上點X坐標 = xstart + 行編號 ×(w/2) - 列編號×(w/2);
左上點Y坐標 = ystart + 列編號 ×(h/2 )- 行編號×(h/2);
公式中的xstart與ystart是代表第一張圖塊左上角貼圖坐標的位置,以下圖來說明這個公式:
圖中以紅線框來表示圖塊真正的矩形范圍,在進行貼圖時,首先要定義第1張圖塊的貼圖位置,其他圖塊的貼圖坐標再由此圖塊向下延伸。現在假設給定圖塊0的貼圖坐標是(xstart,ystart),那么接下來考慮圖塊1的矩形范圍,它左上角貼圖的坐標則是(xstart+w/2,ystart+h/2),考慮圖塊2的矩形范圍,它左上角貼圖的坐標又變成(xstart+w/2×2,ystart+h/2×2)。依次類推,再加入行編號與列編號,可以得到下面的這個求圖塊貼圖坐標的公式:
左上點X坐標 = xstart + 行編號 ×(w/2);
左上點Y坐標 = ystart + 列編號 ×(h/2 );
但是要注意一點,這是當圖塊都在屬于同一列的情況。考慮下一列的圖塊4,圖塊4的左上角貼圖坐標是(xstart-w/2,ystart+h/2),而圖塊5的左上角貼圖坐標是(xstart-w/2+w/2,ystart+h/2+h/2),圖塊6的左上角貼圖坐標為(xstart-w/2+w/2×2,ystart+h/2+h/2×2),依次類推,可看出同一列上坐標變化規律都是一樣的,貼圖坐標都是往右下方遞增半個圖塊的長于高單位。
如果是在同一行(圖塊0、4、8)上的坐標變化則是往左下方遞減半個圖塊的長(X軸方向)以及遞增半個圖塊的高(Y軸方向),因此利用圖塊的行編號與列編號便得出了前面的貼圖坐標公式。
計算出每個圖塊的坐標并完成了斜角地圖的拼接后,此時要將整塊地圖貼到窗口中,還需要知道地圖的寬度與高度,計算的方法可以通過下圖進行說明:
由上面可以很容易的推導出整張地圖的寬與高計算公式如下:
地圖寬 = (列數+行數)×(w/2);
地圖高 = (列數+行數)×(h/2 );
在了解了關于斜角地圖拼接的方法之后,接下來的這個范例將上一小節里的平面拼接地圖轉換成以45度角俯視的斜角地圖。
范例ch2_10:從文件中加載位圖,并顯示在窗口上。
下載地址:
ch2_10(上傳到windows live空間,可能需要MSN賬號登陸)
說明:程序源代碼中有相關的注釋。
程序運行結果如下圖:
PS:如想獲得更多關于Visual C++游戲開發的內容,可點擊隨筆
:《Visual C++游戲編程基礎》學習筆記——索引隨筆。