首頁 > 軟體

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

2022-08-04 18:02:50

視訊

觀看視訊

入門

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太空射擊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com