Pygame遊戲開發之太空射擊實戰入門篇

視頻

觀看視頻

入門

pygame

這是我們教程系列“使用 Pygame 進行遊戲開發”的第 1 部分。它適用於對遊戲開發和提高Python編碼技能感興趣的初學者/中級程序員。

什麼是Pygame

Pygame是一個“遊戲庫” – 一套幫助程序員制作遊戲的工具。其中一些內容是:

  • 圖形和動畫
  • 聲音(包括音樂)
  • 控制(鍵盤、鼠標、遊戲手柄等)

遊戲循環

每個遊戲的核心都是一個循環,我們稱之為“遊戲循環”。這個循環不斷運行,一遍又一遍,做所有使遊戲工作需要做的事情。每次遊戲經歷此循環時,稱為幀。

每個幀,可能會發生許多不同的事情,但它們可以組織成三個不同的類別:

1. 處理輸入(或事件)

遊戲需要響應的任何內容。這些可能是鍵盤按鍵,鼠標移動等。

2. 更新遊戲

更改框架上需要更改的任何內容。如果一個角色在空中,重力需要把它拉下來。如果兩個物體相互碰撞,它們需要爆炸。

3. 渲染(或繪制)

在此步驟中,我們將在屏幕上繪制所有內容。背景、角色、菜單或玩傢需要查看的任何其他內容都必須在屏幕上的正確位置繪制。

時鐘

循環的另一個重要方面是控制整個循環的運行速度。您可能聽說過術語FPS,它代表每秒幀數。這意味著此循環每秒應發生多少次。這很重要,因為您不希望遊戲運行得太快或太慢。你也不希望它在不同的計算機上以不同的速度運行 。

構建 Pygame 模板

現在我們知道瞭使遊戲正常工作需要哪些部分,我們可以開始編寫一些代碼瞭。首先,我們將制作一個簡單的pygame程序,除瞭打開一個窗口並運行遊戲循環之外,什麼都不做。對於您想要制作的任何pygame項目來說,這都將是一個很好的起點。

在程序的頂部,我們將導入所需的庫,並為遊戲選項設置一些變量:

# Pygame 模板 - 遊戲框架
import pygame
import random
WIDTH = 360  # 遊戲窗口寬度
HEIGHT = 480 # 遊戲窗口高度
FPS = 30 # 每秒幀數

接下來我們需要打開遊戲窗口:

# 初始化pygame,創建窗口
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建立遊戲屏幕。最後,我們創建瞭一個能夠確保遊戲以我們想要的FPS運行的 clock

接下來是遊戲循環瞭:

# 遊戲循環
running = True
while running:
    # Process input (events)
    # Update
    # Render (draw)

這是我們的遊戲循環,它是一個由變量控制的循環。如果我們想讓遊戲結束,隻需要設置running = False就會結束循環。現在我們可以用一些基本代碼填充每個部分。

渲染/繪制部分

我們將從*“繪制*”部分開始。我們還沒有任何代碼,但我們可以用純色填充屏幕。為此,我們需要討論計算機如何處理顏色。

計算機屏幕由像素組成,這些像素有 3 個部分:紅色、綠色和藍色。每個部分被點亮的程度決定瞭該像素是什麼顏色,如下所示:

三種原色中的每一種都可以具有介於 0(關閉)和 255(100% 打開)之間的值,因此三種原色中的每一種都有 256 種不同的可能性。以下是您可以制作的一些顏色的一些示例:

您可以通過乘法找到計算機可以顯示的顏色總數:

>>> 256 * 256 * 256 = 16,777,216

現在我們已經瞭解瞭顏色,讓我們在程序的頂部定義一些:

# 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)

對於計算機顯示的工作方式,這還不夠。更改屏幕上的像素意味著讓顯卡告訴監視器更改實際像素。在計算機方面,這是一個非常非常緩慢的過程。因此,如果您在屏幕上要繪制很多東西,則可能需要很長時間才能全部繪制出來。我們可以通過使用稱為雙緩沖的東西以一種聰明的方式解決這個問題。這聽起來很花哨,但它實際上隻是意味著:

想象一下,我們有一個雙面白板,可以翻轉以顯示一面或另一面。正面將是顯示器(玩傢看到的屏幕),而背面是隱藏的,隻有計算機才能“看到”它。每一幀,我們所有的繪畫都在背面。然後,當我們完成後,我們將板翻轉過來並顯示新框架。這意味著我們隻做一個緩慢的過程,每幀與顯示器交談一次,而不是屏幕上的每一件事都這樣做。

所有這些都在pygame中自動發生。你隻需要告訴它當你完成繪圖時翻轉白板。實際上,該命令甚至被命名為:flip()

    # 繪制、渲染
    screen.fill(BLACK)
    # 繪制所有的事情後翻轉顯示
    pygame.display.flip()

如果你在flip()翻轉後嘗試畫一些東西,它們不會顯示在屏幕上!

輸入/事件部分

我們還沒有遊戲,所以我們不能準確說出想要監聽的鍵盤或鼠標按鈕或其他控制事件。

如果您現在嘗試運行該程序,您會發現自己遇到瞭問題:無法關閉窗口!單擊角落中的“X”不起作用。那是因為這是一個事件,我們需要告訴我們的程序監聽該事件並讓它退出遊戲。

事件可能隨時發生。如果玩傢在更新或繪制循環部分時單擊“跳轉”按鈕,該怎麼辦?不要忽略這個輸入, 玩傢會感到沮喪。因此,Pygame所做的就是保存自上一幀以來發生的所有事件。這樣,即使玩傢快速搗碎許多按鍵,也能記錄下來所有這些按鈕。所有事件存放在一個列表,因此我們運行一個for循環來查看所有事件:

    for event in pygame.event.get():
        # 檢查屏幕關閉事件
        if event.type == pygame.QUIT:
            running = False

Pygame有很多事件。 pygame.QUIT是單擊“X”時發生的事件,因此我們設置running=False,遊戲循環將結束。

控制屏幕刷新頻率

我們還沒有在“更新”部分中放入任何內容,但我們仍然需要使用FPS的設置來控制速度。我們可以這樣做:

while running:
    # 保證以正常的速率循環
    clock.tick(FPS)

'tick()'命令告訴 pygame 每次循環需要多長時間,然後暫停多長時間,以使整個循環(即整個幀)持續正確的時間。如果我們設置FPS為 30,則意味著我們希望幀持續 1 30 \frac{1}{30} 301​ 或 0.03 秒。例如,如果我們的循環代碼(更新,繪制等)隻需要0.01秒,那麼pygame將等待0.02秒。

結束語

最後,讓我們確保當遊戲循環結束時,我們實際上會破壞遊戲窗口。通過將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. 更新組件狀態
    # 3. 繪制圖像
    screen.fill(BLACK)
    pygame.display.flip()

在下一教程中,我們將使用此模板作為學習如何在屏幕上繪制對象並使其移動。

到此這篇關於Pygame遊戲開發之太空射擊實戰入門篇的文章就介紹到這瞭,更多相關Pygame太空射擊內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: