• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              117 Posts :: 2 Stories :: 61 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(8)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜


                斜角地圖其實(shí)是平面地圖的一種變化,它是將拼接地圖的圖塊內(nèi)容,由原先的四方形圖案改變成由45度角俯瞰四方形圖案時(shí)的菱形圖案,由這些菱形圖案所拼接完成后的地圖,就是一張由45度角俯瞰的斜角地圖了。
                斜角地圖拼接方法同樣也是使用與平面地圖一樣的行與列的方法,事實(shí)上它們的原理是一樣的。但是由于地圖拼接時(shí)只要取位圖中的菱形部分,因此在貼圖坐標(biāo)的計(jì)算會(huì)有所不同,下面就來說明菱形圖塊在貼圖時(shí)的差異,如下圖所示,其中的數(shù)字式圖塊的編號(hào)。

                上圖中的左邊是四方形圖塊的拼接,而右邊的則是菱形圖塊的拼接。四方形圖塊拼接方法時(shí):圖塊編號(hào)換算成行編號(hào)與列編號(hào)再換算成貼圖坐標(biāo)。對(duì)于斜角地圖拼接來說,這些步驟都是一樣的,但是在換算貼圖坐標(biāo)時(shí),由于只要顯示圖塊中的菱形部分,因此在貼圖排列的方式上會(huì)有不同,因而貼圖坐標(biāo)的計(jì)算公式也就不一樣了。
                此外,在合并兩個(gè)圖塊的菱形部分時(shí),還需要加上一步透明的步驟,不然若直接按照求得的貼圖坐標(biāo)來進(jìn)行貼圖,其效果就會(huì)如下圖所示:

                接下來看看斜角地圖拼接時(shí),各個(gè)圖塊編號(hào)與實(shí)際排列的情形,如下圖所示:

                上圖同樣是一張4×3個(gè)小圖塊所拼接而成的地圖,其中的數(shù)字式圖塊編號(hào)。對(duì)于每一圖塊首先必須算出它的行編號(hào)與列編號(hào),然后才能計(jì)算它實(shí)際的貼圖坐標(biāo),計(jì)算行列編號(hào)的方法與隨筆“游戲地圖制作——平面地圖貼圖”所使用的公式一樣,即:

            列編號(hào) = 索引值 / 每一列的圖塊個(gè)數(shù)(行數(shù));
            行編號(hào) = 索引值 % 每一列的圖塊個(gè)數(shù)(行數(shù));

                求出行編號(hào)與列編號(hào)后,就可以計(jì)算出圖塊貼圖時(shí)左上點(diǎn)的坐標(biāo),除此之外,還需要知道圖塊中菱形部分的長度與高度,這里假設(shè)圖塊中菱形的寬與高分別是w和h,如下圖所示:

                那么圖塊左上點(diǎn)貼圖坐標(biāo)的計(jì)算公式如下:

            左上點(diǎn)X坐標(biāo) = xstart + 行編號(hào) ×(w/2) - 列編號(hào)×(w/2);
            左上點(diǎn)Y坐標(biāo) = ystart + 列編號(hào) ×(h/2 )- 行編號(hào)×(h/2);


                公式中的xstart與ystart是代表第一張圖塊左上角貼圖坐標(biāo)的位置,以下圖來說明這個(gè)公式:

                圖中以紅線框來表示圖塊真正的矩形范圍,在進(jìn)行貼圖時(shí),首先要定義第1張圖塊的貼圖位置,其他圖塊的貼圖坐標(biāo)再由此圖塊向下延伸。現(xiàn)在假設(shè)給定圖塊0的貼圖坐標(biāo)是(xstart,ystart),那么接下來考慮圖塊1的矩形范圍,它左上角貼圖的坐標(biāo)則是(xstart+w/2,ystart+h/2),考慮圖塊2的矩形范圍,它左上角貼圖的坐標(biāo)又變成(xstart+w/2×2,ystart+h/2×2)。依次類推,再加入行編號(hào)與列編號(hào),可以得到下面的這個(gè)求圖塊貼圖坐標(biāo)的公式:

            左上點(diǎn)X坐標(biāo) = xstart + 行編號(hào) ×(w/2);
            左上點(diǎn)Y坐標(biāo) = ystart + 列編號(hào) ×(h/2 );


                但是要注意一點(diǎn),這是當(dāng)圖塊都在屬于同一列的情況。考慮下一列的圖塊4,圖塊4的左上角貼圖坐標(biāo)是(xstart-w/2,ystart+h/2),而圖塊5的左上角貼圖坐標(biāo)是(xstart-w/2+w/2,ystart+h/2+h/2),圖塊6的左上角貼圖坐標(biāo)為(xstart-w/2+w/2×2,ystart+h/2+h/2×2),依次類推,可看出同一列上坐標(biāo)變化規(guī)律都是一樣的,貼圖坐標(biāo)都是往右下方遞增半個(gè)圖塊的長于高單位。
                如果是在同一行(圖塊0、4、8)上的坐標(biāo)變化則是往左下方遞減半個(gè)圖塊的長(X軸方向)以及遞增半個(gè)圖塊的高(Y軸方向),因此利用圖塊的行編號(hào)與列編號(hào)便得出了前面的貼圖坐標(biāo)公式。
                計(jì)算出每個(gè)圖塊的坐標(biāo)并完成了斜角地圖的拼接后,此時(shí)要將整塊地圖貼到窗口中,還需要知道地圖的寬度與高度,計(jì)算的方法可以通過下圖進(jìn)行說明:
               

                由上面可以很容易的推導(dǎo)出整張地圖的寬與高計(jì)算公式如下:

            地圖寬 = (列數(shù)+行數(shù))×(w/2);
            地圖高 = (列數(shù)+行數(shù))×(h/2 );


                在了解了關(guān)于斜角地圖拼接的方法之后,接下來的這個(gè)范例將上一小節(jié)里的平面拼接地圖轉(zhuǎn)換成以45度角俯視的斜角地圖。

            范例ch2_10:從文件中加載位圖,并顯示在窗口上。
            下載地址:ch2_10(上傳到windows live空間,可能需要MSN賬號(hào)登陸)
            說明:程序源代碼中有相關(guān)的注釋。
            程序運(yùn)行結(jié)果如下圖:
             


            PS:如想獲得更多關(guān)于Visual C++游戲開發(fā)的內(nèi)容,可點(diǎn)擊隨筆:《Visual C++游戲編程基礎(chǔ)》學(xué)習(xí)筆記——索引隨筆

            Feedback

            # re: 游戲地圖制作——斜角地圖貼圖 2010-04-10 10:23 func
            其實(shí)圖片沒必要用菱形拼接,矩形塊照樣能得到斜45度效果。
            遮擋的時(shí)候,有些算法,邏輯上可能用用到菱形底座對(duì)比物體的前后。
            遮擋算法的漏洞,可以用障礙避免。  回復(fù)  更多評(píng)論
              

            # 斜角地圖貼圖 2011-05-05 19:23 3rf
            1erqwefqwrf  回復(fù)  更多評(píng)論
              

            # re: 游戲地圖制作——斜角地圖貼圖 2011-08-26 17:29 3lxl3
            誤人子弟,趕集改過來。  回復(fù)  更多評(píng)論
              

            亚洲av成人无码久久精品| 国产精品热久久无码av| 欧美亚洲国产精品久久| 久久偷看各类wc女厕嘘嘘 | 欧美久久久久久午夜精品| 久久午夜电影网| 日产精品久久久久久久| 精品久久久久久亚洲精品| 久久久久精品国产亚洲AV无码| 国产激情久久久久影院小草| 亚洲精品99久久久久中文字幕| 亚洲国产成人久久精品影视| 国产精品免费福利久久| 国产精品青草久久久久福利99 | 久久无码高潮喷水| 亚洲国产精品久久久久婷婷老年| 亚洲天堂久久久| 午夜精品久久久久久久无码| 久久国产免费观看精品3| 国产精品久久久久国产A级| 午夜精品久久久久成人| 久久99精品九九九久久婷婷| 精品无码久久久久久国产| 国产V亚洲V天堂无码久久久| 久久强奷乱码老熟女网站| 青青青青久久精品国产h久久精品五福影院1421 | 日本三级久久网| 99久久无码一区人妻a黑| 亚洲精品乱码久久久久久蜜桃不卡| 精品99久久aaa一级毛片| 91久久九九无码成人网站| 久久国产成人精品麻豆| 久久国产影院| 无码人妻久久一区二区三区免费丨| 欧美亚洲另类久久综合婷婷| 日日狠狠久久偷偷色综合0| 久久伊人五月天论坛| 热RE99久久精品国产66热| 久久亚洲国产精品123区| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 99精品久久精品一区二区|