《C++游戏开发》十八 角色在障碍物中智能行走的实现
2019獨角獸企業重金招聘Python工程師標準>>>
? ? ?最近一直在忙著寫一個游戲,其中融入了RPG元素,有人物的行走與障礙物判定。
? ? ? 一般而言,當人物行走時碰到障礙物時應該停止不動,就像下面這樣
? ? ??
?
? ? ? 這樣的實現非常簡單,每次移動前判斷人物的矩形是否和障礙物相交即可,如果只以向右的方向為例,代碼大概可以寫成這樣
[cpp] view plain copy? ? ? 這看起來非常合理,我一開始也是按照這個思路寫的,但是當人物處于下面這種情況時,即人物只有一部分碰撞到障礙物的時候
? ? ??
? ? ? 如果仍然像上面那樣,障礙物和人物矩形仍然是相交的,所以人物仍然是行走不了的,這在游戲中可以接受,但是看起來總是有一種違和感,為什么我們的人物不能智能一點,在拐角處可以繞過障礙物呢?
? ? ? 下面是自己的想法和實現,希望可以給新手朋友們參考,也希望路過的高手可以指導下,畢竟自己對游戲了解的不太多。
? ? ? 在上圖的情況中,我們看到人物(就是那只可愛的小狗)向右行走的時候下半部分碰撞到了障礙物,而上半部分沒有碰撞到,那么我們希望出現的情況就是小狗先向上行走一點,使得下半部分不再與障礙物碰撞,然后向右行走。如果是上半部分碰撞到障礙物,而下半部分沒有碰撞到障礙物,那么小狗應該向下行走一點,再向右行走。
?
? ? ? 另外,當處于下面這樣的情況時
? ? ??
? ? ? 如果小狗向右下方向行走時,那么按照之前的判斷,小狗仍然是不會運動的。但是我們想要的效果是小狗向下移動。
?
? ? ? 那么,我們怎么樣實現這個效果呢?
?
? ? ? 事實上是非常簡單的。
?
? ? ? 實現的思路有兩點關鍵:
? ? ? 1.將運動方向分解,單獨進行x方向和y方向的判斷和運動。
? ? ? 2.障礙判斷使用人物矩形的四個頂點進行。
? ? ? ?
? ? ? 在游戲中我使用了搖桿,那么當是右上方向時,就分解為向右運動和向上運動。在運動分解之后,第二種情況即小狗沿墻向右下方向的移動就自然解決了,此時小狗運動方向被分解為右方向和下方向,有方向上遇到障礙物無法行走,但是下方向是暢通的,那么就會出現小狗向下面移動的效果了。
?
? ? ? 再回到我們初始提出的問題,現在解決起來就很容易了。
? ? ? 我們可以很容易的得到小狗矩形的四個頂點,在不同的方向判斷中使用不同的點。
? ? ? 例如:當向右運動時,我們得到右上頂點和右下頂點。
? ? ? 判斷右上頂點和右下頂點是否遇到障礙物,會出現四種情況
? ? ? ? ? ? ?1.右上頂點和右下頂點均是障礙物
? ? ? ? ? ? ? ? 這顯示就是不可走的情況
? ? ? ? ? ? ?2.右上頂點和右下頂點均不是障礙物
? ? ? ? ? ? ? ? 這就是可通行的情況
? ? ? ? ? ? ?3.右上頂點是障礙物,右下頂點不是障礙物
? ? ? ? ? ? ? ? 此時人物應該向下運動,然后再向右運動,繞過障礙物
? ? ? ? ? ? ?4.右上頂點不是障礙物,右下頂點是障礙物
? ? ? ? ? ? ? ?人物應該向上運動,然后向右運動,繞過障礙物
?
? ? ? ?事實上如果我們分解處理xy方向之后,對于3,4種情況下,只需要處理前面一部分運動就可以,即只向上下運動即可,因為游戲中是在不斷接受玩家的按鍵信息,不斷的處理位置變化,當玩家按著右鍵的時候,在y方向上處理了上下運動經過障礙物后,在x方向的處理上自然處于可以運動的狀態了,也就形成了繞過障礙物的效果。
?
? ? ? 有了思路,實現可以向下面這樣
?
[cpp] view plain copy? ? ? ?實現中可以用switch –case處理方向。但是寫完后就會發現大量的代碼都是一樣的,所以我是使用了數組,分xy方向分解,依次進行xy方向判斷,將上下左右分別添加了另外分解的一個方向,設為不可通行,通過數組下標處理不同的情況,看起來代碼就不累贅了。用switch-case語句最大的好處就是代碼很清晰,很容易看明白,缺點是重復代碼。用數組后代碼很簡潔,但是語義不是那么清晰,有時過會自己就會混淆,囧。
轉載于:https://my.oschina.net/u/1266191/blog/161224
總結
以上是生活随笔為你收集整理的《C++游戏开发》十八 角色在障碍物中智能行走的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis实现消息队列之生产消费模式
- 下一篇: 超好用Web草图工具Balsamiq M