Pygame游戲開發(fā)之太空射擊實戰(zhàn)入門篇
視頻
入門
這是我們教程系列“使用 Pygame 進行游戲開發(fā)”的第 1 部分。它適用于對游戲開發(fā)和提高Python編碼技能感興趣的初學者/中級程序員。
什么是Pygame
Pygame是一個“游戲庫” - 一套幫助程序員制作游戲的工具。其中一些內容是:
- 圖形和動畫
- 聲音(包括音樂)
- 控制(鍵盤、鼠標、游戲手柄等)
游戲循環(huán)
每個游戲的核心都是一個循環(huán),我們稱之為“游戲循環(huán)”。這個循環(huán)不斷運行,一遍又一遍,做所有使游戲工作需要做的事情。每次游戲經(jīng)歷此循環(huán)時,稱為幀。
每個幀,可能會發(fā)生許多不同的事情,但它們可以組織成三個不同的類別:
1. 處理輸入(或事件)
游戲需要響應的任何內容。這些可能是鍵盤按鍵,鼠標移動等。
2. 更新游戲
更改框架上需要更改的任何內容。如果一個角色在空中,重力需要把它拉下來。如果兩個物體相互碰撞,它們需要爆炸。
3. 渲染(或繪制)
在此步驟中,我們將在屏幕上繪制所有內容。背景、角色、菜單或玩家需要查看的任何其他內容都必須在屏幕上的正確位置繪制。
時鐘
循環(huán)的另一個重要方面是控制整個循環(huán)的運行速度。您可能聽說過術語FPS,它代表每秒幀數(shù)。這意味著此循環(huán)每秒應發(fā)生多少次。這很重要,因為您不希望游戲運行得太快或太慢。你也不希望它在不同的計算機上以不同的速度運行 。
構建 Pygame 模板
現(xiàn)在我們知道了使游戲正常工作需要哪些部分,我們可以開始編寫一些代碼了。首先,我們將制作一個簡單的pygame程序,除了打開一個窗口并運行游戲循環(huán)之外,什么都不做。對于您想要制作的任何pygame項目來說,這都將是一個很好的起點。
在程序的頂部,我們將導入所需的庫,并為游戲選項設置一些變量:
# Pygame 模板 - 游戲框架 import pygame import random WIDTH = 360 # 游戲窗口寬度 HEIGHT = 480 # 游戲窗口高度 FPS = 30 # 每秒幀數(shù)
接下來我們需要打開游戲窗口:
# 初始化pygame,創(chuàng)建窗口 pygame.init() pygame.mixer.init() # for sound screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("My Game") clock = pygame.time.Clock()
pygame.init()
是啟動pygame并“初始化”。 將以screen
建立游戲屏幕。最后,我們創(chuàng)建了一個能夠確保游戲以我們想要的FPS運行的 clock
接下來是游戲循環(huán)了:
# 游戲循環(huán) running = True while running: # Process input (events) # Update # Render (draw)
這是我們的游戲循環(huán),它是一個由變量控制的循環(huán)。如果我們想讓游戲結束,只需要設置running = False
就會結束循環(huán)?,F(xiàn)在我們可以用一些基本代碼填充每個部分。
渲染/繪制部分
我們將從*“繪制*”部分開始。我們還沒有任何代碼,但我們可以用純色填充屏幕。為此,我們需要討論計算機如何處理顏色。
計算機屏幕由像素組成,這些像素有 3 個部分:紅色、綠色和藍色。每個部分被點亮的程度決定了該像素是什么顏色,如下所示:
三種原色中的每一種都可以具有介于 0(關閉)和 255(100% 打開)之間的值,因此三種原色中的每一種都有 256 種不同的可能性。以下是您可以制作的一些顏色的一些示例:
您可以通過乘法找到計算機可以顯示的顏色總數(shù):
>>> 256 * 256 * 256 = 16,777,216
現(xiàn)在我們已經(jīng)了解了顏色,讓我們在程序的頂部定義一些:
# Colors (R, G, B) BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255)
然后我們可以用黑色填充屏幕。
# 繪制、渲染 screen.fill(BLACK)
對于計算機顯示的工作方式,這還不夠。更改屏幕上的像素意味著讓顯卡告訴監(jiān)視器更改實際像素。在計算機方面,這是一個非常非常緩慢的過程。因此,如果您在屏幕上要繪制很多東西,則可能需要很長時間才能全部繪制出來。我們可以通過使用稱為雙緩沖的東西以一種聰明的方式解決這個問題。這聽起來很花哨,但它實際上只是意味著:
想象一下,我們有一個雙面白板,可以翻轉以顯示一面或另一面。正面將是顯示器(玩家看到的屏幕),而背面是隱藏的,只有計算機才能“看到”它。每一幀,我們所有的繪畫都在背面。然后,當我們完成后,我們將板翻轉過來并顯示新框架。這意味著我們只做一個緩慢的過程,每幀與顯示器交談一次,而不是屏幕上的每一件事都這樣做。
所有這些都在pygame中自動發(fā)生。你只需要告訴它當你完成繪圖時翻轉白板。實際上,該命令甚至被命名為:flip()
# 繪制、渲染 screen.fill(BLACK) # 繪制所有的事情后翻轉顯示 pygame.display.flip()
如果你在flip()
翻轉后嘗試畫一些東西,它們不會顯示在屏幕上!
輸入/事件部分
我們還沒有游戲,所以我們不能準確說出想要監(jiān)聽的鍵盤或鼠標按鈕或其他控制事件。
如果您現(xiàn)在嘗試運行該程序,您會發(fā)現(xiàn)自己遇到了問題:無法關閉窗口!單擊角落中的“X”不起作用。那是因為這是一個事件,我們需要告訴我們的程序監(jiān)聽該事件并讓它退出游戲。
事件可能隨時發(fā)生。如果玩家在更新或繪制循環(huán)部分時單擊“跳轉”按鈕,該怎么辦?不要忽略這個輸入, 玩家會感到沮喪。因此,Pygame所做的就是保存自上一幀以來發(fā)生的所有事件。這樣,即使玩家快速搗碎許多按鍵,也能記錄下來所有這些按鈕。所有事件存放在一個列表,因此我們運行一個for
循環(huán)來查看所有事件:
for event in pygame.event.get(): # 檢查屏幕關閉事件 if event.type == pygame.QUIT: running = False
Pygame有很多事件。 pygame.QUIT
是單擊“X”時發(fā)生的事件,因此我們設置running=False
,游戲循環(huán)將結束。
控制屏幕刷新頻率
我們還沒有在“更新”部分中放入任何內容,但我們仍然需要使用FPS
的設置來控制速度。我們可以這樣做:
while running: # 保證以正常的速率循環(huán) clock.tick(FPS)
'tick()'
命令告訴 pygame 每次循環(huán)需要多長時間,然后暫停多長時間,以使整個循環(huán)(即整個幀)持續(xù)正確的時間。如果我們設置FPS
為 30,則意味著我們希望幀持續(xù) 1 30 \frac{1}{30} 301? 或 0.03 秒。例如,如果我們的循環(huán)代碼(更新,繪制等)只需要0.01秒,那么pygame將等待0.02秒。
結束語
最后,讓我們確保當游戲循環(huán)結束時,我們實際上會破壞游戲窗口。通過將pygame.quit()
放在代碼的最后來做到這一點。所以我們的最終pygame模板看起來像這樣:
# Pygame template - skeleton for a new pygame project import pygame import random WIDTH = 360 HEIGHT = 480 FPS = 30 # define colors WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) # initialize pygame and create window pygame.init() pygame.mixer.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("My Game") clock = pygame.time.Clock() # Game loop running = True while running: # keep loop running at the right speed clock.tick(FPS) # Process input (events) for event in pygame.event.get(): # check for closing window if event.type == pygame.QUIT: running = False # Update # Draw / render screen.fill(BLACK) # *after* drawing everything, flip the display pygame.display.flip() pygame.quit()
祝賀!你有一個有效的Pygame模板。用一個pygame template.py
名字保存這個文件,這樣你就可以在每次開始一個新的Pygame項目時重復使用它。
本部分代碼
import pygame import random # WIDTH, HEIGHT = 360, 480 # WIDTH, HEIGHT = (360, 480) # WIDTH = 360 # HEIGHT = 480 # SCREEN_SIZE = (WIDTH, HEIGHT) SCREEN_SIZE = WIDTH, HEIGHT = 360, 480 FPS = 30 # Colors (R, G, B) BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) pygame.init() screen = pygame.display.set_mode(SCREEN_SIZE) pygame.display.set_caption("my game") clock = pygame.time.Clock() running = True while running: clock.tick(FPS) # 1. 事件 for e in pygame.event.get(): if e.type == pygame.QUIT: running = False # 2. 更新組件狀態(tài) # 3. 繪制圖像 screen.fill(BLACK) pygame.display.flip()
在下一教程中,我們將使用此模板作為學習如何在屏幕上繪制對象并使其移動。
到此這篇關于Pygame游戲開發(fā)之太空射擊實戰(zhàn)入門篇的文章就介紹到這了,更多相關Pygame太空射擊內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python ADF 單位根檢驗 如何查看結果的實現(xiàn)
這篇文章主要介紹了Python ADF 單位根檢驗 如何查看結果的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06python中np.random.permutation函數(shù)實例詳解
np.random.permutation是numpy中的一個函數(shù),它可以將一個數(shù)組中的元素隨機打亂,返回一個打亂后的新數(shù)組,下面這篇文章主要給大家介紹了關于python中np.random.permutation函數(shù)的相關資料,需要的朋友可以參考下2023-04-04