Pygame 作為一個入門級的游戲開發庫,其實并不難學,只要掌握 Python 編程的相關知識就能很輕松地掌握它。
Pygame 語法簡單、明了,秉持了 Python 語言一貫的風格。同時,它作為一個游戲開發庫來說,具有圖形編程的基本特點,如果您對于圖形編程從未了解過,即使您有 Python 編程基礎,也會略感迷茫。因此,在接下來的學習中會詳細介紹 Pygame 的常用模塊,以及圖形編程中的相關概念,幫助您快速掌握 Pygame 的使用。
下面是一個簡單的 Pygame 程序,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#導入所需的模塊 import sys import pygame # 使用pygame之前必須初始化 pygame.init() # 設置主屏窗口 screen = pygame.display.set_mode(( 400 , 400 )) # 設置窗口的標題,即游戲名稱 pygame.display.set_caption( 'hello world' ) # 引入字體類型 f = pygame.font.Font( 'C:/Windows/Fonts/simhei.ttf' , 50 ) # 生成文本信息,第一個參數文本內容;第二個參數,字體是否平滑; # 第三個參數,RGB模式的字體顏色;第四個參數,RGB模式字體背景顏色; text = f.render( "C語言中文網" , True ,( 255 , 0 , 0 ),( 0 , 0 , 0 )) #獲得顯示對象的rect區域坐標 textRect = text.get_rect() # 設置顯示對象居中 textRect.center = ( 200 , 200 ) # 將準備好的文本信息,繪制到主屏幕 Screen 上。 screen.blit(text,textRect) # 固定代碼段,實現點擊"X"號退出界面的功能,幾乎所有的pygame都會使用該段代碼 while True : # 循環獲取事件,監聽事件狀態 for event in pygame.event.get(): # 判斷用戶是否點了"X"關閉按鈕,并執行if代碼段 if event. type = = pygame.QUIT: #卸載所有模塊 pygame.quit() #終止程序,確保退出程序 sys.exit() pygame.display.flip() #更新屏幕內容 |
如果您熟悉 Python 編程的基礎知識,那么在注釋的幫助下,應該能很容易地理解上述代碼。假如不能也沒有關系,因為接下來,我們會對上述代碼進行細致的分析。常言道:“授人以魚不如授人以漁”,分析代碼的邏輯,有助于我們理解和編寫 Pygame 程序,而至于代碼中涉及的模塊、方法等,會在后續內容做詳細介紹。
初始化程序
在使用 Pygame 編寫程序前,要做的第一個步驟是“初始化程序”,代碼如下所示:
1
|
pygame.init() |
這是整個程序中的第一句代碼,它的作用是自動檢測 Pygame 軟件包是否正常可用,并檢查電腦的硬件調用接口、基礎功能是否存在問題,比如音頻、光驅、聲卡驅動等設備。同時,它會完成 Pygame 中所有模塊的初始化操作,比如 display(顯示模塊)、font(字體模塊)、mixer(聲音控制模塊)、cursors(光標控制模塊)等。
由此可見,初始化程序的重要性,因此上述代碼,在編寫程序時候千萬不能“漏掉”。
創建Surface對象
想要掌握 Pygame 的編程邏輯,首先就要理解 surface 對象的概念,它是 Pygame 中最重要的組成部分。
Surface 翻譯為表面、表層、外觀,在 Pygame 中,您可以把 surface 對象理解成一張“白紙”,通過這張紙可以做許多的事情,比如在紙上添加文字、填充顏色、添加圖片以及繪制任意形狀的圖形等。既然是“紙”就有規格尺寸,Pygame 允許您創建任意大小的紙。
那么我們應該如何創建 Surface 對象呢?Pygame 提供了多種創建 Surface 對象的方法,這里先介紹以下幾種方法。
上述示例,使用如下方式創建了一個 surface 對象:
1
2
|
#也叫screen對象,本質上是一個Surface,大小400*400 screen = pygame.display.set_mode(( 400 , 400 )) |
screen 的本質上就是一個 Surface 對象,它是游戲的主窗口,也就是整個游戲中尺寸最大的“紙”,任何其他的 Surface 對象都需要附著在這張最大的“紙”上,比如創建一個包含文本的 Surface 對象,通過以下方法將它繪制在主屏幕上:
1
2
3
4
|
#創建一個包含文字的Surface對象 text = f.render( "C語言中文網" , True ,( 255 , 0 , 0 ),( 0 , 0 , 0 )) #通過blit方法將其繪制在主屏幕上,這里的textRect表示位置坐標 screen.blit(text,textRect) |
如果想創建一個包含圖像的 surface 對象可以使用如下方法:
1
|
surface_image = pygame.image.load( "圖片路徑" ) |
事件監聽
游戲,在我們日常生活中經常接觸到,無論是手游、還是電腦端游戲,已經成了信息社會中,不可或缺的一部分。
游戲大致來講是由動畫和人機交互的體驗兩部分構成,其中動畫則是由一系列連續靜止的圖片,經過一定頻率的刷新構成的,這個頻率被稱為 FPS,如果頻率值越大則畫面越流暢;如果頻率值越小則畫面會出現卡頓的感,在游戲過程中一般人能接受的最低 FPS 約為 30Hz,如果想要畫面流暢則 FPS 要大于 60 Hz。
FPS 越高,細節越好,體驗也越好,但是文件容量也越高
動畫保證了玩家的視覺體驗,而人機交互則是操作上的體驗。通過移動和點擊鼠標、按下鍵盤上的技能鍵,或是滑動手機屏幕等操作來實現人機交互,這些與游戲程序交互的操作被稱為事件(Event)。
如果您接觸過 JavaScript,那么您對于“事件”這一名詞,一定不會陌生。
Pygame 作為一個游戲開發庫,同樣具有設置和監聽事件的功能。它提供了一個 enevt 事件模塊,這個模塊中包含了所有常用到游戲事件。下面是退出游戲的代碼示例(其他事件類型,后續會做介紹):
1
2
3
4
5
6
7
|
# 循環獲取事件,監聽事件狀態,使用get()獲取事件 for event in pygame.event.get(): # 判斷事件類型,用戶是否點了"X"關閉按鈕 # pygame.QUIT 指點擊右上角窗口的"X"號 if event. type = = pygame.QUIT: #點擊后,卸載所有pygame模塊 pygame.quit() |
游戲循環
當打我們游戲時可能會觸發游戲中的各種事件,比如鼠標事件、鍵盤按鍵事件、攝像拍照事件等等,因此游戲程序需要一直循環監聽玩家的操作,只有當用戶點擊了游戲“關閉”按鈕時,監聽才會結束。如果想要達到“循環監聽”目的,此時就需要設置一個游戲循環(Game Loop)也稱為游戲的主循環,這樣才能保證人機交互的體驗感。代碼示例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#游戲主循環(游戲循環) while True : # 循環獲取事件,監聽事件 for event in pygame.event.get(): # 判斷用戶是否點了關閉按鈕 if event. type = = pygame.QUIT: # 當用戶關閉游戲窗口時執行以下操作 # 這里必須調用quit()方法,退出游戲 pygame.quit() #終止系統 sys.exit() #更新并繪制屏幕內容 pygame.display.flip() |
游戲主循環是每個 Pygame 游戲程序中必不可少的一部分,它主要承擔著以下三個重要任務:
- 處理游戲事件
- 更新游戲狀態
- 把更新后的游戲狀態繪制到屏幕上
圖2:主循環示意圖
游戲畫面和游戲操作狀態會因為動畫效果和玩家的操作而改變,因此需要以循環的方式實時地更新主屏幕(screen)的顯示內容。把下列代碼放入游戲主循環中即可實現實時更新和繪制屏幕內容,如下所示:
1
2
|
#刷新界面顯示 pygame.display.flip() |
除了上述方法外,Pygame 還提供了另一個方法。如下所示:
1
|
pygame.display.update() |
這兩個方法的主要區別是:后者可以根據選定的區域來更新部分內容,而前者則是更新整個待顯示的內容。如果后者沒有提供區域位置參數時,其作用和 display.flip() 相同。
通過上述學習,我們對 Pygame 程序有了基本的認識。下面對 Pygame 模塊中的方法、屬性做更加細致的講解。
到此這篇關于如何創建第一個Pygame程序的文章就介紹到這了,更多相關創建Pygame程序內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:http://c.biancheng.net/pygame/the-first-programm.html