iT邦幫忙

2026 iThome 鐵人賽

DAY 22
0
自我挑戰組

學習用Pygame製作小專案系列 第 22 篇

Day22 今天加入了重力,垂直移動方式改成能跳躍,和改寫了一些之前的函式

  • 分享至 

  • xImage
  •  

今天我們創造了***重力!***我在主角的class中寫入了一個新的函式,叫做fell,它負責讓主角受重力影響,往下掉,為了這個,主角加入了幾個屬性:YAxisMove(Y軸移動)、onTheGround(在地上,是個布林值)、fellCounter(下墜的計數器,負責計算該不該加速下墜了),fell這個函式做的事很簡單:

  • 讓主角的座標改動YAxisMove變數的值的距離
  • fellCounter增加1,紀錄又過了一回合
  • 當fellCounter來到5時,且沒下墜速度不超過50,讓YAxisMove的下墜速度增加5
    為甚麼要設下墜的終端速度,因為如果下墜被加到太快,每次移動超過了碰撞箱的長度時,就會開始出現一些空間是不會被碰到的,不會被碰撞判定,角色就可能直接穿牆而過,還有就是掉落的太快會難以操控、畫面一格一格變明顯之類的。為甚麼要用fellCounter是為了避免下墜速度加速太快,雖然可以把增加的量變少,但那會沒辦法把座標控制在5的倍數。
    這樣就有下墜效果了,但這時還不完整,我在之前的bounceBack函式中(判斷是否有碰撞到輸入的東西,然後將角色移出輸入的東西的範圍),的程式中如果發現碰撞的面是下方了話,那就是站到東西上了,會將onTheGround改成True、YxisMove改成0(下墜速度重置)這樣。
    然後是跳躍,原本是直接往上移動,改y座標,但是現在改成如果onTheGround==True,將YAxis設為20這代表當在地上時按上,角色會獲得20向上移動的速度,會隨著重力減少。
    這樣有重力的移動模式就完成了。
    再來就是改了兩個寫法,我刪掉了主角的碰撞箱屬性,改成和類別地圖矩陣一樣,用getBounceRect()函式來得到碰撞箱,這樣要移動時就能直接改座標這個屬性,不用再跟著更新碰撞箱了;再來是我把drawMapCharater的函式改寫了,原本是輸入一張圖和它在地圖的座標,來把它畫在畫面上的正確位置,現在改成是直接輸入角色,函式自己來調出角色的圖片和角色位置,用起來更方便了,代價是如果我只是純粹要放張圖在地圖上沒辦法用這方法,目前感覺遇到的機會不多。
    今天的進度是這樣。

上一篇
Day21 做了阻擋人的函式了,還有做了地圖上矩陣的類別了
下一篇
Day23 今天想寫地圖創建工具,結果花大半天在跟蠢問題打架
系列文
學習用Pygame製作小專案 共 23 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言