python Pygame的具體使用講解
一、實驗介紹
1.1 實驗內(nèi)容
在本節(jié)課中,我們將講解Pygame的常用對象及其操作,包括圖形、動畫、文字、音頻等,確保同學們對Pygame有一個基礎(chǔ)的了解,同時為后續(xù)課程做好準備。
1.2 實驗知識點
- Pygame圖形
- Pygame動畫
- Pygame文字
- Pygame音頻
- Pygame事件
1.3 實驗環(huán)境
- Python 2.7.6
- Xfce終端
1.4 適合人群
本課程難度為一般,屬于初級級別課程,適合具有Python基礎(chǔ)的用戶,熟悉Python基礎(chǔ)知識加深鞏固。
1.5 代碼獲取
本節(jié)實驗所用到的代碼和相關(guān)資源文件可以通過下面命令下載到實驗樓環(huán)境中,作為參照對比進行學習。
$ wget http://labfile.oss.aliyuncs.com/courses/940/foundation.zip
解壓縮至 /home/shiyanlou/foundation :
$ unzip foundation.zip
二、開發(fā)準備
本次課程主要利用Pygame模塊來進行開發(fā),首先我們需要打開Xfce終端,并使用 pip 命令來安裝Pygame
$ sudo pip install pygame
安裝完成之后進入Python的交互界面,輸入以下命令查看是否成功安裝。
import pygame
若無異常,則說明安裝成功。
三、實驗步驟
3.1 HelloWorld
首先開始我們第一個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è)置窗口標題 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()
效果圖如下:
這里解釋一下上面程序的運行方式
一個游戲循環(huán)(也可以稱為主循環(huán))就做下面這三件事:
- 處理事件
- 更新游戲狀態(tài)
- 繪制游戲狀態(tài)到屏幕上
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 # 導(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è)置窗口標題 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) # 繪制一個空心矩形 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) # 程序主循環(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 實現(xiàn)動畫
由于人類眼睛的特殊生理結(jié)構(gòu),當所看畫面的幀率高于24的時候,就會認為是連貫的,此現(xiàn)象稱之為 視覺暫留 。
幀率(Frame rate)是用于測量顯示幀數(shù)的量度,所謂的測量單位為每秒顯示幀數(shù)(Frames per Second,簡稱:FPS)
一般來說30fps是可以接受的,但是將性能提升至60fps則可以明顯提升交互感和逼真感,但是一般來說超過75fps一般就不容易察覺到有明顯的流暢度提升了。
在我們原有坐標系的基礎(chǔ)上添加偏移量,再重新繪制,依次一張一張的循環(huán)繪制下去,就會得到我們想要的物體移動的效果。
Pygame實現(xiàn)動畫主要用到的方法:
pygame.image.load(filename)加載一張圖片
pygame.Surface.blit(source, dest, area=None, special_flags = 0)將圖片繪制到屏幕相應(yīng)坐標上(后面兩個參數(shù)默認,可以不傳)
pygame.time.Clock()獲得pygame的時鐘
pygame.time.Clock.tick(FPS)設(shè)置pygame時鐘的間隔時間
以下為示例代碼:
# -*- coding: UTF-8 -*- # animation.py # 導(dǎo)入需要的模塊 import pygame, sys from pygame.locals import * # 初始化pygame pygame.init() # 設(shè)置幀率(屏幕每秒刷新的次數(shù)) FPS = 30 # 獲得pygame的時鐘 fpsClock = pygame.time.Clock() # 設(shè)置窗口大小 screen = pygame.display.set_mode((500, 400), 0, 32) # 設(shè)置標題 pygame.display.set_caption('Animation') # 定義顏色 WHITE = (255, 255, 255) # 加載一張圖片(所用到的的圖片請參考1.5代碼獲?。? img = pygame.image.load('resources/shiyanlou.PNG') # 初始化圖片的位置 imgx = 10 imgy = 10 # 初始化圖片的移動方向 direction = 'right' # 程序主循環(huán) while True: # 每次都要重新繪制背景白色 screen.fill(WHITE) # 判斷移動的方向,并對相應(yīng)的坐標做加減 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)的坐標中 screen.blit(img, (imgx, imgy)) for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() # 刷新屏幕 pygame.display.update() # 設(shè)置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:背景顏色(可選參數(shù));
.get_rect()
獲得一個對象的rect,以便于設(shè)置其坐標位置
以下為示例代碼:
# -*- 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è)置窗口的標題 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) # 獲得要顯示的對象的rect textRectObj = textSurfaceObj.get_rect() # 設(shè)置顯示對象的坐標 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里播放音頻有兩個方法,一個用來播放特效聲音,一個用來播放背景音樂:
pygame.mixer.Sound(filename)
該方法返回一個Sound對象,調(diào)用它的.play( )方法,即可播放較短的音頻文件(比如玩家受到傷害、收集到金幣等);
pygame.mixer.music.load(filename)
該方法用來加載背景音樂,之后調(diào)用pygame.mixer.music.play( )方法就可以播放背景音樂(Pygame只允許加載一個背景音樂在同一個時刻)
以下為示例代碼:
# -*- 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è)置窗口的標題 pygame.display.set_caption('Audio') # 定義顏色 WHITE = (255, 255, 255) # 設(shè)置背景 screen.fill(WHITE) # 加載并播放一個特效音頻文件(所用到的音頻文件請參考1.5代碼獲?。? sound = pygame.mixer.Sound('resources/bounce.ogg') sound.play() # 加載背景音樂文件 pygame.mixer.music.load('resources/bgmusic.mp3') # 播放背景音樂,第一個參數(shù)為播放的次數(shù)(-1表示無限循環(huán)),第二個參數(shù)是設(shè)置播放的起點(單位為秒) pygame.mixer.music.play(-1, 0.0) # 程序主循環(huán) while True: # 獲取事件 for event in pygame.event.get(): # 判斷事件是否為退出事件 if event.type == QUIT: # 停止播放背景音樂 pygame.mixer.music.stop() # 退出pygame pygame.quit() # 退出系統(tǒng) sys.exit() # 繪制屏幕內(nèi)容 pygame.display.update()
注意:因?qū)嶒灅抢飼簳r不能播放音頻,上述代碼在實驗樓環(huán)境中可能無法正常運行,同學們可以在自己的電腦上嘗試運行。
3.6 事件
Pygame里常用的事件如下表:
事件 | 產(chǎn)生途徑 | 參數(shù) |
---|---|---|
QUIT | 用戶按下關(guān)閉按鈕 | 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 # 導(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è)置窗口的標題 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() # 獲得鼠標當前的位置 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() # 退出系統(tǒng) sys.exit() # 繪制屏幕內(nèi)容 pygame.display.update()
效果圖如下:
四、實驗總結(jié)
本節(jié)課程我們主要講解了Pygame的一些常用對象及操作,這些都是我們后續(xù)課程需要用到的知識點,希望同學們能熟練掌握這些內(nèi)容。若想要深入了解,可參考下方Pygame官方文檔的鏈接。
五、參考鏈接
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python3的高階函數(shù)map,reduce,filter的示例詳解
這篇文章主要介紹了Python3的高階函數(shù)map,reduce,filter的示例代碼,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07python中的循環(huán)結(jié)構(gòu)問題
這篇文章主要介紹了python中的循環(huán)結(jié)構(gòu)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03Python字典的基本用法實例分析【創(chuàng)建、增加、獲取、修改、刪除】
這篇文章主要介紹了Python字典的基本用法,結(jié)合具體實例形式分析了Python字典的創(chuàng)建、增加、獲取、修改、刪除等基本操作技巧與注意事項,需要的朋友可以參考下2019-03-03基于python編寫監(jiān)控系統(tǒng)各項資源的腳本
這篇文章主要為大家詳細介紹了如何編寫一個python腳本,實現(xiàn)監(jiān)控網(wǎng)絡(luò)的流量、CPU使用率、內(nèi)存使用率和磁盤使用情況,感興趣的小伙伴可以了解下2023-11-11