一篇文章帶你了解Python中的游戲開發(fā)模塊pyglet
回復(fù)“書籍”即可獲贈Python從入門到進(jìn)階共10本電子書
前言
為什么我不選擇pygame,原因很簡單,因為pyglet 更簡單,比較輕量級,就好比django和flask的區(qū)別。
相信你在讀了這篇文章之后也會毅然決然的選擇pyglet。
這篇文章主要圍繞pyglet 的安裝、基本用法和實例三部分進(jìn)行展開。
一、安裝
和大多數(shù)模塊安裝方式一樣,pyglet 的安裝方式如下:
pip install pyglet二、基本用法
#導(dǎo)入模塊import pyglet
下面我們來看看這個模塊中具體有哪些方法,那么怎么看呢?我們都知道,要查看系統(tǒng)中所有模塊的話,可以使用
pip list還有一種比較Python的方法:
import sysprint(sys.modules.keys())
恩,但是今天我們要查看的是pyglet的所有方法,所以,dir了解下,用這個內(nèi)置函數(shù):
print(dir(pyglet))
我們先不看那些帶下劃線的方法,因為那些方法都是大佬在研究的方向,我們先看比較平民化的方法,比如說第一個app,image,clock,media,os,sys,text,version,window,input,lib,font,event,是不是一看就能知道它是干啥的?什么,你不知道?那只能說明你英語太差了。比如說我想獲取它的版本號,那么version肯定是首選了,下面來試試:

結(jié)果和我們料想的一樣,真的是太有才了。既然我們是要用這個來編寫游戲,那么肯定少不了窗口了。
既然談到窗口,那咱們第一印象肯定是window啦,因為它就有窗口的意思。

我們可以看到它并未顯示窗口,說明少了點東西,查看官方文檔可知,而且它的參數(shù)貌似還不少:

這是我從它的源代碼文檔中所得的。可以看出都是平常我們見得比較多的英文。這些參數(shù)的說明如下:
width:寬度height:高度caption:標(biāo)題resizable:是否可以調(diào)整大小style:風(fēng)格fullscreen:是否全屏visible:是否可見vsync:暫不清楚file_drops:文件刪除display:指定的設(shè)備screen:屏幕config:配置context:上下文處理器mode:模式
雖然參數(shù)很多,但是并不是每個都能用到。下面我們就簡單創(chuàng)建個窗口吧。
pyglet.window.Window(600, 600) #創(chuàng)建一個600*600的窗口pyglet.app.run() #啟動 ,有點像flask的啟動方式

這樣就成功啟動了一個窗口。
其實窗口里面還有很多方法,有在用自動提示功能IDE的老鐵應(yīng)該不陌生:
win.get_location()win.set_location(x,y)win.get_size()win.widthwin.height
想必大家應(yīng)該比較熟悉了。
但是這也遠(yuǎn)遠(yuǎn)不夠啊,我們還得給它點修飾,比如說加點文字圖片什么的。
1、加文字
為了顯示文本,我們得使用text方法,text方法又有很多子方法,因為要添加文本所以先要有一個標(biāo)簽,所以我們先要加個label方法,下面看看label有哪些方法:

可以看出,的確又是一大堆,下面請看參數(shù)說明:
text:文本font_name:字體名font_size:字體大小bold:是否加粗italic:是否傾斜color:字體顏色x:文本左下角x坐標(biāo)y:文本左下角y坐標(biāo)width:文本寬度height:文本高度anchor_x:x坐標(biāo)錨點,可以分為:left center rightanchor_y:y坐標(biāo)錨點,可以分為:bottom baseline center topalign:水平方向位置multiline:是否換行,如果是,需指定寬度dpi:鼠標(biāo)每移動一英寸指針在屏幕上移動的點數(shù)batch:批量處理group:組
接下來我們需要創(chuàng)建一個label:
label = pyglet.text.Label('fuck you',font_size=40,x=win.width//2, y=win.height//2, #窗口寬高的一半anchor_x='center', anchor_y='center') #中間位置
然后繪制文本:
label.draw()但是這樣并不能將文字加入到窗口中,因為之前的窗口沒有清除,窗口重繪其實就是一個清除在添加在清除的過程,因為窗口創(chuàng)建時啟用了一個on_draw方法,所以這時我們需要重寫on_draw方法。
@win.event #裝飾器def on_draw():#重寫on_draw方法win.clear() #窗口清除label.draw() #重繪窗口
這樣窗口就達(dá)到最新的效果,就有了文字,然后在啟動:
pyglet.app.run()
2、添加圖片
關(guān)于圖片的話,想必里面的image大家應(yīng)該比較熟悉。
那么我們先將圖片讀取出來,然后進(jìn)行重繪
import pygletwin=pyglet.window.Window(600, 600)image=pyglet.image.load('2.jpg') #讀取圖片def on_draw(): #重寫方法win.clear() #窗口清除image.blit(0, 0) #重繪窗口,從左下角的(0,0)處開始繪制pyglet.app.run() #啟動
這里要說到的一個非常重要的參數(shù)便是blit了,它和顯示文字的draw一樣,要想圖片顯示在屏幕上還得靠它。
當(dāng)然,官方文檔顯示還有一種方法:
import pygletwin = pyglet.window.Window()image = pyglet.resource.image('2.jpg') #讀取資源文件def on_draw():win.clear()image.blit(0, 0)pyglet.app.run()
這樣也可以,兩種方法任選一種,你喜歡就好。
對于加載不同文件夾下的圖片,有什么好的策略了:
pyglet.resource.path = ['./images'] #先導(dǎo)入圖片路徑但是路徑必須和程序在同一個目錄pyglet.resource.reindex() #建立索引image = pyglet.resource.image("1.jpg") #加載圖片image.get_region(x, y, width, height) #得到新圖片
也可以使用image.load()
from pyglet import imagepicture = image.load('picture.png') #讀取圖片#你可以截圖這張圖片,生成張新的圖片。picture.get_region(x, y, width, height)
目前我們僅僅只接觸到了on_draw 這一個事件,那么pyglet還有哪些有趣的鍵盤和鼠標(biāo)處理事件呢?我們一起看下吧。
3、鍵盤事件
用法:
def on_key_press(symbol, modifiers): #鍵盤按下passdef on_key_release(symbol, modifiers):#鍵盤釋放pass
1) 常用symbol
按鍵符號:
key.A #字母key._1 #數(shù)字#控制鍵key.ENTER or key.RETURNkey.SPACEkey.BACKSPACEkey.DELETEkey.MINUSkey.EQUALkey.BACKSLASH#小鍵盤key.NUM_1key.NUM_2key.NUM_EQUALkey.NUM_DIVIDEkey.NUM_MULTIPLYkey.NUM_SUBTRACTkey.NUM_ADDkey.NUM_DECIMALkey.NUM_ENTER#左右修飾鍵key.LCTRLkey.RCTRLkey.LSHIFTkey.RSHIFT
判斷按下哪個鍵:
import pygletfrom pyglet.window import keywin=pyglet.window.Window(500,400)def on_key_press(symbol, modifiers):if symbol == key.W:print('前進(jìn)')elif symbol == key.S:print('后退')elif symbol == key.A:print('左移')elif symbol == key.D:print('右移')if modifiers & key.MOD_CTRL:print('over')pyglet.app.run()
可以看到結(jié)果如我們所料:

這樣大家是不是就有種想寫游戲的沖動了了。
當(dāng)然,pyglet還能將當(dāng)前鍵盤狀態(tài)進(jìn)行存儲以便隨時調(diào)用,可用KeyStateHandler()實現(xiàn)。
import pygletfrom pyglet.window import keywin=pyglet.window.Window(500,400)kd = key.KeyStateHandler() #初始化win.push_handlers(kd) #將鍵狀態(tài)裝進(jìn)窗口記錄 有裝當(dāng)然就有扔:popif kd[key.SPACE]:print('按下了空格鍵')
4、鼠標(biāo)事件
def on_mouse_motion(x,y,dx,dy):#鼠標(biāo)移動passdef on_mouse_press(x, y, button, modifiers): #鼠標(biāo)按住passdef on_mouse_release(x, y, button, modifiers):#鼠標(biāo)釋放passdef on_mouse_drag(x, y, dx, dy, buttons, modifiers):#鼠標(biāo)拖動passdef on_mouse_enter(x, y): #鼠標(biāo)進(jìn)入窗口passdef on_mouse_leave(x, y): #鼠標(biāo)離開窗口passdef on_mouse_scroll(x, y, scroll_x, scroll_y):#鼠標(biāo)滾輪pass
我們可以實現(xiàn)下它的部分有趣功能:
import pygletwin=pyglet.window.Window(500,400)def on_mouse_motion(x,y,dx,dy):#鼠標(biāo)移動print('移動')def on_mouse_press(x, y, button, modifiers): #鼠標(biāo)按住print('按下鼠標(biāo)')def on_mouse_release(x, y, button, modifiers):#鼠標(biāo)釋放print('松開鼠標(biāo)')def on_mouse_drag(x, y, dx, dy, buttons, modifiers):#鼠標(biāo)拖動print('拖動鼠標(biāo)')def on_mouse_enter(x, y): #鼠標(biāo)進(jìn)入窗口print('進(jìn)入窗口')def on_mouse_leave(x, y): #鼠標(biāo)離開窗口print('離開窗口')def on_mouse_scroll(x, y, scroll_x, scroll_y):#鼠標(biāo)滾輪print('鼠標(biāo)滾輪')pyglet.app.run()

可以看到,我們成功捕獲到鼠標(biāo)的運行軌跡。
鼠標(biāo)常數(shù):
這個可以用來判斷到底是哪邊的鼠標(biāo)按鍵被觸發(fā)了。
pyglet.window.mouse.LEFT #左邊pyglet.window.mouse.MIDDLE #中間滾輪pyglet.window.mouse.RIGHT #右邊
改變鼠標(biāo)光標(biāo):
win.set_mouse_visible(visible=True) #顯示 False隱藏cursor = win.get_system_mouse_cursor(win.CURSOR_HELP) #獲取操作系統(tǒng)定義的游標(biāo)win.set_mouse_cursor(cursor) #設(shè)置鼠標(biāo)外觀

也可以使用自定義圖像作為光標(biāo):
image = pyglet.image.load('2.jpg') #讀取圖片cursor = pyglet.window.ImageMouseCursor(image, 16, 8) #將圖片添加到鼠標(biāo)游標(biāo)上win.set_mouse_cursor(cursor) #設(shè)置鼠標(biāo)游標(biāo)win.set_mouse_visible(visible=True) #設(shè)置可見
激活鼠標(biāo)獨占模式:
win.set_exclusive_mouse(True)#射擊游戲常三、輸入文本事件
用于游戲時輸入某些命令可以更改某些參數(shù),值,達(dá)到一定的效果。
import pygletwin=pyglet.window.Window(500,400)def on_text(text): #輸入文本事件if text=='i love you':print('i love you too')
四、window下的事件
1.重設(shè)大小
用法:on_resize(width,height)
win=pyglet.window.Window(500,400)@window.eventdef on_resize(width,height):width=100height=200pyglet.app.run()
我們都知道,如果每個都去這樣設(shè)置,費時費力,而且也不簡潔,我們可以用一個類封裝:
import pygletfrom pyglet.window import keywin=pyglet.window.Window(500,400)class win(pyglet.window.Window): #繼承Window類def on_resize(self,width,height): #重寫方法self.width=200 #重設(shè)寬度self.height=100 #重設(shè)高度def on_text(self,text): #文本事件aa=input('shuru:')if aa=='I love you':print('i love you too')def on_key_press(self,symbol, modifiers): #監(jiān)聽鍵盤事件if symbol == key.W:print('前進(jìn)')self.width=self.width+100elif symbol == key.S:print('后退')self.width=self.width+200elif symbol == key.A:print('左移')self.width=self.width-200elif symbol == key.D:print('右移')self.width=self.width-100if modifiers & key.MOD_CTRL:print('over')self.width=self.width+300win()pyglet.app.run()
有點卡頓,不過問題不大,最重要的是我們把它實現(xiàn)了。

五、音樂播放
pyglet不光可以制作游戲,它還可以播放音樂,那么它是怎么實現(xiàn)的呢?
1.使用media.load播放音頻
import pygletwin=pyglet.window.Window()sound = pyglet.media.load('11.wav', streaming=False) #加載音樂,注意只能播放wav格式音頻sound.play() #播放pyglet.app.run()
2.使用resource.media播放音頻
import pygletwin=pyglet.window.Window()sound = pyglet.resource.media('11.wav', streaming=False) #加載音樂,注意只能播放wav格式音頻sound.play() #播放pyglet.app.run()
兩種方法均可,其實在大部分加載操作中,都可以用到這兩種方法,比如說media /image/text都可以。
如果我們需要控制播放,則需引入另一個方法:Player(),注意第一個是大寫。
play = pyglet.media.Player()然后我們將播放音頻添加到一個隊列中去:
play.queue(sound) 最后播放:
play.play() 通過上面的講述我們現(xiàn)在就可以添加多首音樂到我們的隊列中了。下面請看:
import pygletwin=pyglet.window.Window()sound = pyglet.resource.media('11.wav', streaming=False)sound1=pyglet.media.load('2.wav', streaming=False)play = pyglet.media.Player()play.queue(sound) #隊列一play.queue(sound1)#隊列二play.play()#播放win.close() #隱藏黑窗口,可以惡搞別人pyglet.app.run()
有時候我們想讓這些音頻循環(huán)播放那又該怎么辦呢?其實,只需加一個循環(huán)即可。
import pygletwin=pyglet.window.Window()sound = pyglet.resource.media('11.wav', streaming=False)sound1=pyglet.media.load('2.wav', streaming=False)play = pyglet.media.Player()def xh():while 1: #條件為真的循環(huán)yield sound #不斷的迭代yield sound1play.queue(xh()) #添加到隊列play.play() #播放pyglet.app.run() #啟動
六、視頻播放
無所不能的pyglet,游戲 音頻視頻全能啊,哈哈哈。
播放視頻的方法跟音頻比較相似,但也有很多不同的地方。同樣也是兩種方法:
1.使用media.load播放視頻
import pygletwin=pyglet.window.Window()video = pyglet.media.load('12.mp4') #加載視頻,注意沒有streaming參數(shù)play=pyglet.media.Player() #創(chuàng)建播放器對象play.queue(video) #添加任務(wù)隊列play.play() #播放@win.eventdef on_draw():win.clear()play.get_texture().blit(30,60) #設(shè)置視頻在黑窗口中的位置,也可使用play.texture.blit(30,60)pyglet.app.run()
2.使用resource.media播放視頻
import pygletwin=pyglet.window.Window()video = pyglet.resource.media('12.mp4') #加載視頻,注意沒有streaming參數(shù)play=pyglet.media.Player() #創(chuàng)建播放器對象play.queue(video) #添加任務(wù)隊列play.play() #播放@win.eventdef on_draw():win.clear()play.get_texture().blit(30,60) #設(shè)置視頻在黑窗口中的位置pyglet.app.run()
總結(jié)
pyglet 還有很多好玩的例子,比如canvas畫圖,不過相比較我說的幾點,還是會顯得比較無趣些,希望以上的內(nèi)容能幫助你快速開發(fā)一個實用型應(yīng)用程序。
------------------- End -------------------
往期精彩文章推薦:
手把手教你用Scrapy爬蟲框架爬取食品論壇數(shù)據(jù)并存入數(shù)據(jù)庫
盤點一款Python發(fā)包收包利器——scapy
盤點一款手機Python編程神器——AidLearning

歡迎大家點贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請在后臺回復(fù)【入群】
萬水千山總是情,點個【在看】行不行
/今日留言主題/
隨便說一兩句吧~~
