Pygame游戲開發(fā)之太空射擊實戰(zhàn)入門篇
視頻
入門
這是我們教程系列“使用 Pygame 進行游戲開發(fā)”的第 1 部分。它適用于對游戲開發(fā)和提高Python編碼技能感興趣的初學(xué)者/中級程序員。
什么是Pygame
Pygame是一個“游戲庫” - 一套幫助程序員制作游戲的工具。其中一些內(nèi)容是:
- 圖形和動畫
- 聲音(包括音樂)
- 控制(鍵盤、鼠標(biāo)、游戲手柄等)
游戲循環(huán)
每個游戲的核心都是一個循環(huán),我們稱之為“游戲循環(huán)”。這個循環(huán)不斷運行,一遍又一遍,做所有使游戲工作需要做的事情。每次游戲經(jīng)歷此循環(huán)時,稱為幀。
每個幀,可能會發(fā)生許多不同的事情,但它們可以組織成三個不同的類別:
1. 處理輸入(或事件)
游戲需要響應(yīng)的任何內(nèi)容。這些可能是鍵盤按鍵,鼠標(biāo)移動等。
2. 更新游戲
更改框架上需要更改的任何內(nèi)容。如果一個角色在空中,重力需要把它拉下來。如果兩個物體相互碰撞,它們需要爆炸。
3. 渲染(或繪制)
在此步驟中,我們將在屏幕上繪制所有內(nèi)容。背景、角色、菜單或玩家需要查看的任何其他內(nèi)容都必須在屏幕上的正確位置繪制。
時鐘
循環(huán)的另一個重要方面是控制整個循環(huán)的運行速度。您可能聽說過術(shù)語FPS,它代表每秒幀數(shù)。這意味著此循環(huán)每秒應(yīng)發(fā)生多少次。這很重要,因為您不希望游戲運行得太快或太慢。你也不希望它在不同的計算機上以不同的速度運行 。
構(gòu)建 Pygame 模板
現(xiàn)在我們知道了使游戲正常工作需要哪些部分,我們可以開始編寫一些代碼了。首先,我們將制作一個簡單的pygame程序,除了打開一個窗口并運行游戲循環(huán)之外,什么都不做。對于您想要制作的任何pygame項目來說,這都將是一個很好的起點。
在程序的頂部,我們將導(dǎo)入所需的庫,并為游戲選項設(shè)置一些變量:
# 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)。如果我們想讓游戲結(jié)束,只需要設(shè)置running = False就會結(jié)束循環(huán)。現(xiàn)在我們可以用一些基本代碼填充每個部分。
渲染/繪制部分
我們將從*“繪制*”部分開始。我們還沒有任何代碼,但我們可以用純色填充屏幕。為此,我們需要討論計算機如何處理顏色。
計算機屏幕由像素組成,這些像素有 3 個部分:紅色、綠色和藍(lán)色。每個部分被點亮的程度決定了該像素是什么顏色,如下所示:

三種原色中的每一種都可以具有介于 0(關(guān)閉)和 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)視器更改實際像素。在計算機方面,這是一個非常非常緩慢的過程。因此,如果您在屏幕上要繪制很多東西,則可能需要很長時間才能全部繪制出來。我們可以通過使用稱為雙緩沖的東西以一種聰明的方式解決這個問題。這聽起來很花哨,但它實際上只是意味著:
想象一下,我們有一個雙面白板,可以翻轉(zhuǎn)以顯示一面或另一面。正面將是顯示器(玩家看到的屏幕),而背面是隱藏的,只有計算機才能“看到”它。每一幀,我們所有的繪畫都在背面。然后,當(dāng)我們完成后,我們將板翻轉(zhuǎn)過來并顯示新框架。這意味著我們只做一個緩慢的過程,每幀與顯示器交談一次,而不是屏幕上的每一件事都這樣做。
所有這些都在pygame中自動發(fā)生。你只需要告訴它當(dāng)你完成繪圖時翻轉(zhuǎn)白板。實際上,該命令甚至被命名為:flip()
# 繪制、渲染
screen.fill(BLACK)
# 繪制所有的事情后翻轉(zhuǎn)顯示
pygame.display.flip()如果你在flip()翻轉(zhuǎn)后嘗試畫一些東西,它們不會顯示在屏幕上!
輸入/事件部分
我們還沒有游戲,所以我們不能準(zhǔn)確說出想要監(jiān)聽的鍵盤或鼠標(biāo)按鈕或其他控制事件。
如果您現(xiàn)在嘗試運行該程序,您會發(fā)現(xiàn)自己遇到了問題:無法關(guān)閉窗口!單擊角落中的“X”不起作用。那是因為這是一個事件,我們需要告訴我們的程序監(jiān)聽該事件并讓它退出游戲。
事件可能隨時發(fā)生。如果玩家在更新或繪制循環(huán)部分時單擊“跳轉(zhuǎn)”按鈕,該怎么辦?不要忽略這個輸入, 玩家會感到沮喪。因此,Pygame所做的就是保存自上一幀以來發(fā)生的所有事件。這樣,即使玩家快速搗碎許多按鍵,也能記錄下來所有這些按鈕。所有事件存放在一個列表,因此我們運行一個for循環(huán)來查看所有事件:
for event in pygame.event.get():
# 檢查屏幕關(guān)閉事件
if event.type == pygame.QUIT:
running = FalsePygame有很多事件。 pygame.QUIT是單擊“X”時發(fā)生的事件,因此我們設(shè)置running=False,游戲循環(huán)將結(jié)束。
控制屏幕刷新頻率
我們還沒有在“更新”部分中放入任何內(nèi)容,但我們?nèi)匀恍枰褂?code>FPS的設(shè)置來控制速度。我們可以這樣做:
while running:
# 保證以正常的速率循環(huán)
clock.tick(FPS)
'tick()'命令告訴 pygame 每次循環(huán)需要多長時間,然后暫停多長時間,以使整個循環(huán)(即整個幀)持續(xù)正確的時間。如果我們設(shè)置FPS為 30,則意味著我們希望幀持續(xù) 1 30 \frac{1}{30} 301? 或 0.03 秒。例如,如果我們的循環(huán)代碼(更新,繪制等)只需要0.01秒,那么pygame將等待0.02秒。
結(jié)束語
最后,讓我們確保當(dāng)游戲循環(huán)結(jié)束時,我們實際上會破壞游戲窗口。通過將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項目時重復(fù)使用它。
本部分代碼
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()在下一教程中,我們將使用此模板作為學(xué)習(xí)如何在屏幕上繪制對象并使其移動。
到此這篇關(guān)于Pygame游戲開發(fā)之太空射擊實戰(zhàn)入門篇的文章就介紹到這了,更多相關(guān)Pygame太空射擊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用 Python ssh 遠(yuǎn)程登陸服務(wù)器的最佳方案
這篇文章主要介紹了使用 Python ssh 遠(yuǎn)程登陸服務(wù)器的最佳方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
在Django中編寫模版節(jié)點及注冊標(biāo)簽的方法
這篇文章主要介紹了在Django中編寫模版節(jié)點及注冊標(biāo)簽的方法,Django是Python各式各樣的高人氣框架中最為著名的一個,需要的朋友可以參考下2015-07-07
基于python解析XML文件并將數(shù)據(jù)存儲到MongoDB的代碼示例
在軟件開發(fā)中,我們經(jīng)常需要處理各種格式的數(shù)據(jù),XML 是一種常用的數(shù)據(jù)交換格式,它可以存儲和傳輸結(jié)構(gòu)化數(shù)據(jù),很多網(wǎng)站會提供 XML 格式的數(shù)據(jù)接口,以便其他系統(tǒng)可以方便地獲取數(shù)據(jù),本文介紹了基于python解析XML文件并將數(shù)據(jù)存儲到MongoDB的代碼示例,需要的朋友可以參考下2024-06-06
Python?調(diào)用函數(shù)時檢查參數(shù)的類型是否合規(guī)的實現(xiàn)代碼
這篇文章主要介紹了Python?調(diào)用函數(shù)時檢查參數(shù)的類型是否合規(guī)的實現(xiàn)代碼,本文給大家講解的非常詳細(xì),需要的朋友可以參考下2024-06-06
詳解Python如何檢查一個數(shù)字是否是三態(tài)數(shù)
在數(shù)學(xué)中,三態(tài)數(shù)(Triangular?Number)是一種特殊的數(shù)列,它是由自然數(shù)按照一定規(guī)律排列而成的,本文主要介紹了如何使用Python檢查判斷一個數(shù)字是否是三態(tài)數(shù),需要的可以參考下2024-03-03

