最近一直在忙着寫一個遊戲,其中融入了RPG元素,有人物的行走與障礙物斷定。 數組
通常而言,當人物行走時碰到障礙物時應該中止不動,就像下面這樣 app
這樣的實現很是簡單,每次移動前判斷人物的矩形是否和障礙物相交便可,若是隻以向右的方向爲例,代碼大概能夠寫成這樣 spa
這看起來很是合理,我一開始也是按照這個思路寫的,可是當人物處於下面這種狀況時,即人物只有一部分碰撞到障礙物的時候 .net
若是仍然像上面那樣,障礙物和人物矩形仍然是相交的,因此人物仍然是行走不了的,這在遊戲中能夠接受,可是看起來老是有一種違和感,爲何咱們的人物不能智能一點,在拐角處能夠繞過障礙物呢? blog
下面是本身的想法和實現,但願能夠給新手朋友們參考,也但願路過的高手能夠指導下,畢竟本身對遊戲瞭解的不太多。 遊戲
在上圖的狀況中,咱們看到人物(就是那隻可愛的小狗)向右行走的時候下半部分碰撞到了障礙物,而上半部分沒有碰撞到,那麼咱們但願出現的狀況就是小狗先向上行走一點,使得下半部分再也不與障礙物碰撞,而後向右行走。若是是上半部分碰撞到障礙物,而下半部分沒有碰撞到障礙物,那麼小狗應該向下行走一點,再向右行走。 ip
另外,當處於下面這樣的狀況時 get
若是小狗向右下方向行走時,那麼按照以前的判斷,小狗仍然是不會運動的。可是咱們想要的效果是小狗向下移動。 flash
那麼,咱們怎麼樣實現這個效果呢? it
事實上是很是簡單的。
實現的思路有兩點關鍵:
1.將運動方向分解,單獨進行x方向和y方向的判斷和運動。
2.障礙判斷使用人物矩形的四個頂點進行。
在遊戲中我使用了搖桿,那麼當是右上方向時,就分解爲向右運動和向上運動。在運動分解以後,第二種狀況即小狗沿牆向右下方向的移動就天然解決了,此時小狗運動方向被分解爲右方向和下方向,有方向上遇到障礙物沒法行走,可是下方向是暢通的,那麼就會出現小狗向下面移動的效果了。
再回到咱們初始提出的問題,如今解決起來就很容易了。
咱們能夠很容易的獲得小狗矩形的四個頂點,在不一樣的方向判斷中使用不一樣的點。
例如:當向右運動時,咱們獲得右上頂點和右下頂點。
判斷右上頂點和右下頂點是否遇到障礙物,會出現四種狀況
1.右上頂點和右下頂點均是障礙物
這顯示就是不可走的狀況
2.右上頂點和右下頂點均不是障礙物
這就是可通行的狀況
3.右上頂點是障礙物,右下頂點不是障礙物
此時人物應該向下運動,而後再向右運動,繞過障礙物
4.右上頂點不是障礙物,右下頂點是障礙物
人物應該向上運動,而後向右運動,繞過障礙物
事實上若是咱們分解處理xy方向以後,對於3,4種狀況下,只須要處理前面一部分運動就能夠,即只向上下運動便可,由於遊戲中是在不斷接受玩家的按鍵信息,不斷的處理位置變化,當玩家按着右鍵的時候,在y方向上處理了上下運動通過障礙物後,在x方向的處理上天然處於能夠運動的狀態了,也就造成了繞過障礙物的效果。
有了思路,實現能夠向下面這樣
實現中能夠用switch –case處理方向。可是寫完後就會發現大量的代碼都是同樣的,因此我是使用了數組,分xy方向分解,依次進行xy方向判斷,將上下左右分別添加了另外分解的一個方向,設爲不可通行,經過數組下標處理不一樣的狀況,看起來代碼就不累贅了。用switch-case語句最大的好處就是代碼很清晰,很容易看明白,缺點是重複代碼。用數組後代碼很簡潔,可是語義不是那麼清晰,有時過會本身就會混淆,囧。