日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

《C++游戏开发》十八 角色在障碍物中智能行走的实现

發(fā)布時間:2025/3/17 c/c++ 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《C++游戏开发》十八 角色在障碍物中智能行走的实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

? ? ?最近一直在忙著寫一個游戲,其中融入了RPG元素,有人物的行走與障礙物判定。

? ? ? 一般而言,當人物行走時碰到障礙物時應該停止不動,就像下面這樣

? ? ??

?

? ? ? 這樣的實現(xiàn)非常簡單,每次移動前判斷人物的矩形是否和障礙物相交即可,如果只以向右的方向為例,代碼大概可以寫成這樣

[cpp] view plain copy
  • if(行走)??
  • {??
  • switch(方向)??
  • {??
  • case?右:如果當前位置的右邊位置是障礙物,則不動,否則將人物移到右邊位置??
  • break;????
  • }??
  • }??

  • ? ? ? 這看起來非常合理,我一開始也是按照這個思路寫的,但是當人物處于下面這種情況時,即人物只有一部分碰撞到障礙物的時候

    ? ? ??


    ? ? ? 如果仍然像上面那樣,障礙物和人物矩形仍然是相交的,所以人物仍然是行走不了的,這在游戲中可以接受,但是看起來總是有一種違和感,為什么我們的人物不能智能一點,在拐角處可以繞過障礙物呢?


    ? ? ? 下面是自己的想法和實現(xiàn),希望可以給新手朋友們參考,也希望路過的高手可以指導下,畢竟自己對游戲了解的不太多。


    ? ? ? 在上圖的情況中,我們看到人物(就是那只可愛的小狗)向右行走的時候下半部分碰撞到了障礙物,而上半部分沒有碰撞到,那么我們希望出現(xiàn)的情況就是小狗先向上行走一點,使得下半部分不再與障礙物碰撞,然后向右行走。如果是上半部分碰撞到障礙物,而下半部分沒有碰撞到障礙物,那么小狗應該向下行走一點,再向右行走。

    ?

    ? ? ? 另外,當處于下面這樣的情況時

    ? ? ??


    ? ? ? 如果小狗向右下方向行走時,那么按照之前的判斷,小狗仍然是不會運動的。但是我們想要的效果是小狗向下移動。

    ?

    ? ? ? 那么,我們怎么樣實現(xiàn)這個效果呢?

    ?

    ? ? ? 事實上是非常簡單的。

    ?

    ? ? ? 實現(xiàn)的思路有兩點關(guān)鍵:

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

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

    ? ? ? ?

    ? ? ? 在游戲中我使用了搖桿,那么當是右上方向時,就分解為向右運動和向上運動。在運動分解之后,第二種情況即小狗沿墻向右下方向的移動就自然解決了,此時小狗運動方向被分解為右方向和下方向,有方向上遇到障礙物無法行走,但是下方向是暢通的,那么就會出現(xiàn)小狗向下面移動的效果了。

    ?

    ? ? ? 再回到我們初始提出的問題,現(xiàn)在解決起來就很容易了。

    ? ? ? 我們可以很容易的得到小狗矩形的四個頂點,在不同的方向判斷中使用不同的點。

    ? ? ? 例如:當向右運動時,我們得到右上頂點和右下頂點。

    ? ? ? 判斷右上頂點和右下頂點是否遇到障礙物,會出現(xiàn)四種情況

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

    ? ? ? ? ? ? ? ? 這顯示就是不可走的情況

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

    ? ? ? ? ? ? ? ? 這就是可通行的情況

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

    ? ? ? ? ? ? ? ? 此時人物應該向下運動,然后再向右運動,繞過障礙物

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

    ? ? ? ? ? ? ? ?人物應該向上運動,然后向右運動,繞過障礙物

    ?

    ? ? ? ?事實上如果我們分解處理xy方向之后,對于3,4種情況下,只需要處理前面一部分運動就可以,即只向上下運動即可,因為游戲中是在不斷接受玩家的按鍵信息,不斷的處理位置變化,當玩家按著右鍵的時候,在y方向上處理了上下運動經(jīng)過障礙物后,在x方向的處理上自然處于可以運動的狀態(tài)了,也就形成了繞過障礙物的效果。

    ?

    ? ? ? 有了思路,實現(xiàn)可以向下面這樣

    ?

    [cpp] view plain copy
  • switch(方向)??
  • {??
  • case?右:if(情況1)??
  • 不作處理??
  • else(情況2)??
  • 到達該位置,即x增加??
  • else(情況3)??
  • 向下運動,即y增加??
  • else(情況4)??
  • 向上運動,即y減少??
  • break;??
  • case??
  • ……??
  • }??

  • ? ? ? ?實現(xiàn)中可以用switch –case處理方向。但是寫完后就會發(fā)現(xiàn)大量的代碼都是一樣的,所以我是使用了數(shù)組,分xy方向分解,依次進行xy方向判斷,將上下左右分別添加了另外分解的一個方向,設(shè)為不可通行,通過數(shù)組下標處理不同的情況,看起來代碼就不累贅了。用switch-case語句最大的好處就是代碼很清晰,很容易看明白,缺點是重復代碼。用數(shù)組后代碼很簡潔,但是語義不是那么清晰,有時過會自己就會混淆,囧。

    轉(zhuǎn)載于:https://my.oschina.net/u/1266191/blog/161224

    總結(jié)

    以上是生活随笔為你收集整理的《C++游戏开发》十八 角色在障碍物中智能行走的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。