天天看點

pygame-KidsCanCode系列jumpy-part0-使用sprite

pygame-KidsCanCode系列jumpy-part0-使用sprite

油管(youtube)上有一個号稱"史上最好的pygame教程",作者思路很清晰,循序漸進,很适合大人學會了,然後指導孩子入門。作者還有一個專門的網站,鑒于國内~翻*牆不友善,把主要内容記錄在此備忘。

本篇主要是sprite的入門使用:

pygame開發,有一個所謂的最小架構(或稱為模闆),大概長下面這個樣子:

開發新遊戲時,把上面這個模闆複制一份新的,然後改改裡面update/draw這二個部分即可。為了友善新同學了解"模闆"的處理流程,從視訊中截了二張圖:

pygame-KidsCanCode系列jumpy-part0-使用sprite
pygame-KidsCanCode系列jumpy-part0-使用sprite

可以有同學注意到了,代碼頭部有很多常量定義,按子產品化的思想,可以把這些常量定義單獨提取出來,放到一個settings.py檔案裡,以後修改起來會比較友善。

把剛才的模闆,拷一份新的出來,引用這個settings.py,同時把我們的主角sprite也加進來

注1:第2行導入的寫法,留意一下,主要是目錄的指定,參考下圖的目錄結構

pygame-KidsCanCode系列jumpy-part0-使用sprite

注2:pygame.sprite.sprite這個類,如果檢視源碼,有一段英文說明

大意是說,如果子類繼承自sprite類,可以重寫update(),同時可以指定image、rect屬性,最後__init__初始化(構造函數)首行,必須調用父類的__init__方法。

我們自定義了一個player的sprite,同時在update()方法中,做了一些邏輯處理,主要是讓rect對象每幀橫向向右移動5px,同時加入了邊界檢測,如果向右跑出視窗區域,則把它放到左側,繼續運動(視覺上看,感覺運動是連貫的)。

注: 讓對象移動的方法有n種,要點無非就是改變對象外切矩形rect的某個屬性,rect對象提供了n多與位置(及大小)相關的屬性,幾乎是想你所想:

  

關于sprite以及sprite的group,有幾個重要的屬性:

sprite.kill() --字面上講,就是殺死精靈,調用該方法後,如果這個sprite加入了多個group,将同步把自己從所有group中移除。 

group.spritecollide() --即:精靈之間的碰撞檢測,pygame已經封裝好了,不用開發人員再去傷腦筋了(後面我們會大量使用該方法)

這是該方法的說明,大意是說,傳回值是一個清單,裡面包含了發生碰撞的所有sprite的rect對象;另外dokill參數,如果指定為true,則表示将發生碰撞的sprite殺死;最後一個collided可以指定回調方法。

剛才的代碼,運動起來後,效果如下:

pygame-KidsCanCode系列jumpy-part0-使用sprite

如果覺得一個小方塊,比較枯燥,可以換一個圖檔,推薦一個網站:https://opengameart.org/ 上面有大量的免費遊戲素材,随便挑幾張圖檔:

pygame-KidsCanCode系列jumpy-part0-使用sprite

代碼如下:

pygame-KidsCanCode系列jumpy-part0-使用sprite

作者:菩提樹下的楊過

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