pygame演示----黑猩猩小游戏
pygame演示----黑猩猩小游戲
導入模塊
這是將所有需要的模塊導入到程序中的代碼。它還檢查一些可選的pygame模塊的可用性。
首先,我們導入標準的"os"和"sys" python模塊。它們允許我們做一些事情,比如創建平臺獨立的文件路徑。
在下一行中,我們導入pygame包。當pygame被導入時,它會導入屬于pygame的所有模塊。一些pygame模塊是可選的,如果沒有找到它們,它們的值將被設置為None。
有一個特殊的pygame模塊叫做locals。這個模塊包含pygame的一個子集。這個模塊的成員是常用的常量和函數,它們被證明可以放入程序的全局命名空間中。這個locals模塊包括“Rect”等函數來創建一個矩形對象,以及許多常量,如“QUIT, HWSURFACE”,這些常量用于與pygame的其余部分交互。像這樣將locals模塊導入全局命名空間完全是可選的。如果您選擇不導入它,則所有locals的成員在pygame模塊中總是可用的。
最后,如果pygame中的字體或混音模塊不可用,我們決定打印一個漂亮的警告消息。
加載資源
這里我們有兩個函數可以用來加載圖像和聲音。我們將在本節中分別研究每個函數。
這個函數接受要加載的圖像的名稱。它還可以選擇接受一個參數,用于設置圖像的顏色鍵。顏色鍵在圖形中用于表示圖像的一種顏色,它是透明的。
這個函數做的第一件事是創建文件的完整路徑名。在本例中,所有資源都在“data”子目錄中。通過使用os.path.join函數,將創建一個路徑名,該路徑名適用于游戲所運行的任何平臺。
接下來,我們使用pygame.image.load()從文件(或類文件對象)函數加載新圖像。我們將這個函數包裝在一個try/except塊中,因此如果在加載圖像時出現問題,我們可以優雅地退出。加載圖像后,我們對convert()函數進行重要調用。這將生成一個Surface的新副本,并將其顏色格式和深度轉換為與顯示器匹配的顏色。這意味著將圖像以盡可能快的速度分割到屏幕上。
最后,我們為圖像設置顏色鍵。如果用戶為colorkey參數提供了一個參數,我們就使用這個值作為圖像的colorkey。這通常只是一個顏色RGB值,就像白色的(255,255,255)。您還可以傳遞一個值-1作為colorkey。在本例中,該函數將在圖像的toppleft像素處查找顏色,并將該顏色用作顏色鍵。
接下來是加載聲音文件的函數。這個函數做的第一件事是檢查是否pygame。加載和播放聲音的Mixerpygame模塊被正確導入。如果不是,它返回一個小的類實例,它有一個虛擬的play方法。這將足夠像一個正常的聲音對象運行這個游戲,沒有任何額外的錯誤檢查。
這個函數類似于圖像加載函數,但處理一些不同的問題。首先,我們創建聲音圖像的完整路徑,并在try/except塊中加載聲音文件。然后我們簡單地返回加載的Sound對象。
游戲對象類
在這里,我們創建了兩個類來表示游戲中的對象。幾乎所有的游戲邏輯都包含在這兩個類中。我們將在這里逐一查看。
這里我們創建了一個類來表示玩家的拳頭。它派生自pygame中包含的Sprite類。帶有基本游戲對象類模塊的Spritepygame模塊。創建該類的新實例時調用__init__函數。我們要做的第一件事是確保調用基類的__init__函數。這允許Sprite的__init__函數準備我們的對象作為一個Sprite使用。這個游戲使用了一個精靈繪圖組類。這些類可以繪制具有“image”和“rect”屬性的精靈。通過簡單地更改這兩個屬性,渲染器將在當前位置繪制當前圖像。
所有精靈都有一個update()方法。這個函數通常每幀調用一次。這是你應該放置用于移動和更新精靈變量的代碼的地方。拳頭的update()方法將拳頭移動到鼠標指針的位置。如果拳頭處于“出拳”狀態,它也會略微抵消拳頭的位置。
下面兩個函數punch()和unpunch()改變拳頭的打孔狀態。如果拳頭與給定的目標精靈發生碰撞,punch()方法也會返回一個真值。
黑猩猩班比拳頭班做的工作多一點,但沒有比拳頭更復雜。這個類將在屏幕上來回移動黑猩猩。當猴子被打了一拳后,它會旋轉起來,達到令人興奮的效果。這個類也是從基Sprite類派生出來的,初始化方式和fist一樣。在初始化時,類還將屬性“area”設置為顯示屏幕的大小。
黑猩猩的更新函數只是查看當前的“眩暈”狀態,這在猴子被擊打后旋轉時是正確的。它調用_spin或_walk方法。這些函數前面有一個下劃線。這只是一個標準的python習慣用法,建議這些方法只能由Chimp類使用。我們甚至可以給它們一個雙下劃線,這將告訴python真正嘗試讓它們成為私有方法,但我們不需要這樣的保護。😃
_walk方法通過將當前矩形移動一個給定的偏移量來為猴子創建一個新的位置。如果這個新位置穿過屏幕顯示區域之外,它將反轉移動偏移量。它還使用pygame.transform.flip()垂直和水平翻轉函數來鏡像圖像。這是一種粗糙的效果,讓猴子看起來像是在轉向它移動的方向。
當monkey當前處于“眩暈”狀態時,調用_spin方法。眩暈屬性用于存儲當前的旋轉量。當猴子旋轉了所有的方式(360度),它將重置猴子的圖像回到原來的,非旋轉的版本。在調用pygame.transform.rotate()旋轉圖像函數之前,您將看到代碼對函數進行了一個簡單的局部引用,名為“rotate”。對于這個示例,不需要這樣做,只是為了保持下面一行的長度更短一些。請注意,在調用rotate函數時,我們總是從原始的monkey圖像開始旋轉。旋轉時,質量略有下降。重復旋轉相同的圖像,每次質量都會變差。另外,當旋轉圖像時,圖像的大小實際上會改變。這是因為圖像的角將被旋轉出去,使圖像更大。我們確保新圖像的中心與舊圖像的中心相匹配,所以它不會移動。
最后一個方法是punch(),它告訴精靈進入其眩暈狀態。這將導致圖像開始旋轉。它還將當前圖像的副本命名為“original”。
初始化
在使用pygame進行更多操作之前,我們需要確保它的模塊已經初始化。在本例中,我們還將打開一個簡單的圖形窗口。現在我們在程序的main()函數中,它實際上運行所有的東西。
初始化pygame的第一行為我們做了一些工作。它檢查導入的pygame模塊,并嘗試初始化每個模塊。可以回去檢查模塊是否初始化失敗,但這里我們就不費事了。也可以采用更多的控制并手動初始化每個特定的模塊。這種類型的控制通常是不需要的,但如果您愿意,可以使用。
接下來,我們設置顯示圖形模式。請注意pygame。顯示模塊用于控制所有顯示設置。在本例中,我們要求一個簡單的瘦窗口。有一個完全獨立的教程來設置圖形模式,但如果我們真的不關心,pygame將做得很好,讓我們得到一些工作。Pygame會選擇最好的顏色深度,因為我們沒有提供。
最后,我們設置窗口標題并關閉窗口的鼠標光標。非常基本的操作,現在我們有一個小的黑色窗口準備執行我們的命令。通常光標默認為可見,所以沒有必要真正設置狀態,除非我們想隱藏它。
創建背景
我們的程序會在后臺有文本信息。我們最好創建一個單一的表面來代表背景,并反復使用它。第一步是創建表面。
這為我們創建了一個與顯示窗口相同大小的新表面。注意在創建Surface之后對convert()的額外調用。不帶參數的轉換將確保我們的背景與顯示窗口的格式相同,這將給我們提供最快的結果。
我們也用純白色填充整個背景。Fill使用RGB三元組作為顏色參數。
把文字放在背景,居中
現在我們有了一個背景表面,讓我們把文本渲染到它。我們只有看到pygame才會這么做。用于加載和呈現字體模塊的Fontpygame模塊已正確導入。如果沒有,我們就跳過這一節。
如您所見,有幾個步驟可以完成此工作。首先,我們必須創建字體對象,并將其渲染到一個新的表面。然后我們找到這個新表面的中心,并將其塊(粘貼)到背景上。
字體是通過字體模塊的font()構造函數創建的。通常,您將傳遞一個TrueType字體文件的名稱給這個函數,但我們也可以傳遞None,它將使用默認字體。Font構造函數還需要知道要創建的字體的大小。
然后,我們將該字體渲染到一個新的表面。渲染函數為我們的文本創建一個合適大小的新表面。在這種情況下,我們也告訴渲染創建反鋸齒的文本(為了一個漂亮的光滑的外觀),并使用深灰色。
接下來,我們需要找到顯示文本的居中位置。我們從文本尺寸創建一個“Rect”對象,這允許我們輕松地將它分配到屏幕中心。
最后我們blit (blit就像復制或粘貼)文本到背景圖像上。
安裝完成時顯示背景
屏幕上還有一個黑色的窗口。讓我們在等待其他資源加載的同時顯示我們的后臺。
這將把我們的整個背景分割到顯示窗口上。這是不言自明的,但是這個翻蓋程序呢?
在pygame中,對顯示表面的更改不是立即可見的。通常,必須更新已更改區域的顯示,以便用戶可以看到。使用雙緩沖顯示時,必須交換(或翻轉)顯示以使更改變為可見。在這種情況下,flip()函數工作得很好,因為它只處理整個窗口區域,并且處理單緩沖和雙緩沖的表面。
準備游戲對象
這里我們創建了游戲需要的所有對象。
首先,我們使用上面定義的load_sound函數加載兩個聲音效果。然后我們為每個精靈類創建一個實例。最后,我們創建一個精靈組,它將包含我們所有的精靈。
我們實際上使用了一個名為RenderPlain的特殊精靈組。這個精靈組可以將它所包含的所有精靈繪制到屏幕上。它被稱為RenderPlain,因為實際上有更高級的渲染組。但對于我們的游戲,我們只需要簡單的繪圖。我們通過傳遞一個包含所有應該屬于該組的精靈的列表來創建名為“allsprites”的組。我們可以稍后在這個組中添加或刪除精靈,但在這個游戲中我們不需要這樣做。
我們創建的時鐘對象將用于幫助控制我們的游戲的幀速率。我們將在游戲的主循環中使用它,以確保它不會運行得太快。
** 主循環**
這里沒什么,只是一個無限循環。
所有游戲都在某種循環中運行。通常的操作順序是檢查計算機狀態和用戶輸入,移動并更新所有對象的狀態,然后將它們繪制到屏幕上。您將看到這個示例沒有什么不同。
我們還調用了時鐘對象,這將確保我們的游戲運行速度不會超過每秒60幀。
處理所有輸入事件
這是一個處理事件隊列的極其簡單的例子。
首先,我們從pygame中獲得所有可用的事件,并對每個事件進行循環。前兩個測試是查看用戶是否退出了我們的游戲,或按下了退出鍵。在這些情況下,只需從main()函數返回,程序就會干凈地結束。
接下來,我們只是檢查鼠標按鈕是否被按下或釋放。如果按鈕被按下,我們會詢問第一個物體是否與黑猩猩相撞。我們播放適當的聲音效果,如果猴子被擊中了,我們告訴它開始旋轉(通過調用它的punching()方法)。
更新精靈
allsprites.update()精靈組有一個update()方法,它只是調用它所包含的所有精靈的更新方法。每個對象都將移動,這取決于它們所處的狀態。在這個階段,黑猩猩會向一邊移動一步,或者如果它最近被打過,會轉得更遠一點。
繪制整個場景
現在所有的物體都在正確的位置,是時候畫它們了。
第一個blit調用將把背景繪制到整個屏幕上。這將刪除我們在前一幀中看到的所有內容(雖然有點低效,但對于這款游戲來說已經足夠好了)。接下來我們調用精靈容器的draw()方法。因為這個精靈容器實際上是“DrawPlain”精靈組的一個實例,所以它知道如何繪制我們的精靈。最后,我們將pygame的軟件雙緩沖區的內容翻轉()到屏幕上。這使得我們畫的所有東西都同時可見。
游戲結束
用戶已退出,該清理了。
清理pygame中的運行游戲是非常簡單的。事實上,由于所有變量都被自動析構,所以我們真的不需要做任何事情。
總結
以上是生活随笔為你收集整理的pygame演示----黑猩猩小游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android4.4添加系统服务(aid
- 下一篇: hcne学习笔记