Pygame - Python 遊戲程式設計入門 class1

kuibatian發表於2019-11-15

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

ubuntu 如何安裝pygame

還有線上文件,附上:www.pygame.org/docs/)

那pygame中有哪些模組呢,docs中也已給出:

模組 簡介

  1. pygame.BufferProxy An array protocol view of surface pixels
  2. pygame.cdrom How to access and control the CD audio devices.
  3. pygame.Color Color representation.
  4. pygame.cursors Loading and compiling cursor images.
  5. pygame.display Configure the display surface.
  6. pygame.draw Drawing simple shapes like lines and ellipses to surfaces.
  7. pygame.event Manage the incoming events from various input devices and the windowing platform.
  8. pygame.examples Various programs demonstrating the use of individual pyame modules.
  9. pygame.font Loading and rendering Truetype fonts.
  10. pygame.freetype Enhanced Pygame module for loading and rendering font faces.
  11. pygame.gfxdraw Anti-aliasing draw functions.
  12. pygame.image Loading, saving, and transferring of surfaces.
  13. pygame.joystick Manage the joystick devices.
  14. pygame.key Manage the keyboard device.
  15. pygame.locals Pygame constants.
  16. pygame.mixer Load and play sounds
  17. pygame.mouse Manage the mouse device and display.
  18. pygame.movie Video playback from MPEG movies.
  19. pygame.mixer.music Play streaming music tracks.
  20. pygame.Overlay Access advanced video overlays.
  21. pygame Top level functions to manage Pygame.
  22. pygame.PixelArray Manipulate image pixel data.
  23. pygame.Rect Flexible container for a rectangle.
  24. pygame.scrap Native clipboard access.
  25. pygame.sndarray Manipulate sound sample data.
  26. pygame.sprite Higher level objects to represent game images.
  27. pygame.Surface Objects for images and the screen.
  28. pygame.surfarray Manipulate image pixel data.
  29. pygame.tests Test Pygame.
  30. pygame.time Manage timing and framerate.
  31. 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 協議》,轉載必須註明作者和本文連結

每天5分鐘,與你一起蛻變!上海php自學中心,目前專注於php,python,golang~撒花!
S3d25uqwht.png!large
公眾號7Dn78VKKcW.jpg!large

相關文章