《C++遊戲開發》十八 角色在障礙物中智能行走的實現

     最近一直在忙着寫一個遊戲,其中融入了RPG元素,有人物的行走與障礙物斷定。 數組

      通常而言,當人物行走時碰到障礙物時應該中止不動,就像下面這樣 app

      

 

      這樣的實現很是簡單,每次移動前判斷人物的矩形是否和障礙物相交便可,若是隻以向右的方向爲例,代碼大概能夠寫成這樣 spa

[cpp]   view plain copy
  1. if(行走)  
  2. {  
  3. switch(方向)  
  4. {  
  5. case 右:若是當前位置的右邊位置是障礙物,則不動,不然將人物移到右邊位置  
  6. break;    
  7. }  
  8. }  

      這看起來很是合理,我一開始也是按照這個思路寫的,可是當人物處於下面這種狀況時,即人物只有一部分碰撞到障礙物的時候 .net

      


      若是仍然像上面那樣,障礙物和人物矩形仍然是相交的,因此人物仍然是行走不了的,這在遊戲中能夠接受,可是看起來老是有一種違和感,爲何咱們的人物不能智能一點,在拐角處能夠繞過障礙物呢? blog


      下面是本身的想法和實現,但願能夠給新手朋友們參考,也但願路過的高手能夠指導下,畢竟本身對遊戲瞭解的不太多。 遊戲


      在上圖的狀況中,咱們看到人物(就是那隻可愛的小狗)向右行走的時候下半部分碰撞到了障礙物,而上半部分沒有碰撞到,那麼咱們但願出現的狀況就是小狗先向上行走一點,使得下半部分再也不與障礙物碰撞,而後向右行走。若是是上半部分碰撞到障礙物,而下半部分沒有碰撞到障礙物,那麼小狗應該向下行走一點,再向右行走。 ip

 

      另外,當處於下面這樣的狀況時 get

      


      若是小狗向右下方向行走時,那麼按照以前的判斷,小狗仍然是不會運動的。可是咱們想要的效果是小狗向下移動。 flash

 

      那麼,咱們怎麼樣實現這個效果呢? it

 

      事實上是很是簡單的。

 

      實現的思路有兩點關鍵:

      1.將運動方向分解,單獨進行x方向和y方向的判斷和運動。

      2.障礙判斷使用人物矩形的四個頂點進行。

       

      在遊戲中我使用了搖桿,那麼當是右上方向時,就分解爲向右運動和向上運動。在運動分解以後,第二種狀況即小狗沿牆向右下方向的移動就天然解決了,此時小狗運動方向被分解爲右方向和下方向,有方向上遇到障礙物沒法行走,可是下方向是暢通的,那麼就會出現小狗向下面移動的效果了。

 

      再回到咱們初始提出的問題,如今解決起來就很容易了。

      咱們能夠很容易的獲得小狗矩形的四個頂點,在不一樣的方向判斷中使用不一樣的點。

      例如:當向右運動時,咱們獲得右上頂點和右下頂點。

      判斷右上頂點和右下頂點是否遇到障礙物,會出現四種狀況

             1.右上頂點和右下頂點均是障礙物

                這顯示就是不可走的狀況

             2.右上頂點和右下頂點均不是障礙物

                這就是可通行的狀況

             3.右上頂點是障礙物,右下頂點不是障礙物

                此時人物應該向下運動,而後再向右運動,繞過障礙物

             4.右上頂點不是障礙物,右下頂點是障礙物

               人物應該向上運動,而後向右運動,繞過障礙物

 

       事實上若是咱們分解處理xy方向以後,對於3,4種狀況下,只須要處理前面一部分運動就能夠,即只向上下運動便可,由於遊戲中是在不斷接受玩家的按鍵信息,不斷的處理位置變化,當玩家按着右鍵的時候,在y方向上處理了上下運動通過障礙物後,在x方向的處理上天然處於能夠運動的狀態了,也就造成了繞過障礙物的效果。

 

      有了思路,實現能夠向下面這樣

 

[cpp]   view plain copy
  1. switch(方向)  
  2. {  
  3. case 右:if(狀況1)  
  4. 不做處理  
  5. else(狀況2)  
  6. 到達該位置,即x增長  
  7. else(狀況3)  
  8. 向下運動,即y增長  
  9. else(狀況4)  
  10. 向上運動,即y減小  
  11. break;  
  12. case  
  13. ……  
  14. }  

       實現中能夠用switch –case處理方向。可是寫完後就會發現大量的代碼都是同樣的,因此我是使用了數組,分xy方向分解,依次進行xy方向判斷,將上下左右分別添加了另外分解的一個方向,設爲不可通行,經過數組下標處理不一樣的狀況,看起來代碼就不累贅了。用switch-case語句最大的好處就是代碼很清晰,很容易看明白,缺點是重複代碼。用數組後代碼很簡潔,可是語義不是那麼清晰,有時過會本身就會混淆,囧。

相關文章
相關標籤/搜索