2020年10月18日 星期日

pygame玩遊戲系列(8)~談談pygame中二個物件是否發生「碰撞」的檢核機制

 前面已經談過一些pygame遊戲中的物件操控及設定的概念

但是遊戲中很基本的一個「碰撞」檢核,一直沒有介紹的~~所以遊戲只能很無聊的動動滑鼠、鍵盤,以及想辦法讓物件自動移動(飄落、上升...)等等,當然更不用談所謂的「計分」、「射擊」等等遊戲元素的設計!

所以囉~~這次就趕緊先來談一下pygame中所謂的是否發生「碰撞」這個概念!

當然,pygame本身就已經有所謂的「(群組)碰撞檢核」模組可供呼叫使用

但是對學習程式本身而言,「知其所以然」個人認為是相當重要的~不然很可能發生你自己寫了些甚麼東西,自己都不知道的窘境(我自己以前就是如此)!以至於想要做一些精進或改寫一些需求或設計時,根本不知從何下手!只有自己對其基本概念有所釐清,才能充分掌握內建模組的設計及設定理念,遇到問題時也才知道如何思考、或精進!

好了~~這次就單純以遊戲視窗中二個物件是否發生碰撞來做簡單的概念說明及操作示範!

所謂的二個物件發生「碰撞」,其實就是檢查二個物件的「區塊(矩形座標物件)」是否發生「重疊」在一起的狀態!

所以要檢核二個物件是否發生「重疊」就是遊戲中二個物件是否發生「碰撞」的核心!

好囉~~那剩下的問題就是:在程式中如何去檢核二個物件是否發生重疊呢?

(大家可以自己先思考看看~~~二個矩形物件是否重疊的條件是甚麼呢?如何寫出一個完整的判斷式呢?)

先參考以下的幾張圖表,在思考看看~不一定要受限圖表上的說明及參數,你也可以用自己的思考模式去創造自己的檢核機制!(但記得一定要從二個物件「前、後、左、右」不同的相對關係去進行多重檢核喔!)




以上~那些是發生重疊(碰撞)的狀態呢?條件是甚麼?

我呢~~依據自身對碰撞的邏輯思考,用pygame寫了個小程式方便自己釐清及操作所謂的「碰撞」檢測機制,紀錄及分享如下:(在百貨公司地下街中錄製的,就請別要求語音的清晰了...呵!)


從上面整個說明及影片操作中,可以看出~~其實二個物件的碰撞檢核機制就是:

(二物件中心點x座標的距離(差值)絕對值 < 二物件寬度一半(obj.width/2)的總和) 並且滿足 (二物件中心點y座標的距離(差值)絕對值 < 二物件高度一半(obj.height/2)的總和)

***要注意清楚了解使用「絕對值」的概念及用意喔

最後轉換成pygame(python)的程式語法,就成為以下的判斷式:

(abs((gift_rect.centerx - car_rect.centerx)) < (gift_rect.width/2 + car_rect.width/2)) and  (abs(int(gift_rect.centery - car_rect.centery)) < int(gift_rect.height / 2 + car_rect.height / 2))

當然要充分理解上述的判斷式~~必須要先充分理解前面 介紹過的pygame.rect矩形座標物件的概念

好了~這次先到這裡囉!後續再找時間紀錄一下如何透過上面的碰撞檢核機制讓遊戲變得更有趣!

(筆電沒電了🤣~用手機輸入寫文章會瘋掉啊⋯⋯🥵)

沒有留言:

張貼留言