Pygame第1-1課:入門

weixin_33807284發表於2019-02-11

什麼是Pygame?

Pygame是一個“遊戲庫” - 一組幫助程式設計師製作遊戲的工具。其中一些是:

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

遊戲迴圈

每個遊戲的核心都是一個迴圈,我們將其稱為“遊戲迴圈”。這個迴圈一直在不斷執行,一遍又一遍地完成遊戲工作所需的所有事情。每次遊戲通過此迴圈稱為

遊戲框架,主要處理3件事情

1.程式輸入(或事件)

這意味著你想要注意的遊戲之外的任何東西 - 你需要遊戲迴應的任何東西。這些可能是鍵盤上按下的鍵,點選滑鼠等。

2.更新遊戲

這意味著更改需要在此框架上更改的任何內容。如果角色在空中,重力需要將其拉下來。如果兩個物件相互碰撞,則需要爆炸。

3.渲染(或繪製)

在此步驟中,我們在螢幕上繪製所有內容。必須在螢幕上的正確,更新位置繪製背景,角色,選單或玩家需要看到的任何其他內容。

時鐘

迴圈的另一個重要方面是控制整個迴圈的執行速度。您可能聽說過FPS這個術語,它代表每秒幀數。這意味著這個迴圈每秒應發生多少次。這很重要,因為您不希望遊戲執行得太快或太慢。你也不希望它在不同的計算機上以不同的速度執行 - 如果你的角色在螢幕上執行需要10秒鐘,那麼無論它發生在什麼計算機上都應該如此。

構建Pygame框架模板

既然我們知道我們需要使遊戲工作的部分,我們就可以開始編寫一些程式碼了。首先,我們將製作一個簡單的pygame程式,除了開啟一個視窗並執行遊戲迴圈之外什麼都不做。對於您想要製作的任何pygame專案,這將是一個很好的起點。

在我們程式的頂部,我們將匯入我們需要的庫併為我們的遊戲選項設定一些變數:

# Pygame template - skeleton for a new pygame project
import pygame
import random

WIDTH = 360  # width of our game window
HEIGHT = 480 # height of our game window
FPS = 30 # frames per second

接下來我們需要開啟遊戲視窗:

# initialize pygame and create window
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指的是我們的遊戲螢幕,我們按照我們在配置常量中設定的大小建立它。最後,我們建立了一個,clock時鐘以便我們能夠確保我們的遊戲以我們想要的FPS執行。

現在是時候讓遊戲迴圈:

# Game Loop
running = True
while running:
    # Process input (events)
    # Update
    # Render (draw)

這是我們的遊戲迴圈,它是while由變數控制的迴圈running。如果我們希望遊戲結束,我們只需要設定runningFalse迴圈就會結束。現在我們可以用一些基本程式碼填寫每個部分。

渲染/繪製部分

我們將從Draw部分開始。我們還沒有任何角色,但我們可以用純色填充螢幕。要做到這一點,我們需要談談計算機如何處理顏色。

電腦螢幕由畫素組成,這些畫素有3個部分:紅色,綠色和藍色。每個部件點亮多少會決定畫素的顏色,如下所示:

468490-f0379f472cbc2f06.png
image

三原色中的每一個可以具有介於0(包含)和255(不包含)之間的值,因此對於三種基色中的每一種,存在256種不同的可能性。以下是您可以製作的一些顏色示例:

468490-9c04638c13ffe1e6.png
image

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

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

然後我們可以讓我們的繪圖部分填滿螢幕。

    # Draw / render
    screen.fill(BLACK)

但是,由於計算機顯示的工作方式,這還不夠。更改螢幕上的畫素意味著告訴視訊卡告訴顯示器更改實際畫素。從計算機的角度來看,這是一個非常非常緩慢的過程。因此,如果你在螢幕上繪製了很多東西,那麼繪製它們可能需要很長時間。我們可以通過使用稱為雙緩衝的東西以巧妙的方式解決這個問題。這聽起來很奇特,但它真的只是意味著:

想象一下,我們有一個雙面白板,可以翻轉顯示一側或另一側。前面是顯示器(玩家看到的螢幕),而後面是隱藏的,只有計算機可以“看到”它。每一幀,我們都在背面繪製所有圖畫 - 每個角色,每個子彈,每個閃耀的光線等等。然後,當我們完成後,我們將棋盤翻轉並顯示新的框架。這意味著我們只是每幀執行一次與顯示器交談的緩慢過程,而不是螢幕上的每一件事。

所有這些都在pygame中自動發生。完成繪圖後,您只需要告訴它翻轉白板。實際上,命令甚至命名為flip()

    # Draw / render
    screen.fill(BLACK)
    # *after* drawing everything, flip the display
    pygame.display.flip()

只要確保你總是做到flip() 最後。如果你試圖在翻轉後畫一些東西,它將不會被看到!

輸入/事件部分

我們還沒有遊戲,所以我們無法真正說出我們想要聽的鍵或滑鼠按鈕或其他控制元件。但是,我們需要設定一個重要事件。如果您現在嘗試執行該程式,您會發現您遇到了問題:無法關閉視窗!單擊角落中的“X”不起作用。那是因為那實際上是一個事件,我們需要告訴我們的程式監聽該事件並讓它退出遊戲。

事件可以隨時發生。如果玩家在更新或繪製部分迴圈時點選“跳轉”按鈕怎麼辦?你不想忽略那個輸入 - 玩家會感到沮喪。所以Pygame所做的就是儲存自上一幀以來發生的所有事件。這樣,如果玩家快速搗碎大量按鈕,您可以確保瞭解所有這些按鈕。這將是一個列表,所以我們執行一個for迴圈來檢視所有這些:

    for event in pygame.event.get():
        # check for closing window
        if event.type == pygame.QUIT:
            running = False

Pygame有很多可以找到的事件。 pygame.QUIT是單擊“X”時發生的事件,因此我們設定runningFalse並且遊戲迴圈將結束。

控制FPS

我們還沒有任何東西要放在“更新”部分,但我們仍然需要確保使用我們的FPS設定來控制速度。我們可以這樣做:

while running:
    # keep loop running at the right speed
    clock.tick(FPS)

tick()命令告訴pygame弄清楚迴圈花了多長時間,然後暫停一段時間,使整個迴圈(意味著整個幀)持續適當的時間。如果我們設定FPS為30,這意味著我們需要框架每個迴圈將持續1 / 30(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專案時都可以重複使用它。

在下一個教程中,我們將使用此模板作為學習如何在螢幕上繪製物件並讓它們四處移動的起點。

相關文章