【A*算法】如何描述物體的形狀,坦克大戰(zhàn)BOSS尋路
? ? 比如說(shuō),在FC游戲 【坦克大戰(zhàn)】?想要加入一個(gè)超大的BOSS,如何給這個(gè)BOSS尋路呢?

????首先來(lái)看一下這個(gè)BOSS的特點(diǎn):它的體型比普通坦克大得多,占據(jù)了4個(gè)單元格。所以,我們不能把前一期的A*算法的代碼直接套在它身上,因?yàn)橹暗拇a默認(rèn)了物體的形狀就是占一個(gè)單元格。
????那么該如何調(diào)整代碼呢?
????很簡(jiǎn)單,將任何需要尋路的物體都成質(zhì)點(diǎn),只有在碰撞檢測(cè)時(shí)才需要用到物體的形狀信息。
????所謂碰撞檢測(cè)就是,檢測(cè)物體在某個(gè)位置時(shí)是否會(huì)與障礙物發(fā)生碰撞。

形狀的表示
????首先說(shuō)明一下地圖坐標(biāo)系,以左上角那個(gè)單元格作為原點(diǎn),向右為x軸正方向,向下為y軸正方向。這個(gè)不是固定的,隨便取都可以,關(guān)鍵看你的愛好。
? ? 因?yàn)樯厦娴腂OSS坦克占據(jù)了四個(gè)單元格,所以,我們就可以用四個(gè)坐標(biāo)來(lái)表示它的形狀了。這四個(gè)坐標(biāo)是相對(duì)坐標(biāo),相對(duì)于物體的質(zhì)點(diǎn),因?yàn)槲矬w在尋路時(shí),當(dāng)前位置是會(huì)改變的,但是它的身體的各個(gè)點(diǎn)相對(duì)于質(zhì)點(diǎn)的坐標(biāo)卻是不變的。

???????

????質(zhì)點(diǎn)可以隨便取,物體身上的點(diǎn),不是物體身上的點(diǎn)都可以,我們只是需要一個(gè)坐標(biāo)原點(diǎn)來(lái)描述物體的其他點(diǎn)而已。
????比如說(shuō),我們?nèi)∩蠄D中BOSS坦克的左上角單元格作為質(zhì)點(diǎn),則可以用 (0, 0), (1, 0), (0, 1), (1, 1)來(lái)表示該物體。

碰撞檢測(cè)
????知道了物體的形狀,那么需要使用它的形狀信息來(lái)修改原來(lái)的A*算法代碼。
????只需要修改一處就夠了,非常簡(jiǎn)單。
????下面這個(gè)函數(shù)是檢測(cè)某個(gè)點(diǎn)是否有效點(diǎn)的函數(shù),也就是判斷物體是否能移動(dòng)到該點(diǎn),能移動(dòng)的條件是該點(diǎn)在地圖內(nèi),且該點(diǎn)是可以通行的(值為0)。

? ???現(xiàn)在只需要利用物體的相對(duì)坐標(biāo)求出物體的所有點(diǎn)的絕對(duì)坐標(biāo),并判斷地圖上該點(diǎn)是否有效就行了。也就是,point是質(zhì)點(diǎn)的坐標(biāo),質(zhì)點(diǎn)坐標(biāo)加上形狀中各個(gè)相對(duì)坐標(biāo)就得到了物體上那點(diǎn)現(xiàn)在的絕對(duì)坐標(biāo)。
????只要物體上有一點(diǎn)發(fā)生了碰撞,則整個(gè)物體就不可以通過(guò)該區(qū)域。
????代碼調(diào)整如下:
for (形狀中的每個(gè)點(diǎn)p)
{
?????????????? 絕對(duì)坐標(biāo) p1 = p + 質(zhì)點(diǎn)坐標(biāo)point
????????????? ?if(valid(p1) == false)
????????????????????return false;
}
return true;
????????
????