AS3 RPG游戏引擎开发日志3:地图坐标转换
在這里更改之前說(shuō)的45度角坐標(biāo)轉(zhuǎn)換的問(wèn)題,地圖仍然不變,但地圖坐標(biāo)和游戲坐標(biāo)的關(guān)系改變了,它的對(duì)應(yīng)關(guān)系如下圖:
其中虛線表示地圖的邊緣,區(qū)塊中標(biāo)的數(shù)是數(shù)組的索引,即地圖坐標(biāo)。地圖的高度用大寫的H表示,區(qū)塊的高度用小寫的h表示,區(qū)塊的寬度等于高度的兩倍。
- 顯示坐標(biāo)轉(zhuǎn)換成地圖坐標(biāo)
假設(shè)一個(gè)點(diǎn)(下圖中的A點(diǎn))的顯示坐標(biāo)為(x,y),地圖坐標(biāo)為(i,j),顯示坐標(biāo)轉(zhuǎn)換成地圖坐標(biāo)就是要在已知x和y的情況下求i和j。
i的值等于AB的長(zhǎng)除菱形區(qū)塊的邊長(zhǎng)取整,AB=AF+BF,△ADF是一個(gè)直角邊比為1:2的直角三角形,其中直角邊AD=x,因此AF=√5—x2?!鱂BK是BF=BK等腰三角形,且底邊上的高等于底邊FK,FK=GE,GE=AE-AG,AG=x/2,因此BF=√5—2(y-x/2)。最后
i=(AF+BF)/(√5—h2)=[√5—x2+ √5—2(y-x/2)]/√5—h2=(y+x/2)/h。
對(duì)j的值求解則要分兩種情況,即上圖中的A點(diǎn)和O點(diǎn),確定條件分別是x/2<H-h和x/2>=H-h。
在A點(diǎn),j等于AC的長(zhǎng)除菱形區(qū)塊的邊長(zhǎng)取整,AC=AH+HC,HC=HI=AJ,AJ可以通過(guò)i的值求出。AH=√5—x2,AJ=菱形區(qū)塊的邊長(zhǎng)-(AB-菱形區(qū)塊的邊長(zhǎng)×i)=
√5—h2-[√5—x2+ √5—2(y-x/2)]+√5—hi2,
這是可以得出j=(x/2-y)/h+i+1。
在O點(diǎn),同上面的道理一樣,區(qū)別是求PQ,PQ=OS,最后計(jì)算的結(jié)果是j=(2H+x/2-y)/h-i。
結(jié)論:
?? ??? ?i=(y+x/2)/h
?? ??? ?j=(x/2-y)/h+i+1?? ?當(dāng)x/2<H-h時(shí)
?? ??? ?j=(2H+x/2-y)/h-i?? ?當(dāng)x/2>=H-h時(shí)
- 地圖坐標(biāo)轉(zhuǎn)換成顯示坐標(biāo)
此時(shí)要將上圖中的(6,7)轉(zhuǎn)換成Z點(diǎn)到地圖左邊緣和上邊緣的像素值,這里先直接用顯示坐標(biāo)轉(zhuǎn)換成地圖坐標(biāo)中的二元一次方程組求出x和y,同樣分條件:
當(dāng)i<H/h時(shí):
?? ??? ?x=hj-h
?? ??? ?y=h(2i-j+1)/2
當(dāng)i>=H/h時(shí):
?? ??? ?x=h(2i+j)-2H
?? ??? ?y=H-hj/2
以上公式是直接求解出來(lái)的,當(dāng)我們用放進(jìn)去計(jì)算的時(shí)候x值是正確的,但y值總是比真實(shí)值多了h/2。出現(xiàn)這種情況就要從對(duì)應(yīng)關(guān)系上去思考,地圖坐標(biāo)系統(tǒng)中的點(diǎn),比如(6,7),它實(shí)際對(duì)應(yīng)于顯示坐標(biāo)系統(tǒng)中的點(diǎn)不是Z點(diǎn),而是Z點(diǎn)下方h/2位置處的點(diǎn),把頭向左轉(zhuǎn)一點(diǎn)來(lái)看上圖,可以看到地圖坐標(biāo)中,點(diǎn)(6,7)的左上角(左上角就是坐標(biāo)點(diǎn))就是顯示坐標(biāo)中Z點(diǎn)下方h/2位置處,因此更正后得到轉(zhuǎn)換公式:
當(dāng)i<H/h時(shí):
?? ??? ?x=hj-h
?? ??? ?y=h(2i-j)/2
當(dāng)i>=H/h時(shí):
?? ??? ?x=h(2i+j)-2H
?? ??? ?y=H-h(j+1)/2
- 總結(jié)
數(shù)學(xué)是很有意思的,原本以為這些公式會(huì)與地圖傾斜的角度有關(guān),但計(jì)算后根號(hào)5這個(gè)值不存在了,不過(guò)這樣說(shuō)也不完全對(duì),因?yàn)榱庑螀^(qū)塊的高寬比正好是1比2,這樣導(dǎo)致公式最后也簡(jiǎn)潔很多。
轉(zhuǎn)載于:https://www.cnblogs.com/pains/archive/2009/08/08/1541753.html
總結(jié)
以上是生活随笔為你收集整理的AS3 RPG游戏引擎开发日志3:地图坐标转换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JAVA设计模式之装饰模式
- 下一篇: step3 . day2 数据结构之线性