python Pygame的具體使用講解
一、實(shí)驗(yàn)介紹
1.1 實(shí)驗(yàn)內(nèi)容
在本節(jié)課中,我們將講解Pygame的常用對(duì)象及其操作,包括圖形、動(dòng)畫、文字、音頻等,確保同學(xué)們對(duì)Pygame有一個(gè)基礎(chǔ)的了解,同時(shí)為后續(xù)課程做好準(zhǔn)備。
1.2 實(shí)驗(yàn)知識(shí)點(diǎn)
- Pygame圖形
- Pygame動(dòng)畫
- Pygame文字
- Pygame音頻
- Pygame事件
1.3 實(shí)驗(yàn)環(huán)境
- Python 2.7.6
- Xfce終端
1.4 適合人群
本課程難度為一般,屬于初級(jí)級(jí)別課程,適合具有Python基礎(chǔ)的用戶,熟悉Python基礎(chǔ)知識(shí)加深鞏固。
1.5 代碼獲取
本節(jié)實(shí)驗(yàn)所用到的代碼和相關(guān)資源文件可以通過(guò)下面命令下載到實(shí)驗(yàn)樓環(huán)境中,作為參照對(duì)比進(jìn)行學(xué)習(xí)。
$ wget http://labfile.oss.aliyuncs.com/courses/940/foundation.zip
解壓縮至 /home/shiyanlou/foundation :
$ unzip foundation.zip
二、開發(fā)準(zhǔn)備
本次課程主要利用Pygame模塊來(lái)進(jìn)行開發(fā),首先我們需要打開Xfce終端,并使用 pip 命令來(lái)安裝Pygame
$ sudo pip install pygame
安裝完成之后進(jìn)入Python的交互界面,輸入以下命令查看是否成功安裝。
import pygame
若無(wú)異常,則說(shuō)明安裝成功。
三、實(shí)驗(yàn)步驟
3.1 HelloWorld
首先開始我們第一個(gè)HelloWorld程序:
# -*- coding: UTF-8 -*-
# helloworld.py
# 導(dǎo)入所需的模塊
import pygame, sys
# 導(dǎo)入所有pygame.locals里的變量(比如下面大寫的QUIT變量)
from pygame.locals import *
# 初始化pygame
pygame.init()
# 設(shè)置窗口的大小,單位為像素
screen = pygame.display.set_mode((500, 400))
# 設(shè)置窗口標(biāo)題
pygame.display.set_caption('Hello World')
# 程序主循環(huán)
while True:
# 獲取事件
for event in pygame.event.get():
# 判斷事件是否為退出事件
if event.type == QUIT:
# 退出pygame
pygame.quit()
# 退出系統(tǒng)
sys.exit()
# 繪制屏幕內(nèi)容
pygame.display.update()
效果圖如下:
這里解釋一下上面程序的運(yùn)行方式
一個(gè)游戲循環(huán)(也可以稱為主循環(huán))就做下面這三件事:
- 處理事件
- 更新游戲狀態(tài)
- 繪制游戲狀態(tài)到屏幕上
3.2 繪制圖形
Pygame的坐標(biāo)原點(diǎn)(0,0)點(diǎn)位于左上角,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)此方法用于繪制一個(gè)矩形
pygame.draw.rect(Surface, color, Rect, width)此方法用于繪制一個(gè)矩形框
pygame.draw.ellipse(Surface, color, Rect)此方法用于繪制一個(gè)橢圓
pygame.draw.ellipse(Surface, color, Rect, width)此方法用于繪制一個(gè)橢圓框
pygame.draw.polygon(Surface, color, pointlist, width)此方法用于繪制一個(gè)多邊形
pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width)此方法用于繪制一條弧線
pygame.draw.circle(Surface, color, Rect, radius)此方法用于繪制一個(gè)圓
以下為示例代碼:
# -*- coding: UTF-8 -*-
# drawing.py
# 導(dǎo)入需要的模塊
import pygame, sys
from pygame.locals import *
from math import pi
# 初始化pygame
pygame.init()
# 設(shè)置窗口的大小,單位為像素
screen = pygame.display.set_mode((400,300))
# 設(shè)置窗口標(biāo)題
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)
# 設(shè)置背景顏色
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)
# 繪制一個(gè)空心矩形
pygame.draw.rect(screen, BLACK, [75, 10, 50, 20], 2)
# 繪制一個(gè)矩形
pygame.draw.rect(screen, BLACK, [150, 10, 50, 20])
# 繪制一個(gè)空心橢圓
pygame.draw.ellipse(screen, RED, [225, 10, 50, 20], 2)
# 繪制一個(gè)橢圓
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)
# 繪制一個(gè)圓
pygame.draw.circle(screen, BLUE, [60, 250], 40)
# 程序主循環(huán)
while True:
# 獲取事件
for event in pygame.event.get():
# 判斷事件是否為退出事件
if event.type == QUIT:
# 退出pygame
pygame.quit()
# 退出系統(tǒng)
sys.exit()
# 繪制屏幕內(nèi)容
pygame.display.update()
效果圖如下:
3.3 實(shí)現(xiàn)動(dòng)畫
由于人類眼睛的特殊生理結(jié)構(gòu),當(dāng)所看畫面的幀率高于24的時(shí)候,就會(huì)認(rèn)為是連貫的,此現(xiàn)象稱之為 視覺暫留 。
幀率(Frame rate)是用于測(cè)量顯示幀數(shù)的量度,所謂的測(cè)量單位為每秒顯示幀數(shù)(Frames per Second,簡(jiǎn)稱:FPS)
一般來(lái)說(shuō)30fps是可以接受的,但是將性能提升至60fps則可以明顯提升交互感和逼真感,但是一般來(lái)說(shuō)超過(guò)75fps一般就不容易察覺到有明顯的流暢度提升了。
在我們?cè)凶鴺?biāo)系的基礎(chǔ)上添加偏移量,再重新繪制,依次一張一張的循環(huán)繪制下去,就會(huì)得到我們想要的物體移動(dòng)的效果。
Pygame實(shí)現(xiàn)動(dòng)畫主要用到的方法:
pygame.image.load(filename)加載一張圖片
pygame.Surface.blit(source, dest, area=None, special_flags = 0)將圖片繪制到屏幕相應(yīng)坐標(biāo)上(后面兩個(gè)參數(shù)默認(rèn),可以不傳)
pygame.time.Clock()獲得pygame的時(shí)鐘
pygame.time.Clock.tick(FPS)設(shè)置pygame時(shí)鐘的間隔時(shí)間
以下為示例代碼:
# -*- coding: UTF-8 -*-
# animation.py
# 導(dǎo)入需要的模塊
import pygame, sys
from pygame.locals import *
# 初始化pygame
pygame.init()
# 設(shè)置幀率(屏幕每秒刷新的次數(shù))
FPS = 30
# 獲得pygame的時(shí)鐘
fpsClock = pygame.time.Clock()
# 設(shè)置窗口大小
screen = pygame.display.set_mode((500, 400), 0, 32)
# 設(shè)置標(biāo)題
pygame.display.set_caption('Animation')
# 定義顏色
WHITE = (255, 255, 255)
# 加載一張圖片(所用到的的圖片請(qǐng)參考1.5代碼獲?。?
img = pygame.image.load('resources/shiyanlou.PNG')
# 初始化圖片的位置
imgx = 10
imgy = 10
# 初始化圖片的移動(dòng)方向
direction = 'right'
# 程序主循環(huán)
while True:
# 每次都要重新繪制背景白色
screen.fill(WHITE)
# 判斷移動(dòng)的方向,并對(duì)相應(yīng)的坐標(biāo)做加減
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'
# 該方法將用于圖片繪制到相應(yīng)的坐標(biāo)中
screen.blit(img, (imgx, imgy))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
# 刷新屏幕
pygame.display.update()
# 設(shè)置pygame時(shí)鐘的間隔時(shí)間
fpsClock.tick(FPS)
效果圖如下:
3.4 繪制文字
如果你想繪制文字到屏幕上,Pygame提供了很方便的方法使用.ttf字體文件,這樣我們就能很輕易的將文字繪制在屏幕上了。
這里我使用了ARBERKLEY.ttf作為字體,字體文件的獲取請(qǐng)參考1.5代碼獲取。
主要用到的方法:
pygame.font.Font(filename, size)
filename:字體文件的文件名;
size:字體的高h(yuǎn)eight,單位為像素;
pygame.font.Font.render(text, antialias, color, background=None)
text:要顯示的文字;
antialias: 是否抗鋸齒;
color:字體顏色;
background:背景顏色(可選參數(shù));
.get_rect()
獲得一個(gè)對(duì)象的rect,以便于設(shè)置其坐標(biāo)位置
以下為示例代碼:
# -*- coding: UTF-8 -*-
# font.py
# 導(dǎo)入需要的模塊
import pygame, sys
from pygame.locals import *
# 初始化pygame
pygame.init()
# 設(shè)置窗口的大小,單位為像素
screen = pygame.display.set_mode((500,400))
# 設(shè)置窗口的標(biāo)題
pygame.display.set_caption('Font')
# 定義顏色
WHITE = (255, 255, 255)
GREEN = ( 0, 255, 0)
BLUE = ( 0, 0, 128)
# 通過(guò)字體文件獲得字體對(duì)象
fontObj = pygame.font.Font('resources/ARBERKLEY.ttf', 50)
# 配置要顯示的文字
textSurfaceObj = fontObj.render('Pygame', True, BLUE, GREEN)
# 獲得要顯示的對(duì)象的rect
textRectObj = textSurfaceObj.get_rect()
# 設(shè)置顯示對(duì)象的坐標(biāo)
textRectObj.center = (250, 200)
# 設(shè)置背景
screen.fill(WHITE)
# 繪制字體
screen.blit(textSurfaceObj, textRectObj)
# 程序主循環(huán)
while True:
# 獲取事件
for event in pygame.event.get():
# 判斷事件是否為退出事件
if event.type == QUIT:
# 退出pygame
pygame.quit()
# 退出系統(tǒng)
sys.exit()
# 繪制屏幕內(nèi)容
pygame.display.update()
效果圖如下:
3.5 播放音頻
在Pygame里播放音頻有兩個(gè)方法,一個(gè)用來(lái)播放特效聲音,一個(gè)用來(lái)播放背景音樂(lè):
pygame.mixer.Sound(filename)
該方法返回一個(gè)Sound對(duì)象,調(diào)用它的.play( )方法,即可播放較短的音頻文件(比如玩家受到傷害、收集到金幣等);
pygame.mixer.music.load(filename)
該方法用來(lái)加載背景音樂(lè),之后調(diào)用pygame.mixer.music.play( )方法就可以播放背景音樂(lè)(Pygame只允許加載一個(gè)背景音樂(lè)在同一個(gè)時(shí)刻)
以下為示例代碼:
# -*- coding: UTF-8 -*-
# audio.py
# 導(dǎo)入需要的模塊
import pygame, sys
from pygame.locals import *
# 初始化pygame
pygame.init()
# 設(shè)置窗口的大小,單位為像素
screen = pygame.display.set_mode((500,400))
# 設(shè)置窗口的標(biāo)題
pygame.display.set_caption('Audio')
# 定義顏色
WHITE = (255, 255, 255)
# 設(shè)置背景
screen.fill(WHITE)
# 加載并播放一個(gè)特效音頻文件(所用到的音頻文件請(qǐng)參考1.5代碼獲?。?
sound = pygame.mixer.Sound('resources/bounce.ogg')
sound.play()
# 加載背景音樂(lè)文件
pygame.mixer.music.load('resources/bgmusic.mp3')
# 播放背景音樂(lè),第一個(gè)參數(shù)為播放的次數(shù)(-1表示無(wú)限循環(huán)),第二個(gè)參數(shù)是設(shè)置播放的起點(diǎn)(單位為秒)
pygame.mixer.music.play(-1, 0.0)
# 程序主循環(huán)
while True:
# 獲取事件
for event in pygame.event.get():
# 判斷事件是否為退出事件
if event.type == QUIT:
# 停止播放背景音樂(lè)
pygame.mixer.music.stop()
# 退出pygame
pygame.quit()
# 退出系統(tǒng)
sys.exit()
# 繪制屏幕內(nèi)容
pygame.display.update()
注意:因?qū)嶒?yàn)樓里暫時(shí)不能播放音頻,上述代碼在實(shí)驗(yàn)樓環(huán)境中可能無(wú)法正常運(yùn)行,同學(xué)們可以在自己的電腦上嘗試運(yùn)行。
3.6 事件
Pygame里常用的事件如下表:
| 事件 | 產(chǎn)生途徑 | 參數(shù) |
|---|---|---|
| QUIT | 用戶按下關(guān)閉按鈕 | none |
| ACTIVEEVENT | Pygame被激活或者隱藏 | gain, state |
| KEYDOWN | 鍵盤被按下 | unicode, key, mod |
| KEYUP | 鍵盤被放開 | key, mod |
| MOUSEMOTION | 鼠標(biāo)移動(dòng) | pos, rel, buttons |
| MOUSEBUTTONDOWN | 鼠標(biāo)按下 | pos, button |
| MOUSEBUTTONUP | 鼠標(biāo)放開 | pos, button |
| VIDEORESIZE | Pygame窗口縮放 | size, w, h |
以下為示例代碼:
# -*- coding: UTF-8 -*-
# event.py
# 導(dǎo)入需要的模塊
import pygame, sys
from pygame.locals import *
# 定義顏色
WHITE = (255, 255, 255)
# 初始化pygame
pygame.init()
# 設(shè)置窗口的大小,單位為像素
screen = pygame.display.set_mode((500,400), 0, 32)
# 設(shè)置窗口的標(biāo)題
pygame.display.set_caption('Event')
# 設(shè)置背景
screen.fill(WHITE)
# 程序主循環(huán)
while True:
# 獲取事件
for event in pygame.event.get():
# 判斷事件是否為退出事件
if event.type == QUIT:
# 退出pygame
pygame.quit()
# 退出系統(tǒng)
sys.exit()
# 獲得鼠標(biāo)當(dāng)前的位置
if event.type ==MOUSEMOTION:
print(event.pos)
# 獲得鼠標(biāo)按下的位置
if event.type ==MOUSEBUTTONDOWN:
print("鼠標(biāo)按下:",event.pos)
# 獲得鼠標(biāo)抬起的位置
if event.type ==MOUSEBUTTONUP:
print("鼠標(biāo)抬起:",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()
# 退出系統(tǒng)
sys.exit()
# 繪制屏幕內(nèi)容
pygame.display.update()
效果圖如下:
四、實(shí)驗(yàn)總結(jié)
本節(jié)課程我們主要講解了Pygame的一些常用對(duì)象及操作,這些都是我們后續(xù)課程需要用到的知識(shí)點(diǎn),希望同學(xué)們能熟練掌握這些內(nèi)容。若想要深入了解,可參考下方Pygame官方文檔的鏈接。
五、參考鏈接
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
腳本測(cè)試postman快速導(dǎo)出python接口測(cè)試過(guò)程示例
這篇文章主要介紹了關(guān)于腳本測(cè)試postman快速導(dǎo)出python接口測(cè)試示例的過(guò)程操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09
Python實(shí)現(xiàn)語(yǔ)音識(shí)別Whisper的使用示例
Whisper是由OpenAI基于Python開發(fā)的能夠識(shí)別多國(guó)語(yǔ)言的語(yǔ)音識(shí)別模型,本文主要介紹了Python實(shí)現(xiàn)語(yǔ)音識(shí)別Whisper的使用示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
Python單元測(cè)試框架unittest使用方法講解
這篇文章主要介紹了Python單元測(cè)試框架unittest使用方法講解,本文講解了unittest概述、命令行接口、測(cè)試案例自動(dòng)搜索、創(chuàng)建測(cè)試代碼、構(gòu)建測(cè)試套件方法等內(nèi)容,需要的朋友可以參考下2015-04-04
Python實(shí)現(xiàn)批量修改文件名實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)批量修改文件名的方法,實(shí)例分析了兩種實(shí)現(xiàn)批量修改文件名的技巧,涉及os.rename重命名方法、正則替換及字符串操作的相關(guān)技巧,需要的朋友可以參考下2015-07-07
Python3 XML 獲取雅虎天氣的實(shí)現(xiàn)方法
下面小編就為大家分享一篇Python3 XML 獲取雅虎天氣的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02

