一開始上來就寫一些對函數(shù)的理解噪奄,終究是對初學(xué)者的不友好硬毕,考慮到更多學(xué)習(xí)pygame這個(gè)模塊的人大多是從事編程教育或是初學(xué)者臭觉,覺得有一篇文風(fēng)和善柱查,細(xì)細(xì)道來的安裝文檔總歸是相宜的知残。
并且pygame這個(gè)模塊近些年的更新靠瞎,還是有很多的不適配或是各種各樣的問題,在學(xué)生和外地的同事中總有這樣那樣的反饋求妹。在這里保留一篇安裝文檔乏盐,能讓他們更快地解決這些在安裝和使用過程中的問題。
我之前有寫過一篇《pygame的第一步》制恍,這里我就把它引用過來父能,并且做一個(gè)完善。有點(diǎn)長净神,簡書也暫時(shí)不支持TOC目錄何吝,所以看到不感興趣的快速下拉吧溉委。
pygame框架簡介
對于pygame的介紹,在網(wǎng)上真的基本上千篇一律爱榕,大多會(huì)感慨感謝一下作者瓣喊,惋惜一下這個(gè)包在09年的時(shí)候就停止更新(但是它神奇地在17年1月份更新了)。真正的它的意義黔酥,很少人提及藻三。下面引用一下《pygame菜鳥入門指南》里的一段介紹:
pygame是一個(gè)由Pete Shinners編寫的SDL的Python封裝。這就意味著絮爷,使用pygame趴酣,你可以寫出可以不作修改就可以在任何支持SDL的平臺(tái)(Windows, Unix, Mac, BeOS,等等)上運(yùn)行的游戲或者多媒體程序坑夯。
簡單的理解一下岖寞,它的底層是使用C編寫的SDL(simple DirectMedia Layer)。提供了多種控制凸顯個(gè)柜蜈、聲音仗谆、輸出入得函數(shù)。讓開發(fā)者是要用相同或者是相似的代碼就可以開發(fā)出跨多個(gè)平臺(tái)(linux淑履、windows隶垮、mac OS X等)的應(yīng)用軟件。目前SDL多用于開發(fā)游戲秘噪,模擬器狸吞,媒體播放器等多媒體應(yīng)用領(lǐng)域……
SDL內(nèi)置調(diào)用了OpenGL的函數(shù)≈讣澹……SDL也有其他語言的包裝蹋偏,SDL用C語言寫成,但是很容易在C++下工作至壤,并且綁定了許多其他的語言……包裝的比較好的是python語言的pygame……
在我省略了好多……之后威始,pygame和SDL和OpenGL的關(guān)系漸漸明朗了起來。雖然沒有對pygame的能力有很詳細(xì)的描述像街,但是也能簡單了解它的主要應(yīng)用場景和主要的功能黎棠。
安裝
超簡單,如果有完整的python開發(fā)環(huán)境镰绎,這個(gè)應(yīng)該不是什么問題脓斩。
pip install pygame
上面的話是我之前剛開始教學(xué)的時(shí)候?qū)懙模髞黼S著接觸的學(xué)生越來越多跟狱,我發(fā)現(xiàn)事實(shí)并不是這樣的俭厚,以下的內(nèi)容就是我的補(bǔ)充。
問題一:Python版本安裝不正確導(dǎo)致pygame異常
這個(gè)異常我碰到過兩次驶臊,都是在Python剛剛更新到3.7的版本的時(shí)候挪挤。很多時(shí)候初學(xué)者去學(xué)習(xí)Python叼丑,都會(huì)挑選最新的版本Python去學(xué)習(xí)。但是pygame作為一個(gè)扛门,相對來說之前比較“懶”更新的庫(最近他們更新的還是很勤快及時(shí)的鸠信,官網(wǎng)和文檔也都做了很好的優(yōu)化和更新),很容易在Python語言更新的初期论寨,跟不上更新進(jìn)度星立,導(dǎo)致安裝的時(shí)候出現(xiàn)問題。
在前段時(shí)間的教學(xué)中葬凳,我一直使用的3.6.x版本的Python绰垂,相對來說比較穩(wěn)定,而且版本也很新火焰。所以我這里推薦暫時(shí)需要穩(wěn)定學(xué)習(xí)pygame的同學(xué)劲装,安裝使用3.6左右版本的Python,然后使用pip命令安裝pygame(自動(dòng)匹配版本昌简,如果要手動(dòng)安裝的話占业,去pygame的官網(wǎng)下載對應(yīng)版本號(hào)的就可以。)纯赎。-
問題二:Python安裝位置的權(quán)限問題影響pygame安裝
之前有很多回家安裝的學(xué)生有和我說過谦疾,安裝的時(shí)候出現(xiàn)紅色的字或者是灰色的字。大部分學(xué)生在安裝Python的時(shí)候犬金,根據(jù)我的要求去打了相關(guān)的√念恍,但是很少有去修改Python的安裝路徑的。所以大部分的這些學(xué)生的Python都被安裝在了C盤晚顷。
報(bào)錯(cuò)截圖.png
如果要在C盤的Python文件夾中安裝一個(gè)新的庫樊诺,多半是需要用到管理員權(quán)限的,如果是使用軟件的過程中需要用到管理員權(quán)限音同,PC系統(tǒng)會(huì)提示你是否授權(quán)。但是在CMD窗口安裝的時(shí)候秃嗜,這個(gè)彈窗不會(huì)彈出來权均,而是直接說明報(bào)錯(cuò),無法獲取這個(gè)寫入權(quán)限锅锨。
這時(shí)候其實(shí)只要用管理員權(quán)限的CMD窗口輸入pip命令就不會(huì)出現(xiàn)這種問題叽赊。
管理員權(quán)限CMD.png
點(diǎn)擊確認(rèn)彈出的權(quán)限窗口,這時(shí)候的CMD窗口左上角應(yīng)該是:
窗口名稱.png
Installing collected packages: pygame
Successfully installed pygame-1.9.4
如果在結(jié)果中沒有報(bào)出紅色報(bào)錯(cuò)信息必搞,而且能夠看到上面的兩句話必指,就說明安裝成功了。
模塊列表
模塊名 | 功能 |
---|---|
pygame.cdrom |
訪問光驅(qū) |
pygame.cursors |
加載光標(biāo) |
pygame.display |
訪問顯示設(shè)備 |
pygame.draw |
繪制形狀恕洲、線和點(diǎn) |
pygame.event |
管理事件 |
pygame.font |
使用字體 |
pygame.image |
加載和存儲(chǔ)圖片 |
pygame.joystick |
使用游戲手柄或者類似的東西 |
pygame.key |
讀取鍵盤按鍵 |
pygame.mixer |
聲音 |
pygame.mouse |
鼠標(biāo) |
pygame.movie |
播放視頻 |
pygame.music |
播放音頻 |
pygame.overlay |
訪問高級視頻疊加 |
pygame.rect |
管理矩形區(qū)域 |
pygame.sndarry |
操作聲音數(shù)據(jù) |
pygame.sprite |
操作移動(dòng)圖像 |
pygame.surface |
管理圖像和屏幕 |
pygame.surfarry |
管理點(diǎn)陣圖像數(shù)據(jù) |
pygame.time |
管理時(shí)間和幀信息 |
pygame.transform |
縮放和移動(dòng)圖像 |
其中一些我覺得比較重要的或者在初級使用階段會(huì)經(jīng)常碰到的一些字段塔橡,我都添加了標(biāo)記梅割,在之后的學(xué)習(xí)中可以重點(diǎn)關(guān)注一下這一塊的源碼。
有些模塊可能在某些平臺(tái)上不存在(有這個(gè)名稱字段葛家,但是為空)户辞,可以用None判斷一下。
In [3]: pygame.font is None
Out[3]: False
詳解一個(gè)簡單的pygame程序
background_image_filename = 'sushiplate.jpg'
mouse_image_filename = 'fugu.png'
#指定圖像文件名稱
import pygame
#導(dǎo)入pygame庫
from pygame.locals import *
#導(dǎo)入一些常用的函數(shù)和常量
from sys import exit
#向sys模塊借一個(gè)exit函數(shù)用來退出程序
pygame.init()
#初始化pygame,為使用硬件做準(zhǔn)備
screen = pygame.display.set_mode((640, 480), 0, 32)
#創(chuàng)建了一個(gè)窗口
pygame.display.set_caption("Hello, World!")
#設(shè)置窗口標(biāo)題
background = pygame.image.load(background_image_filename).convert()
mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()
#加載并轉(zhuǎn)換圖像
while True:
#游戲主循環(huán)
for event in pygame.event.get():
if event.type == QUIT:
#接收到退出事件后退出程序
exit()
#這個(gè)負(fù)責(zé)監(jiān)聽事件的循環(huán)非常重要癞谒,是event模塊在pygame程序中最頻繁的使用
screen.blit(background, (0,0))
#將背景圖畫上去 blit(圖片源,起始點(diǎn))
x, y = pygame.mouse.get_pos()
#獲得鼠標(biāo)位置
x-= mouse_cursor.get_width() / 2
y-= mouse_cursor.get_height() / 2
#計(jì)算光標(biāo)的左上角位置
screen.blit(mouse_cursor, (x, y))
#把光標(biāo)畫上去
pygame.display.update()
#刷新一下畫面
上面的程序其實(shí)注釋已經(jīng)非常詳盡了夏志,我們有幾點(diǎn)需要注意的:
- set_mode():他會(huì)返回一個(gè)surface對象枚荣,代表了在桌面上出現(xiàn)的那個(gè)窗口,從源碼中可以看到:
set_mode(resolution=(0,0), flags=0, depth=0) -> Surface
Initialize a window or screen for display
它需要三個(gè)參數(shù),resolution就是分辨率朗和,flags就是標(biāo)志位,depth是色深
分辨率很好理解暫時(shí)就不多BB了娜睛,flags具體見下表榄攀,如果不需要什么特性,就0
標(biāo)志位 | 功能 |
---|---|
FULLSCREEN | 創(chuàng)建一個(gè)全屏窗口 |
DOUBLEBUF | 創(chuàng)建一個(gè)“雙緩沖”窗口读存,建議在HWSURFACE或者OPENGL時(shí)使用 |
HWSURFACE | 創(chuàng)建一個(gè)硬件加速的窗口为流,必須和FULLSCREEN同時(shí)使用 |
OPENGL | 創(chuàng)建一個(gè)OPENGL渲染的窗口 |
RESIZABLE | 創(chuàng)建一個(gè)可以改變大小的窗口 |
NOFRAME | 創(chuàng)建一個(gè)沒有biang狂的窗口 |
convert
函數(shù)試講圖像數(shù)據(jù)都轉(zhuǎn)化為surface對象,每次加載完圖像以后就應(yīng)該做這件事件(使用頻率很高让簿,如果你不寫敬察,pygame也會(huì)幫你寫);convert_alpha
相比convert
保留了ALPHA通道信息(就簡單理解為透明的部分),這樣就可以獲得PNG圖標(biāo)的效果尔当。
blit
是一個(gè)重要函數(shù)莲祸。第一個(gè)參數(shù)是一個(gè)surface對象,第二個(gè)為左上角位置椭迎,畫完一個(gè)后要記得update
更新一下锐帜,否則會(huì)出現(xiàn)畫面一片漆黑的情況。
blit(source, dest, area=None, special_flags = 0) -> Rect
draw one image onto another