天天看點

pygame-KidsCanCode系列jumpy-part13-改進跳躍

這節研究下跳躍如何做得更自然,先看看之前的跳躍有什麼問題,我們把settings.py裡的初始化參數調整下:

pygame-KidsCanCode系列jumpy-part13-改進跳躍
pygame-KidsCanCode系列jumpy-part13-改進跳躍

View Code

同時,把Platform類微調一下,隻加載長的跳闆:

pygame-KidsCanCode系列jumpy-part13-改進跳躍
pygame-KidsCanCode系列jumpy-part13-改進跳躍
pygame-KidsCanCode系列jumpy-part13-改進跳躍

仔細觀察一下,有二個問題:

1. (當跳闆上下間隔較小時)player越過第2塊跳闆(從下向上數,初始時,站着的那塊為1),直接蹦到第3塊上去了,有點不太自然,如果頭頂有闆的話,最好是落在最低的那塊上

2.從第3塊,向下落到第2塊時,繼續向左走,理論上應該落到第1塊闆上,但是無論如何,總是會被第3塊闆自動吸上去。

原因:連續碰到多個跳闆時,碰撞檢測傳回的是一個被碰到的跳闆數組,hits[0]傳回的是最高的那塊,是以總是被吸上去。

改進思路:找出最低那塊,後面的就好處理了。

改進後的效果:

pygame-KidsCanCode系列jumpy-part13-改進跳躍

搞定這個,還有一個小問題:

pygame-KidsCanCode系列jumpy-part13-改進跳躍

當player走到跳闆邊緣時,實際上确實發生了碰撞(從垂直方向上看,player的身體與跳闆有重疊,即碰撞),但從視覺上看,雙腳已經離開跳闆了,應該向下掉,看上去不太真實。

改進辦法:

發生碰撞時,對比player.centerx(角色的x軸中心點)與跳闆的left/right值,隻有x軸中心點未離開跳闆時,才認為真正發生了碰撞。

仍然是修改剛才的碰撞檢測代碼:(注:具體實作時,下面的代碼在兩側保留了5px的餘量,大家可以調整下這個值,以控制檢測的靈敏度)

效果:

pygame-KidsCanCode系列jumpy-part13-改進跳躍

最後一個可以改進的地方,玩過超級瑪麗的大概還記得這麼一個細節:跳躍時,如果空格鍵按得比較重,會跳得較高,反之如果輕輕按一下,馬上松開,跳躍的高度相對就很少。

分析一下其中的原理,其實按鍵較重時,『按下的時間』相對輕輕一按馬上擡起,會略長一點。是以,關鍵在于KEYUP事件,隻要在該事件中,想辦法快速終止跳躍,自然向上跳的高度就小。

在event事件中,先添加對KEYUP的響應:

pygame-KidsCanCode系列jumpy-part13-改進跳躍
pygame-KidsCanCode系列jumpy-part13-改進跳躍

然後在Player類中,新增jump_cut函數:

pygame-KidsCanCode系列jumpy-part13-改進跳躍
pygame-KidsCanCode系列jumpy-part13-改進跳躍

如果覺得vel.y=1這樣有點粗暴(相當于把上升直接驟變為下降),也可以改進成下面這樣:

pygame-KidsCanCode系列jumpy-part13-改進跳躍
pygame-KidsCanCode系列jumpy-part13-改進跳躍

即:如果上升過快(即向上跳的速度過大),則讓它變成一個較小的速度-3px,這樣從視覺上看運動過程要連貫一些。

此外,jump函數中,也要結合self.jumping标志位一起判斷,同時要設定jumping标志位的值:

pygame-KidsCanCode系列jumpy-part13-改進跳躍
pygame-KidsCanCode系列jumpy-part13-改進跳躍

另外,在下落停在檔闆上時,需要把jumping狀态設定為False(main.py中的update函數裡微調):

pygame-KidsCanCode系列jumpy-part13-改進跳躍
pygame-KidsCanCode系列jumpy-part13-改進跳躍

效果如下:

pygame-KidsCanCode系列jumpy-part13-改進跳躍

源碼:https://github.com/yjmyzz/kids-can-code/tree/master/part_13

作者:菩提樹下的楊過

本文版權歸作者,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。