這系列的第一篇通過建立一個簡單的骰子遊戲來探究 Python。現在是來從零制作你自己的遊戲的時間。
在我的這系列的第一篇文章 中, 我已經講解如何使用 Python 建立一個簡單的、基于文本的骰子遊戲。這次,我将展示如何使用 Python 子產品 Pygame 來建立一個圖形化遊戲。它将需要幾篇文章才能來得到一個确實做成一些東西的遊戲,但是到這系列的結尾,你将更好地了解如何查找和學習新的 Python 子產品和如何從其基礎上建構一個應用程式。
在開始前,你必須安裝 Pygame 。
安裝新的 Python 子產品
有幾種方法來安裝 Python 子產品,但是最通用的兩個是:
pip
兩個方法都工作的很好,并且每一個都有它自己的一套優勢。如果你是在 Linux 或 BSD 上開發,可以利用你的發行版的軟體存儲庫來自動和及時地更新。
然而,使用 Python 的内置軟體包管理器可以給予你控制更新子產品時間的能力。而且,它不是特定于作業系統的,這意味着,即使當你不是在你常用的開發機器上時,你也可以使用它。
pip
的其它的優勢是允許本地安裝子產品,如果你沒有正在使用的計算機的管理權限,這是有用的。
使用 pip
如果 Python 和 Python3 都安裝在你的系統上,你想使用的指令很可能是
pip3
,它用來區分 Python 2.x 的
pip
的指令。如果你不确定,先嘗試
pip3
。
pip
指令有些像大多數 Linux 軟體包管理器一樣工作。你可以使用
search
搜尋 Python 子產品,然後使用
install
安裝它們。如果你沒有你正在使用的計算機的管理權限來安裝軟體,你可以使用
--user
選項來僅僅安裝子產品到你的家目錄。
$ pip3 search pygame [...] Pygame (1.9.3) - Python Game Development sge-pygame (1.5) - A 2-D game engine for Python pygame_camera (0.1.1) - A Camera lib for PyGame pygame_cffi (0.2.1) - A cffi-based SDL wrapper that copies the pygame API. [...] $ pip3 install Pygame --user
Pygame 是一個 Python 子產品,這意味着它僅僅是一套可以使用在你的 Python 程式中的庫。換句話說,它不是一個像 IDLE 或 Ninja-IDE 一樣可以讓你啟動的程式。
Pygame 新手入門
一個電子遊戲需要一個背景設定:故事發生的地點。在 Python 中,有兩種不同的方法來建立你的故事背景:
- 設定一種背景顔色
- 設定一張背景圖檔
你的背景僅是一張圖檔或一種顔色。你的電子遊戲人物不能與在背景中的東西互相作用,是以,不要在後面放置一些太重要的東西。它僅僅是設定裝飾。
設定你的 Pygame 腳本
要開始一個新的 Pygame 工程,先在計算機上建立一個檔案夾。遊戲的全部檔案被放在這個目錄中。在你的工程檔案夾内部保持所需要的所有的檔案來運作遊戲是極其重要的。
一個 Python 腳本以檔案類型、你的姓名,和你想使用的許可證開始。使用一個開放源碼許可證,以便你的朋友可以改善你的遊戲并與你一起分享他們的更改:
#!/usr/bin/env python3 # by Seth Kenlon ## GPLv3 # This program is free software: you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>.
然後,你告訴 Python 你想使用的子產品。一些子產品是常見的 Python 庫,當然,你想包括一個你剛剛安裝的 Pygame 子產品。
import pygame # 加載 pygame 關鍵字 import sys # 讓 python 使用你的檔案系統 import os # 幫助 python 識别你的作業系統
由于你将用這個腳本檔案做很多工作,在檔案中分成段落是有幫助的,以便你知道在哪裡放代碼。你可以使用塊注釋來做這些,這些注釋僅在看你的源檔案代碼時是可見的。在你的代碼中建立三個塊。
''' Objects ''' # 在這裡放置 Python 類和函數 ''' Setup ''' # 在這裡放置一次性的運作代碼 ''' Main Loop ''' # 在這裡放置遊戲的循環代碼指令
接下來,為你的遊戲設定視窗大小。注意,不是每一個人都有大計算機螢幕,是以,最好使用一個适合大多數人的計算機的螢幕大小。
這裡有一個方法來切換全屏模式,很多現代電子遊戲都會這樣做,但是,由于你剛剛開始,簡單起見僅設定一個大小即可。
''' Setup ''' worldx = 960 worldy = 720
在腳本中使用 Pygame 引擎前,你需要一些基本的設定。你必須設定幀頻,啟動它的内部時鐘,然後開始 (
init
)Pygame 。
fps = 40 # 幀頻 ani = 4 # 動畫循環 clock = pygame.time.Clock() pygame.init()
現在你可以設定你的背景。
設定背景
在你繼續前,打開一個圖形應用程式,為你的遊戲世界建立一個背景。在你的工程目錄中的
images
檔案夾内部儲存它為
stage.png
。
這裡有一些你可以使用的自由圖形應用程式。
- Krita 是一個專業級繪圖素材模拟器,它可以被用于建立漂亮的圖檔。如果你對建立電子遊戲藝術作品非常感興趣,你甚至可以購買一系列的 遊戲藝術作品教程 。
- Pinta 是一個基本的,易于學習的繪圖應用程式。
- Inkscape 是一個矢量圖形應用程式。使用它來繪制形狀、線、樣條曲線和貝塞爾曲線。
你的圖像不必很複雜,你可以以後回去更改它。一旦有了它,在你檔案的 Setup 部分添加這些代碼:
world = pygame.display.set_mode([worldx,worldy]) backdrop = pygame.image.load(os.path.join('images','stage.png').convert()) backdropbox = world.get_rect()
如果你僅僅用一種顔色來填充你的遊戲的背景,你需要做的就是:
world = pygame.display.set_mode([worldx,worldy])
你也必須定義顔色以使用。在你的 Setup 部分,使用紅、綠、藍 (RGB) 的值來建立一些顔色的定義。
''' Setup ''' BLUE = (25,25,200) BLACK = (23,23,23 ) WHITE = (254,254,254)
至此,你理論上可以啟動你的遊戲了。問題是,它可能僅持續了一毫秒。
為證明這一點,儲存你的檔案為
your-name_game.py
(用你真實的名稱替換
your-name
)。然後啟動你的遊戲。
如果你正在使用 IDLE,通過選擇來自 “Run” 菜單的 “Run Module” 來運作你的遊戲。
如果你正在使用 Ninja,在左側按鈕條中單擊 “Run file” 按鈕。
你也可以直接從一個 Unix 終端或一個 Windows 指令提示符中運作一個 Python 腳本。
$ python3 ./your-name_game.py
如果你正在使用 Windows,使用這指令:
py.exe your-name_game.py
啟動它,不過不要期望很多,因為你的遊戲現在僅僅持續幾毫秒。你可以在下一部分中修複它。
循環
除非另有說明,一個 Python 腳本運作一次并僅一次。近來計算機的運作速度是非常快的,是以你的 Python 腳本運作時間會少于 1 秒鐘。
為強制你的遊戲來處于足夠長的打開和活躍狀态來讓人看到它(更不要說玩它),使用一個
while
循環。為使你的遊戲儲存打開,你可以設定一個變量為一些值,然後告訴一個
while
循環隻要變量保持未更改則一直儲存循環。
這經常被稱為一個“主循環”,你可以使用術語
main
作為你的變量。在你的 Setup 部分的任意位置添加代碼:
main = True
在主循環期間,使用 Pygame 關鍵字來檢查鍵盤上的按鍵是否已經被按下或釋放。添加這些代碼到你的主循環部分:
''' Main loop ''' while main == True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit(); sys.exit() main = False if event.type == pygame.KEYDOWN: if event.key == ord('q'): pygame.quit() sys.exit() main = False
也是在你的循環中,重新整理你世界的背景。
如果你使用一個圖檔作為背景:
world.blit(backdrop, backdropbox)
如果你使用一種顔色作為背景:
world.fill(BLUE)
最後,告訴 Pygame 來重新重新整理螢幕上的所有内容,并推進遊戲的内部時鐘。
pygame.display.flip() clock.tick(fps)
儲存你的檔案,再次運作它來檢視你曾經建立的最無趣的遊戲。
退出遊戲,在你的鍵盤上按
q
鍵。