平台游戏中走与跳的实现
內(nèi)容簡(jiǎn)述:
平臺(tái)游戲中,如何在動(dòng)作操作方面達(dá)到《Celeste》,《死亡細(xì)胞》等作品那樣的效果(手感),單純使用物理引擎是比較難做到的,因?yàn)槲覀冃枰恍┓闯WR(shí)的運(yùn)動(dòng)效果,而這些效果可能是多種運(yùn)動(dòng)組成的,為了更精細(xì)的控制物理運(yùn)動(dòng),需要對(duì)每一種動(dòng)作的物理運(yùn)動(dòng)做特定的建模與調(diào)參。
本文會(huì)針對(duì)平臺(tái)類的游戲,針對(duì)走路,和跳躍這兩個(gè)行為,從實(shí)現(xiàn)原理上做一些解釋,為了更清晰的表述,文中會(huì)使用偽代碼來解釋。讀完文章,你會(huì)了解走,跳的一種實(shí)現(xiàn)思路。話不多說,讓我們開始吧。
簡(jiǎn)化:
平臺(tái)類游戲,最常見的物體會(huì)有,地板,墻,角色這三種,首先我們需要簡(jiǎn)化其幾何模型,因?yàn)檫@會(huì)大大提高后邊物理計(jì)算的效率,也更直觀,更容易理解。
?
游戲循環(huán):
游戲循環(huán),幾乎所有的游戲都有一個(gè)叫游戲循環(huán)的部分,這部分代碼會(huì)被一遍一遍的執(zhí)行,直到游戲結(jié)束。功能上通常包括收集用戶的輸入,更新所有物體的狀態(tài),渲染成圖等。邏輯如圖
?
每一個(gè)Update函數(shù)負(fù)責(zé)改變游戲內(nèi)所有物體的信息,后邊的Render會(huì)根據(jù)數(shù)據(jù)生成一張圖片,也就是常說的一幀。這篇文章所討論的問題就是:在Update函數(shù)中,如何計(jì)算出每一幀玩家的位置。
走:
?
從上圖中可以看出來,物體當(dāng)前幀的位置可以根據(jù)上一幀的位置來計(jì)算出來。
?
第3行用來計(jì)算偏移距離,即:偏移距離=運(yùn)動(dòng)速度x時(shí)差。
第4行用來計(jì)算當(dāng)前幀物體的位置,即:當(dāng)前幀物體的位置=上一幀物體的位置+偏移距離。
利用上邊的實(shí)現(xiàn),我們已經(jīng)可以使角色運(yùn)動(dòng)起來了。
?
?
加入墻體:
當(dāng)加入墻體后,需要對(duì)墻體做特殊處理,以保證角色不會(huì)直接穿過墻體。
?
用線段A去和外圍的世界做碰撞檢測(cè),如果有交點(diǎn),那么則代表碰撞到物體,需要修正偏移距離。線段A的一個(gè)端點(diǎn)可以選擇上一幀物體的中心,另一個(gè)端點(diǎn)可以根據(jù)當(dāng)前速度,時(shí)差來計(jì)算出。那么,代碼就變成了這樣:
?
新加入的代碼:使用線段與場(chǎng)景內(nèi)的物體進(jìn)行求交檢測(cè),如果有交點(diǎn),更新偏移距離。利用上述代碼,角色將會(huì)被墻壁擋住。
?
處理坑:
如果用上述代碼來讓角色走過一個(gè)坑洞時(shí),角色會(huì)并不會(huì)掉落下去,而是直接走過,所以需要特殊處理有坑洞的情況。賣手機(jī)號(hào)碼平臺(tái)思路是,首先檢測(cè)坑洞,如果沒有檢測(cè)到,則保持水平行走,如果檢測(cè)到坑洞,則切換物體為掉落狀態(tài)。
檢測(cè)坑洞具體的方法是向下做一個(gè)線段進(jìn)行碰撞檢測(cè),如果沒有碰撞到物體,代表下邊就是一個(gè)坑了。貼出加入坑洞處理的代碼。
?
第3行添加了狀態(tài)檢測(cè),角色的狀態(tài)除了走路之外,還會(huì)有跳躍,沖刺……等其它狀態(tài),所以在此我們添加一個(gè)變量state用來追蹤當(dāng)前玩家的狀態(tài),以區(qū)分和管理角色的行為。
第10-14行:利用垂直線段向下進(jìn)行碰撞檢測(cè),如果有交點(diǎn),那么修改垂直偏移距離。
第16行:如果檢測(cè)到坑洞,則改變角色當(dāng)前狀態(tài)為“下落”
下落狀態(tài):
下落是從跳躍的最高點(diǎn)處開始向下,直到落地的這個(gè)間隔。或者是在走路時(shí)遇到坑洞后,掉落的這個(gè)過程。下落過程中,處理情況和行走是非常的相似的。
?
第16行,在行走的過程中,如果向下方的碰撞測(cè)試沒有檢測(cè)的地面,這時(shí)需要改變?yōu)橄侣錉顟B(tài)。
第20-23行,在下落的過程中,檢測(cè)橫向的墻面,如果有碰撞,需要修正偏移的距離。
第25-30行,在下落的過程中,如果向下方的碰撞測(cè)試,檢測(cè)到了地面,需要修正垂直偏移距離。
?
?
起跳:
起跳是從離開地面到最高點(diǎn)這段過程,當(dāng)收到玩家指定時(shí),進(jìn)入跳躍狀態(tài),代碼如下:
?
第39-41行,在起跳的過程中,如果達(dá)到了跳躍的最高高度,那么應(yīng)該切換到下落狀態(tài)。
第43-49行,和前邊的代碼行為是類似的。
?
?
總結(jié):
通過上述的描述,我們已經(jīng)可以實(shí)現(xiàn)出平臺(tái)游戲中走與跳的行為了,并且可以方便的擴(kuò)展出更多的運(yùn)動(dòng)效果,比如:
?
- 走路的滑動(dòng)
- 落地彈一下
- just-in-time jump
- 碰到墻上反彈
- 走路時(shí)加速
- 加速跳
- ……
為了用盡量短小的篇幅說明問題,文中刪減了一些和物理實(shí)現(xiàn)無關(guān)的問題,比如動(dòng)畫管理切換,用戶輸入采集等……文中的截圖,均是采用上述方法實(shí)現(xiàn)的。
總結(jié)
以上是生活随笔為你收集整理的平台游戏中走与跳的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Unity盖房子(一):《勇者斗恶龙:
- 下一篇: 地球那么大的开放世界游戏怎么做?腾讯云高