C語言C加加遊戲開發 十八角色在障礙物中智能行走的實現
最近一直在忙著寫一個遊戲,其中融入了RPG元素,有人物的行走與障礙物判定。一般而言,當人物行走時碰到障礙物時應該停止不動,就像下面這樣
想要一起學習C語言C++的可以加裙二九九 四 一 一五九六,裙內有各種資料滿足大家,更新最新行業行情
這樣的實現非常簡單,每次移動前判斷人物的矩形是否和障礙物相交即可,如果只以向右的方向為例,代碼大概可以寫成這樣
[cpp]view plain copy
if(行走)
{
switch(方向)
{
case 右:如果當前位置的右邊位置是障礙物,則不動,否則將人物移到右邊位置
break;
}
}
這看起來非常合理,我一開始也是按照這個思路寫的,但是當人物處於下面這種情況時,即人物只有一部分碰撞到障礙物的時候
想要一起學習C語言C++的可以加裙二九九 四 一 一五九六,裙內有各種資料滿足大家,更新最新行業行情
如果仍然像上面那樣,障礙物和人物矩形仍然是相交的,所以人物仍然是行走不了的,這在遊戲中可以接受,但是看起來總是有一種違和感,為什麼我們的人物不能智能一點,在拐角處可以繞過障礙物呢?
下面是自己的想法和實現,希望可以給新手朋友們參考,也希望路過的高手可以指導下,畢竟自己對遊戲了解的不太多。
在上圖的情況中,我們看到人物(就是那隻可愛的小狗)向右行走的時候下半部分碰撞到了障礙物,而上半部分沒有碰撞到,那麼我們希望出現的情況就是小狗先向上行走一點,使得下半部分不再與障礙物碰撞,然後向右行走。如果是上半部分碰撞到障礙物,而下半部分沒有碰撞到障礙物,那麼小狗應該向下行走一點,再向右行走。
另外,當處於下面這樣的情況時
想要一起學習C語言C++的可以加裙二九九 四 一 一五九六,裙內有各種資料滿足大家,更新最新行業行情
如果小狗向右下方向行走時,那麼按照之前的判斷,小狗仍然是不會運動的。但是我們想要的效果是小狗向下移動。
那麼,我們怎麼樣實現這個效果呢?
事實上是非常簡單的。
實現的思路有兩點關鍵:
1.將運動方向分解,單獨進行x方向和y方向的判斷和運動。
2.障礙判斷使用人物矩形的四個頂點進行。
想要一起學習C語言C++的可以加裙二九九 四 一 一五九六,裙內有各種資料滿足大家,更新最新行業行情
在遊戲中我使用了搖桿,那麼當是右上方向時,就分解為向右運動和向上運動。在運動分解之後,第二種情況即小狗沿牆向右下方向的移動就自然解決了,此時小狗運動方向被分解為右方向和下方向,有方向上遇到障礙物無法行走,但是下方向是暢通的,那麼就會出現小狗向下面移動的效果了。
再回到我們初始提出的問題,現在解決起來就很容易了。
我們可以很容易的得到小狗矩形的四個頂點,在不同的方向判斷中使用不同的點。
例如:當向右運動時,我們得到右上頂點和右下頂點。
判斷右上頂點和右下頂點是否遇到障礙物,會出現四種情況
1.右上頂點和右下頂點均是障礙物
這顯示就是不可走的情況
2.右上頂點和右下頂點均不是障礙物
這就是可通行的情況
3.右上頂點是障礙物,右下頂點不是障礙物
此時人物應該向下運動,然後再向右運動,繞過障礙物
4.右上頂點不是障礙物,右下頂點是障礙物
人物應該向上運動,然後向右運動,繞過障礙物
事實上如果我們分解處理xy方向之後,對於3,4種情況下,只需要處理前面一部分運動就可以,即只向上下運動即可,因為遊戲中是在不斷接受玩家的按鍵信息,不斷的處理位置變化,當玩家按著右鍵的時候,在y方向上處理了上下運動經過障礙物後,在x方向的處理上自然處於可以運動的狀態了,也就形成了繞過障礙物的效果。
想要一起學習C語言C++的可以加裙二九九 四 一 一五九六,裙內有各種資料滿足大家,更新最新行業行情
有了思路,實現可以向下面這樣
[cpp]view plain copy
switch(方向)
{
case 右:if(情況1)
不作處理
else(情況2)
到達該位置,即x增加
else(情況3)
向下運動,即y增加
else(情況4)
向上運動,即y減少
break;
case
……
}
實現中可以用switch –case處理方向。但是寫完後就會發現大量的代碼都是一樣的,所以我是使用了數組,分xy方向分解,依次進行xy方向判斷,將上下左右分別添加了另外分解的一個方向,設為不可通行,通過數組下標處理不同的情況,看起來代碼就不累贅了。用switch-case語句最大的好處就是代碼很清晰,很容易看明白,缺點是重複代碼。用數組後代碼很簡潔,但是語義不是那麼清晰,有時過會自己就會混淆,囧。
想要一起學習C語言C++的可以加裙二九九 四 一 一五九六,裙內有各種資料滿足大家,更新最新行業行情
點擊展開全文
※國內的C語言C加加遊戲程序員是否有前途?
※聽說C語言C加加要消失了?嚇我一跳
※C加加遊戲開發需要學什麼,你知道嗎?
※學好這幾點,你就學會了C語言
※學習C語言和C加加僅僅是為了高工資嗎?
TAG:萌萌的程序員 |