python Pygame的具體使用講解,pythonpygame講解
一、實驗介紹
1.1 實驗內容
在本節課中,我們將講解Pygame的常用對象及其操作,包括圖形、動畫、文字、音頻等,確保同學們對Pygame有一個基礎的瞭解,同時為後續課程做好準備。
1.2 實驗知識點
- Pygame圖形
- Pygame動畫
- Pygame文字
- Pygame音頻
- Pygame事件
1.3 實驗環境
- Python 2.7.6
- Xfce終端
1.4 適合人群
本課程難度為一般,屬於初級層級課程,適合具有Python基礎的使用者,熟悉Python基礎知識加深鞏固。
1.5 代碼擷取
本節實驗所用到的代碼和相關資源檔可以通過下面命令下載到實驗樓環境中,作為參照對比進行學習。
$ wget http://labfile.oss.aliyuncs.com/courses/940/foundation.zip
解壓縮至 /home/shiyanlou/foundation :
$ unzip foundation.zip
二、開發準備
本次課程主要利用Pygame模組來進行開發,首先我們需要開啟Xfce終端,並使用 pip 命令來安裝Pygame
$ sudo pip install pygame
安裝完成之後進入Python的互動介面,輸入以下命令查看是否成功安裝。
import pygame
若無異常,則說明安裝成功。
三、實驗步驟
3.1 HelloWorld
首先開始我們第一個HelloWorld程式:
# -*- coding: UTF-8 -*-# helloworld.py# 匯入所需的模組import pygame, sys# 匯入所有pygame.locals裡的變數(比如下面大寫的QUIT變數)from pygame.locals import *# 初始化pygamepygame.init()# 設定視窗的大小,單位為像素screen = pygame.display.set_mode((500, 400))# 設定視窗標題pygame.display.set_caption('Hello World')# 程式主迴圈while True: # 擷取事件 for event in pygame.event.get(): # 判斷事件是否為退出事件 if event.type == QUIT: # 退出pygame pygame.quit() # 退出系統 sys.exit() # 繪製螢幕內容 pygame.display.update()
如下:
這裡解釋一下上面程式的運行方式
一個遊戲迴圈(也可以稱為主迴圈)就做下面這三件事:
- 處理事件
- 更新遊戲狀態
- 繪製遊戲狀態到螢幕上
3.2 繪製圖形
Pygame的座標原點(0,0)點位於左上方,X軸自左向右,Y軸自上向下,單位為像素。
這裡介紹一下常用的方法:
pygame.draw.line(Surface, color, start_pos, end_pos, width)此方法用於繪製一條線段
pygame.draw.aaline(Surface, color, start_pos, end_pos, blend)此方法用於繪製一條消除鋸齒的線
pygame.draw.lines(Surface, color, closed, pointlist, width)此方法用於繪製一條折線
pygame.draw.rect(Surface, color, Rect)此方法用於繪製一個矩形
pygame.draw.rect(Surface, color, Rect, width)此方法用於繪製一個矩形框
pygame.draw.ellipse(Surface, color, Rect)此方法用於繪製一個橢圓
pygame.draw.ellipse(Surface, color, Rect, width)此方法用於繪製一個橢圓框
pygame.draw.polygon(Surface, color, pointlist, width)此方法用於繪製一個多邊形
pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width)此方法用於繪製一條弧線
pygame.draw.circle(Surface, color, Rect, radius)此方法用於繪製一個圓
以下為範例程式碼:
# -*- coding: UTF-8 -*-# drawing.py# 匯入需要的模組import pygame, sysfrom pygame.locals import *from math import pi# 初始化pygamepygame.init()# 設定視窗的大小,單位為像素screen = pygame.display.set_mode((400,300))# 設定視窗標題pygame.display.set_caption('Drawing')# 定義顏色BLACK = ( 0, 0, 0)WHITE = (255, 255, 255)RED = (255, 0, 0)GREEN = ( 0, 255, 0)BLUE = ( 0, 0, 255)# 設定背景顏色screen.fill(WHITE)# 繪製一條線pygame.draw.line(screen, GREEN, [0, 0], [50,30], 5)# 繪製一條消除鋸齒的線pygame.draw.aaline(screen, GREEN, [0, 50],[50, 80],True)# 繪製一條折線pygame.draw.lines(screen, BLACK, False, [[0, 80], [50, 90], [200, 80], [220, 30]], 5)# 繪製一個空心矩形pygame.draw.rect(screen, BLACK, [75, 10, 50, 20], 2)# 繪製一個矩形pygame.draw.rect(screen, BLACK, [150, 10, 50, 20])# 繪製一個空心橢圓pygame.draw.ellipse(screen, RED, [225, 10, 50, 20], 2)# 繪製一個橢圓pygame.draw.ellipse(screen, RED, [300, 10, 50, 20])# 繪製多邊形pygame.draw.polygon(screen, BLACK, [[100, 100], [0, 200], [200, 200]], 5)# 繪製多條弧線pygame.draw.arc(screen, BLACK,[210, 75, 150, 125], 0, pi/2, 2)pygame.draw.arc(screen, GREEN,[210, 75, 150, 125], pi/2, pi, 2)pygame.draw.arc(screen, BLUE, [210, 75, 150, 125], pi,3*pi/2, 2)pygame.draw.arc(screen, RED, [210, 75, 150, 125], 3*pi/2, 2*pi, 2)# 繪製一個圓pygame.draw.circle(screen, BLUE, [60, 250], 40)# 程式主迴圈while True: # 擷取事件 for event in pygame.event.get(): # 判斷事件是否為退出事件 if event.type == QUIT: # 退出pygame pygame.quit() # 退出系統 sys.exit() # 繪製螢幕內容 pygame.display.update()
如下:
3.3 實現動畫
由於人類眼睛的特殊生理結構,當所看畫面的幀率高於24的時候,就會認為是連貫的,此現象稱之為 視覺暫留 。
幀率(Frame rate)是用於測量顯示幀數的量度,所謂的測量單位為每秒顯示幀數(Frames per Second,簡稱:FPS)
一般來說30fps是可以接受的,但是將效能提升至60fps則可以明顯提升互動感和逼真感,但是一般來說超過75fps一般就不容易察覺到有明顯的流暢度提升了。
在我們原有座標系的基礎上添加位移量,再重新繪製,依次一張一張的迴圈繪製下去,就會得到我們想要的物體移動的效果。
Pygame實現動畫主要用到的方法:
pygame.image.load(filename)載入一張圖片
pygame.Surface.blit(source, dest, area=None, special_flags = 0)將圖片繪製到螢幕相應座標上(後面兩個參數預設,可以不傳)
pygame.time.Clock()獲得pygame的時鐘
pygame.time.Clock.tick(FPS)設定pygame時鐘的間隔時間
以下為範例程式碼:
# -*- coding: UTF-8 -*-# animation.py# 匯入需要的模組import pygame, sysfrom pygame.locals import *# 初始化pygamepygame.init()# 設定幀率(螢幕每秒重新整理的次數)FPS = 30# 獲得pygame的時鐘fpsClock = pygame.time.Clock()# 設定視窗大小screen = pygame.display.set_mode((500, 400), 0, 32)# 設定標題pygame.display.set_caption('Animation')# 定義顏色WHITE = (255, 255, 255)# 載入一張圖片(所用到的的圖片請參考1.5代碼擷取)img = pygame.image.load('resources/shiyanlou.PNG')# 初始化圖片的位置imgx = 10imgy = 10# 初始化圖片的移動方向direction = 'right'# 程式主迴圈while True: # 每次都要重新繪製背景白色 screen.fill(WHITE) # 判斷移動的方向,並對相應的座標做加減 if direction == 'right': imgx += 5 if imgx == 380: direction = 'down' elif direction == 'down': imgy += 5 if imgy == 300: direction = 'left' elif direction == 'left': imgx -= 5 if imgx == 10: direction = 'up' elif direction == 'up': imgy -= 5 if imgy == 10: direction = 'right' # 該方法將用於圖片繪製到相應的座標中 screen.blit(img, (imgx, imgy)) for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() # 重新整理螢幕 pygame.display.update() # 設定pygame時鐘的間隔時間 fpsClock.tick(FPS)
如下:
3.4 繪製文字
如果你想繪製文字到螢幕上,Pygame提供了很方便的方法使用.ttf字型檔,這樣我們就能很輕易的將文字繪製在螢幕上了。
這裡我使用了ARBERKLEY.ttf作為字型,字型檔的擷取請參考1.5代碼擷取。
主要用到的方法:
pygame.font.Font(filename, size)
filename:字型檔的檔案名稱;
size:字型的高height,單位為像素;
pygame.font.Font.render(text, antialias, color, background=None)
text:要顯示的文字;
antialias: 是否消除鋸齒;
color:字型顏色;
background:背景顏色(選擇性參數);
.get_rect()
獲得一個對象的rect,以便於設定其座標位置
以下為範例程式碼:
# -*- coding: UTF-8 -*-# font.py# 匯入需要的模組import pygame, sysfrom pygame.locals import *# 初始化pygamepygame.init()# 設定視窗的大小,單位為像素screen = pygame.display.set_mode((500,400))# 設定視窗的標題pygame.display.set_caption('Font')# 定義顏色WHITE = (255, 255, 255)GREEN = ( 0, 255, 0)BLUE = ( 0, 0, 128)# 通過字型檔獲得字型對象fontObj = pygame.font.Font('resources/ARBERKLEY.ttf', 50)# 配置要顯示的文字textSurfaceObj = fontObj.render('Pygame', True, BLUE, GREEN)# 獲得要顯示的對象的recttextRectObj = textSurfaceObj.get_rect()# 設定顯示對象的座標textRectObj.center = (250, 200)# 設定背景screen.fill(WHITE)# 繪製字型screen.blit(textSurfaceObj, textRectObj)# 程式主迴圈while True: # 擷取事件 for event in pygame.event.get(): # 判斷事件是否為退出事件 if event.type == QUIT: # 退出pygame pygame.quit() # 退出系統 sys.exit() # 繪製螢幕內容 pygame.display.update()
如下:
3.5 播放音頻
在Pygame裡播放音頻有兩個方法,一個用來播放特效聲音,一個用來播放背景音樂:
pygame.mixer.Sound(filename)
該方法返回一個Sound對象,調用它的.play( )方法,即可播放較短的音頻檔案(比如玩家受到傷害、收集到金幣等);
pygame.mixer.music.load(filename)
該方法用來載入背景音樂,之後調用pygame.mixer.music.play( )方法就可以播放背景音樂(Pygame只允許載入一個背景音樂在同一個時刻)
以下為範例程式碼:
# -*- coding: UTF-8 -*-# audio.py# 匯入需要的模組import pygame, sysfrom pygame.locals import *# 初始化pygamepygame.init()# 設定視窗的大小,單位為像素screen = pygame.display.set_mode((500,400))# 設定視窗的標題pygame.display.set_caption('Audio')# 定義顏色WHITE = (255, 255, 255)# 設定背景screen.fill(WHITE)# 載入並播放一個特效音頻檔案(所用到的音頻檔案請參考1.5代碼擷取)sound = pygame.mixer.Sound('resources/bounce.ogg')sound.play()# 載入背景音樂檔案pygame.mixer.music.load('resources/bgmusic.mp3')# 播放背景音樂,第一個參數為播放的次數(-1表示無限迴圈),第二個參數是設定播放的起點(單位為秒)pygame.mixer.music.play(-1, 0.0)# 程式主迴圈while True: # 擷取事件 for event in pygame.event.get(): # 判斷事件是否為退出事件 if event.type == QUIT: # 停止播放背景音樂 pygame.mixer.music.stop() # 退出pygame pygame.quit() # 退出系統 sys.exit() # 繪製螢幕內容 pygame.display.update()
注意:因實驗樓裡暫時不能播放音頻,上述代碼在實驗樓環境中可能無法正常運行,同學們可以在自己的電腦上嘗試運行。
3.6 事件
Pygame裡常用的事件如下表:
事件 |
產生途徑 |
參數 |
QUIT |
使用者按下關閉按鈕 |
none |
ACTIVEEVENT |
Pygame被啟用或者隱藏 |
gain, state |
KEYDOWN |
鍵盤被按下 |
unicode, key, mod |
KEYUP |
鍵盤被放開 |
key, mod |
MOUSEMOTION |
滑鼠移動 |
pos, rel, buttons |
MOUSEBUTTONDOWN |
滑鼠按下 |
pos, button |
MOUSEBUTTONUP |
滑鼠放開 |
pos, button |
VIDEORESIZE |
Pygame視窗縮放 |
size, w, h |
以下為範例程式碼:
# -*- coding: UTF-8 -*-# event.py# 匯入需要的模組import pygame, sysfrom pygame.locals import *# 定義顏色WHITE = (255, 255, 255)# 初始化pygamepygame.init()# 設定視窗的大小,單位為像素screen = pygame.display.set_mode((500,400), 0, 32)# 設定視窗的標題pygame.display.set_caption('Event')# 設定背景screen.fill(WHITE)# 程式主迴圈while True: # 擷取事件 for event in pygame.event.get(): # 判斷事件是否為退出事件 if event.type == QUIT: # 退出pygame pygame.quit() # 退出系統 sys.exit() # 獲得滑鼠當前的位置 if event.type ==MOUSEMOTION: print(event.pos) # 獲得滑鼠按下的位置 if event.type ==MOUSEBUTTONDOWN: print("滑鼠按下:",event.pos) # 獲得滑鼠抬起的位置 if event.type ==MOUSEBUTTONUP: print("滑鼠抬起:",event.pos) # 獲得鍵盤按下的事件 if event.type == KEYDOWN: if(event.key==K_UP or event.key==K_w): print("上") if(event.key==K_DOWN or event.key==K_s): print("下") if(event.key==K_LEFT or event.key==K_a): print("左") if(event.key==K_RIGHT or event.key==K_d): print("右") # 按下鍵盤的Esc鍵退出 if(event.key==K_ESCAPE): # 退出pygame pygame.quit() # 退出系統 sys.exit() # 繪製螢幕內容 pygame.display.update()
如下:
四、實驗總結
本節課程我們主要講解了Pygame的一些常用對象及操作,這些都是我們後續課程需要用到的知識點,希望同學們能熟練掌握這些內容。若想要深入瞭解,可參考下方Pygame官方文檔的連結。
五、參考連結
Pygame官方文檔
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。