Python是一門很有意思的語言,它的功能很強大,你可以用它來做科學運算,或者數字影像處理,或者任務的自動化,還可以構建動態網站,很多很多聽起來就很有意思的實現。關於Python你還可以找到更多的資料,這裡不一一贅述。
一說到開始學習一門新的程式語言,很多童鞋可能馬上想到,“嗯,哥去買本書啃啃!”,
結果買了本大木頭,全是枯燥的語法知識,看了後面忘了前面,事倍功半。
記得以前有位朋友跟我說,想學一門新技術,從做一個專案開始,這句話還是很值得思考的!
(作沉思狀(`・ω・´))
所以!入正題了!
我們不如做個小遊戲吧,熟悉熟悉Python的語法,還不怕悶到自己~
Python的庫是Python相當重要的組成部分,我們可以通過這些庫來實現許多的功能。
我們的目標就是通過pygame來實現一個小遊戲!
那具體做什麼呢?我已經找到方向了!
就是做個PC端的微信飛機大戰~因為這個遊戲的模式簡單,功能明確,介面簡潔,非常符合我們預期的目標。
不過我在這裡要重申一點,這個想法並不是由我想出來的,是我在github上找到的,附上地址:PyShootGame (使用的資源也在這裡哦!)。
最後說明一下,本系列博文使用的是Python 3.6 + pygame 1.9.4。
關於Python 2.x和3.x版本我就不作比較了,語義理解就好。記得Python要跟對應的pygame版本對應好哦~
第一步:下載github 資源,先把resource 資源拿過來
git 自行下載
第二步:pygame的安裝
首先Python你得有吧,pygame最簡單的辦法當然是從官網下載啦(附上:www.pygame.org/download.shtml)。
還有線上文件,附上:www.pygame.org/docs/)
那pygame中有哪些模組呢,docs中也已給出:
模組 簡介
- pygame.BufferProxy An array protocol view of surface pixels
- pygame.cdrom How to access and control the CD audio devices.
- pygame.Color Color representation.
- pygame.cursors Loading and compiling cursor images.
- pygame.display Configure the display surface.
- pygame.draw Drawing simple shapes like lines and ellipses to surfaces.
- pygame.event Manage the incoming events from various input devices and the windowing platform.
- pygame.examples Various programs demonstrating the use of individual pyame modules.
- pygame.font Loading and rendering Truetype fonts.
- pygame.freetype Enhanced Pygame module for loading and rendering font faces.
- pygame.gfxdraw Anti-aliasing draw functions.
- pygame.image Loading, saving, and transferring of surfaces.
- pygame.joystick Manage the joystick devices.
- pygame.key Manage the keyboard device.
- pygame.locals Pygame constants.
- pygame.mixer Load and play sounds
- pygame.mouse Manage the mouse device and display.
- pygame.movie Video playback from MPEG movies.
- pygame.mixer.music Play streaming music tracks.
- pygame.Overlay Access advanced video overlays.
- pygame Top level functions to manage Pygame.
- pygame.PixelArray Manipulate image pixel data.
- pygame.Rect Flexible container for a rectangle.
- pygame.scrap Native clipboard access.
- pygame.sndarray Manipulate sound sample data.
- pygame.sprite Higher level objects to represent game images.
- pygame.Surface Objects for images and the screen.
- pygame.surfarray Manipulate image pixel data.
- pygame.tests Test Pygame.
- pygame.time Manage timing and framerate.
- pygame.transform Resize and move images.
簡介裡都是很直觀的介紹,這裡不多解釋。模組裡面提供比較直接的操作(只是相對的),像貼一幅影像;也提供抽象層次比較高的操作,像精靈模組(sprite)。反正我們有個大致的瞭解,用到什麼,再去認真學習相關的東西。
第三步:開始做遊戲啦!
我們的第一個任務——新增遊戲背景
2.1 在載入背景前,我們得先有個window吧?動手吧~
import pygame # 匯入pygame庫
from pygame.locals import * # 匯入pygame庫中的一些常量
from sys import exit # 匯入sys庫中的exit函式
# 定義視窗的解析度
SCREEN_WIDTH = 480
SCREEN_HEIGHT = 640
# 初始化遊戲
pygame.init() # 初始化pygame
screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT]) # 初始化一個用於顯示的視窗
pygame.display.set_caption('This is my first pygame-program') # 設定視窗標題
#事件迴圈(main loop)
while True:
# 處理遊戲退出
# 從訊息佇列中迴圈取
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
程式執行結果:
雖然漆黑一片,也不見得能幹什麼,但總算是踏出了第一步~
2.2 接下來要對程式中幾個部分進行著重解釋:
line 2:pygame.locals模組裡面包含了很多pygame需要用到的常量,例如set_mode裡面視窗的標誌(flags)、訊息事件(event)的型別等等。另外,程式想使用pygame.locals模組裡面pygame的常量的話,只能使用“from pygame.locals import *”。
line 3:Python簡潔性的一個體現就是,你需要用什麼功能,就匯入什麼功能。這裡我們需要用到exit函式來關閉視窗,從sys庫中匯入便是。
line 5:背景圖片的解析度實際是480*800,但我電腦螢幕解析度只有1280*800,所以我暫時把它改“矮”了。
line 10:pygame.init()將會初始化所有匯入的pygame模組。不過當某一模組發生錯誤時,這個函式並不會丟擲異常,相對地,init()會返回一個元組,包括成功初始化的模組的數量以及發生錯誤的模組的數量。在這個例子中,輸出init()返回的資訊可以看到,
>>> ================================ RESTART ================================
>>>
(6, 0)
如果你願意的話也可以手動的逐個模組初始化,這樣就可以捕捉到丟擲的異常了。
line 11:set_mode()函式將會建立一個顯示皮膚(surface),它有三個引數,第一個是surface的解析度,也就是視窗的大小,以元組的形式輸入(width, height) ,如果沒有輸入或者設定為(0, 0)的話,系統將會把surface的解析度設定成當前螢幕解析度(pygame uses sdl version 1.2.10 or above);第二個是標誌位(flags),也就是選定surface的顯示模式,見下列表:
複製程式碼
#pygame.FULLSCREEN create a fullscreen display
#pygame.DOUBLEBUF recommended for HWSURFACE or OPENGL
#pygame.HWSURFACE hardware accelerated, only in FULLSCREEN
#pygame.OPENGL create an OpenGL renderable display
#pygame.RESIZABLE display window should be sizeable
#pygame.NOFRAME display window will have no border or controls
複製程式碼
第三個引數是位深(depth),即用多少位來表現顏色,文件建議不需要設定此引數,系統會選擇最優值。
line 15:在我們主程式中,我們需要一個事件的迴圈(loop)來不斷地檢測互動過程中使用者的操作。pygame.event.get()方法可以從事件佇列得到所有事件的一個列表,我們使用一個迴圈不斷地檢測每一個事件,一旦我們找到quit事件,我們就退出遊戲關閉視窗。還有一點值得我們思考,如果我們不設定退出操作,我們的黑視窗又會變成怎樣呢?結果是,我們點選視窗右上角的紅色叉叉時,程式依然可以檢測到quit事件,但是視窗是不會關閉的,因為我們沒有為它設定相關的操作。
2.3 正式載入背景
有了上面的知識,我們已經大致瞭解程式的框架了,那麼入正題!載入背景圖片~
注意,我們新增幾條語句即可~(。・ω・。)
import pygame # 匯入pygame庫
from pygame.locals import * # 匯入pygame庫中的一些常量
from sys import exit # 匯入sys庫中的exit函式
# 定義視窗的解析度
SCREEN_WIDTH = 480
SCREEN_HEIGHT = 640
# 初始化遊戲
pygame.init() # 初始化pygame
screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT]) # 初始化視窗
pygame.display.set_caption('This is my first pygame-program') # 設定視窗標題
# 載入背景圖
background = pygame.image.load('resources/image/background.png') # new
# 事件迴圈(main loop)
while True:
# 繪製背景
screen.blit(background, (0, 0)) # new
# 更新螢幕
pygame.display.update() # new
# 處理遊戲退出
# 從訊息佇列中迴圈取
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
程式執行結果:
我們在原來的程式上增加了3條語句。第一句是載入背景圖片的,resources資料夾要跟你的py檔案放在一起哦;第二句用來繪製影像,surface.blit()算是很常用的函式了,第一個引數是影像資源,第二個引數決定影像放置的位置(左上角的座標);第三個語句是更新螢幕,就是把繪製好的背景給“刷”上去。在這裡多說一點,關於pygame.display.flip()和pygame.display.update(),文件上說,update更像是flip的優化版本,主要區別是flip是螢幕的整體重新整理(entire),而update是區域性重新整理(portion)。最後來思考一個問題,假如我們把後面兩條新語句移到while迴圈上面會怎樣?在這個demo中不會有明顯影響,但當以後我們在螢幕中加入其它影像元素後,一執行update操作,背景圖就沒有了。
※有位博主用心的把pygame的模組簡介翻譯了一下,附上地址:eyehere.net/2011/python-pygame-novice-professional-1/
本作品採用《CC 協議》,轉載必須註明作者和本文連結