自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一篇文章帶你了解Python中的游戲開發(fā)模塊pyglet

開發(fā) 后端 游戲開發(fā)
pyglet 還有很多好玩的例子,比如canvas畫圖,不過相比較我說的幾點(diǎn),還是會(huì)顯得比較無趣些,希望以上的內(nèi)容能幫助你快速開發(fā)一個(gè)實(shí)用型應(yīng)用程序。

[[397310]]

前言

為什么我不選擇pygame,原因很簡單,因?yàn)閜yglet 更簡單,比較輕量級,就好比django和flask的區(qū)別。

相信你在讀了這篇文章之后也會(huì)毅然決然的選擇pyglet。

這篇文章主要圍繞pyglet 的安裝、基本用法和實(shí)例三部分進(jìn)行展開。

一、安裝

和大多數(shù)模塊安裝方式一樣,pyglet 的安裝方式如下:

  1. pip install pyglet 

二、基本用法

  1. #導(dǎo)入模塊 
  2. import pyglet 

下面我們來看看這個(gè)模塊中具體有哪些方法,那么怎么看呢?我們都知道,要查看系統(tǒng)中所有模塊的話,可以使用

  1. pip list 

還有一種比較Python的方法:

  1. import sys 
  2. print(sys.modules.keys()) 

恩,但是今天我們要查看的是pyglet的所有方法,所以,dir了解下,用這個(gè)內(nèi)置函數(shù):

  1. print(dir(pyglet)) 

 

我們先不看那些帶下劃線的方法,因?yàn)槟切┓椒ǘ际谴罄性谘芯康姆较颍覀兿瓤幢容^平民化的方法,比如說第一個(gè)app,image,clock,media,os,sys,text,version,window,input,lib,font,event,是不是一看就能知道它是干啥的?什么,你不知道?那只能說明你英語太差了。比如說我想獲取它的版本號,那么version肯定是首選了,下面來試試:

結(jié)果和我們料想的一樣,真的是太有才了。既然我們是要用這個(gè)來編寫游戲,那么肯定少不了窗口了。

既然談到窗口,那咱們第一印象肯定是window啦,因?yàn)樗陀写翱诘囊馑肌?/p>

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

這是我從它的源代碼文檔中所得的??梢钥闯龆际瞧匠N覀円姷帽容^多的英文。這些參數(shù)的說明如下:

  1. width:寬度 
  2. height:高度 
  3. caption:標(biāo)題 
  4. resizable:是否可以調(diào)整大小 
  5. style:風(fēng)格 
  6. fullscreen:是否全屏 
  7. visible:是否可見 
  8. vsync:暫不清楚 
  9. file_drops:文件刪除 
  10. display:指定的設(shè)備 
  11. screen:屏幕 
  12. config:配置 
  13. context:上下文處理器 
  14. mode:模式 

雖然參數(shù)很多,但是并不是每個(gè)都能用到。下面我們就簡單創(chuàng)建個(gè)窗口吧。

  1. pyglet.window.Window(600, 600) #創(chuàng)建一個(gè)600*600的窗口 
  2. pyglet.app.run() #啟動(dòng) ,有點(diǎn)像flask的啟動(dòng)方式 

 

這樣就成功啟動(dòng)了一個(gè)窗口。

其實(shí)窗口里面還有很多方法,有在用自動(dòng)提示功能IDE的老鐵應(yīng)該不陌生:

  1. win.get_location() 
  2. win.set_location(x,y) 
  3. win.get_size() 
  4. win.width 
  5. win.height 

想必大家應(yīng)該比較熟悉了。

但是這也遠(yuǎn)遠(yuǎn)不夠啊,我們還得給它點(diǎn)修飾,比如說加點(diǎn)文字圖片什么的。

1、加文字

為了顯示文本,我們得使用text方法,text方法又有很多子方法,因?yàn)橐砑游谋舅韵纫幸粋€(gè)標(biāo)簽,所以我們先要加個(gè)label方法,下面看看label有哪些方法:

可以看出,的確又是一大堆,下面請看參數(shù)說明:

  1. text:文本 
  2. font_name:字體名 
  3. font_size:字體大小 
  4. bold:是否加粗 
  5. italic:是否傾斜 
  6. color:字體顏色 
  7. x:文本左下角x坐標(biāo) 
  8. y:文本左下角y坐標(biāo) 
  9. width:文本寬度 
  10. height:文本高度 
  11. anchor_x:x坐標(biāo)錨點(diǎn),可以分為:left  center right 
  12. anchor_y:y坐標(biāo)錨點(diǎn),可以分為:bottom baseline  center  top 
  13. align:水平方向位置 
  14. multiline:是否換行,如果是,需指定寬度 
  15. dpi:鼠標(biāo)每移動(dòng)一英寸指針在屏幕上移動(dòng)的點(diǎn)數(shù) 
  16. batch:批量處理 
  17. group:組 

接下來我們需要?jiǎng)?chuàng)建一個(gè)label:

  1. label = pyglet.text.Label('fuck you'
  2.                           font_size=40, 
  3.                           x=win.width//2, y=win.height//2,  #窗口寬高的一半 
  4.                           anchor_x='center', anchor_y='center') #中間位置 

然后繪制文本:

  1. label.draw() 

但是這樣并不能將文字加入到窗口中,因?yàn)橹暗拇翱跊]有清除,窗口重繪其實(shí)就是一個(gè)清除在添加在清除的過程,因?yàn)榇翱趧?chuàng)建時(shí)啟用了一個(gè)on_draw方法,所以這時(shí)我們需要重寫on_draw方法。

  1. @win.event  #裝飾器 
  2. def on_draw():#重寫on_draw方法 
  3.     win.clear() #窗口清除 
  4.     label.draw() #重繪窗口 

這樣窗口就達(dá)到最新的效果,就有了文字,然后在啟動(dòng):

  1. pyglet.app.run() 

 

2、添加圖片

關(guān)于圖片的話,想必里面的image大家應(yīng)該比較熟悉。

那么我們先將圖片讀取出來,然后進(jìn)行重繪

  1. import pyglet 
  2. win=pyglet.window.Window(600, 600) 
  3. image=pyglet.image.load('2.jpg') #讀取圖片 
  4. @win.event 
  5. def on_draw(): #重寫方法 
  6.     win.clear() #窗口清除 
  7.     image.blit(0, 0) #重繪窗口,從左下角的(0,0)處開始繪制 
  8. pyglet.app.run() #啟動(dòng) 

這里要說到的一個(gè)非常重要的參數(shù)便是blit了,它和顯示文字的draw一樣,要想圖片顯示在屏幕上還得靠它。

當(dāng)然,官方文檔顯示還有一種方法:

  1. import pyglet 
  2.  
  3. win = pyglet.window.Window() 
  4. image = pyglet.resource.image('2.jpg') #讀取資源文件 
  5. @win.event 
  6. def on_draw(): 
  7.     win.clear() 
  8.     image.blit(0, 0) 
  9.  
  10. pyglet.app.run() 

這樣也可以,兩種方法任選一種,你喜歡就好。

對于加載不同文件夾下的圖片,有什么好的策略了:

  1. pyglet.resource.path = ['./images'] #先導(dǎo)入圖片路徑但是路徑必須和程序在同一個(gè)目錄 
  2. pyglet.resource.reindex()  #建立索引 
  3. image = pyglet.resource.image("1.jpg") #加載圖片 
  4. image.get_region(x, y, width, height) #得到新圖片 

也可以使用image.load()

  1. from pyglet import image 
  2. picture = image.load('picture.png') #讀取圖片 
  3. #你可以截圖這張圖片,生成張新的圖片。 
  4. picture.get_region(x, y, width, height) 

目前我們僅僅只接觸到了on_draw 這一個(gè)事件,那么pyglet還有哪些有趣的鍵盤和鼠標(biāo)處理事件呢?我們一起看下吧。

3、鍵盤事件

用法:

  1. def on_key_press(symbol, modifiers): #鍵盤按下 
  2.     pass 
  3.  
  4. def on_key_release(symbol, modifiers):#鍵盤釋放 
  5.     pass 

1) 常用symbol

按鍵符號:

  1. key.A  #字母 
  2. key._1  #數(shù)字 
  3. #控制鍵 
  4. key.ENTER or key.RETURN 
  5. key.SPACE 
  6. key.BACKSPACE 
  7. key.DELETE 
  8. key.MINUS 
  9. key.EQUAL 
  10. key.BACKSLASH 
  11.  
  12. #小鍵盤 
  13. key.NUM_1 
  14. key.NUM_2 
  15. key.NUM_EQUAL 
  16. key.NUM_DIVIDE 
  17. key.NUM_MULTIPLY 
  18. key.NUM_SUBTRACT 
  19. key.NUM_ADD 
  20. key.NUM_DECIMAL 
  21. key.NUM_ENTER 
  22.  
  23. #左右修飾鍵 
  24. key.LCTRL 
  25. key.RCTRL 
  26. key.LSHIFT 
  27. key.RSHIFT 

判斷按下哪個(gè)鍵:

  1. import pyglet 
  2. from pyglet.window import key 
  3. win=pyglet.window.Window(500,400) 
  4. @win.event 
  5. def on_key_press(symbol, modifiers): 
  6.      
  7.     if symbol == key.W: 
  8.       print('前進(jìn)'
  9.      
  10.     elif symbol == key.S: 
  11.       print('后退'
  12.     
  13.     elif symbol == key.A: 
  14.       print('左移'
  15.      
  16.     elif symbol == key.D: 
  17.       print('右移'
  18.      
  19.     if modifiers & key.MOD_CTRL: 
  20.       print('over'
  21.  
  22. pyglet.app.run() 

可以看到結(jié)果如我們所料:

這樣大家是不是就有種想寫游戲的沖動(dòng)了了。

當(dāng)然,pyglet還能將當(dāng)前鍵盤狀態(tài)進(jìn)行存儲以便隨時(shí)調(diào)用,可用KeyStateHandler()實(shí)現(xiàn)。

  1. import pyglet 
  2. from pyglet.window import key 
  3. win=pyglet.window.Window(500,400) 
  4. kd = key.KeyStateHandler() #初始化 
  5. win.push_handlers(kd) #將鍵狀態(tài)裝進(jìn)窗口記錄 有裝當(dāng)然就有扔:pop 
  6. if kd[key.SPACE]: 
  7.   print('按下了空格鍵'

4、鼠標(biāo)事件

  1. def on_mouse_motion(x,y,dx,dy):#鼠標(biāo)移動(dòng) 
  2.   pass 
  3.    
  4. def on_mouse_press(x, y, button, modifiers): #鼠標(biāo)按住 
  5.     pass 
  6.  
  7. def on_mouse_release(x, y, button, modifiers):#鼠標(biāo)釋放 
  8.     pass 
  9.  
  10. def on_mouse_drag(x, y, dx, dy, buttons, modifiers):#鼠標(biāo)拖動(dòng) 
  11.     pass 
  12.      
  13. def on_mouse_enter(x, y): #鼠標(biāo)進(jìn)入窗口 
  14.     pass 
  15.  
  16. def on_mouse_leave(x, y): #鼠標(biāo)離開窗口 
  17.     pass 
  18.      
  19. def on_mouse_scroll(x, y, scroll_x, scroll_y):#鼠標(biāo)滾輪 
  20.     pass 

我們可以實(shí)現(xiàn)下它的部分有趣功能:

  1. import pyglet 
  2. win=pyglet.window.Window(500,400) 
  3. @win.event 
  4. def on_mouse_motion(x,y,dx,dy):#鼠標(biāo)移動(dòng) 
  5.   print('移動(dòng)'
  6. @win.event   
  7. def on_mouse_press(x, y, button, modifiers): #鼠標(biāo)按住 
  8.     print('按下鼠標(biāo)'
  9. @win.event 
  10. def on_mouse_release(x, y, button, modifiers):#鼠標(biāo)釋放 
  11.     print('松開鼠標(biāo)'
  12. @win.event 
  13. def on_mouse_drag(x, y, dx, dy, buttons, modifiers):#鼠標(biāo)拖動(dòng) 
  14.     print('拖動(dòng)鼠標(biāo)'
  15. @win.event    
  16. def on_mouse_enter(x, y): #鼠標(biāo)進(jìn)入窗口 
  17.     print('進(jìn)入窗口'
  18. @win.event 
  19. def on_mouse_leave(x, y): #鼠標(biāo)離開窗口 
  20.     print('離開窗口'
  21. @win.event    
  22. def on_mouse_scroll(x, y, scroll_x, scroll_y):#鼠標(biāo)滾輪 
  23.     print('鼠標(biāo)滾輪'
  24.      
  25. pyglet.app.run() 

 

可以看到,我們成功捕獲到鼠標(biāo)的運(yùn)行軌跡。

鼠標(biāo)常數(shù):

這個(gè)可以用來判斷到底是哪邊的鼠標(biāo)按鍵被觸發(fā)了。

  1. pyglet.window.mouse.LEFT  #左邊 
  2. pyglet.window.mouse.MIDDLE  #中間滾輪 
  3. pyglet.window.mouse.RIGHT #右邊 

改變鼠標(biāo)光標(biāo):

  1. win.set_mouse_visible(visible=True) #顯示  False隱藏 
  2. cursor = win.get_system_mouse_cursor(win.CURSOR_HELP) #獲取操作系統(tǒng)定義的游標(biāo) 
  3. win.set_mouse_cursor(cursor) #設(shè)置鼠標(biāo)外觀 

 

也可以使用自定義圖像作為光標(biāo):

  1. image = pyglet.image.load('2.jpg') #讀取圖片 
  2. cursor = pyglet.window.ImageMouseCursor(image, 16, 8) #將圖片添加到鼠標(biāo)游標(biāo)上 
  3. win.set_mouse_cursor(cursor) #設(shè)置鼠標(biāo)游標(biāo) 
  4. win.set_mouse_visible(visible=True) #設(shè)置可見 

激活鼠標(biāo)獨(dú)占模式:

  1. win.set_exclusive_mouse(True)#射擊游戲常 

三、輸入文本事件

用于游戲時(shí)輸入某些命令可以更改某些參數(shù),值,達(dá)到一定的效果。

  1. import pyglet 
  2. win=pyglet.window.Window(500,400) 
  3. @win.event 
  4. def on_text(text): #輸入文本事件 
  5.   if text=='i love you'
  6.     print('i love you too'

四、window下的事件

1.重設(shè)大小

用法:on_resize(width,height)

  1. win=pyglet.window.Window(500,400) 
  2. @window.event 
  3. def on_resize(width,height): 
  4.   width=100 
  5.   height=200 
  6. pyglet.app.run() 

我們都知道,如果每個(gè)都去這樣設(shè)置,費(fèi)時(shí)費(fèi)力,而且也不簡潔,我們可以用一個(gè)類封裝:

  1. import pyglet 
  2. from pyglet.window import key 
  3. win=pyglet.window.Window(500,400) 
  4. class win(pyglet.window.Window): #繼承Window類 
  5.   def on_resize(self,width,height): #重寫方法 
  6.     self.width=200  #重設(shè)寬度 
  7.     self.height=100 #重設(shè)高度 
  8.  
  9.   def on_text(self,text): #文本事件 
  10.     aa=input('shuru:'
  11.     if aa=='I love you'
  12.       print('i love you too'
  13.   def on_key_press(self,symbol, modifiers): #監(jiān)聽鍵盤事件 
  14.     if symbol == key.W:  
  15.       print('前進(jìn)'
  16.       self.width=self.width+100 
  17.  
  18.     elif symbol == key.S: 
  19.       print('后退'
  20.       self.width=self.width+200 
  21.     elif symbol == key.A: 
  22.       print('左移'
  23.       self.width=self.width-200 
  24.     elif symbol == key.D: 
  25.       print('右移'
  26.       self.width=self.width-100 
  27.     if modifiers & key.MOD_CTRL: 
  28.       print('over'
  29.       self.width=self.width+300 
  30.  
  31. win() 
  32. pyglet.app.run() 

有點(diǎn)卡頓,不過問題不大,最重要的是我們把它實(shí)現(xiàn)了。

五、音樂播放

pyglet不光可以制作游戲,它還可以播放音樂,那么它是怎么實(shí)現(xiàn)的呢?

1.使用media.load播放音頻

  1. import pyglet 
  2. win=pyglet.window.Window() 
  3. sound = pyglet.media.load('11.wav', streaming=False) #加載音樂,注意只能播放wav格式音頻 
  4. sound.play() #播放 
  5. pyglet.app.run() 

2.使用resource.media播放音頻

  1. import pyglet 
  2. win=pyglet.window.Window() 
  3. sound = pyglet.resource.media('11.wav', streaming=False) #加載音樂,注意只能播放wav格式音頻 
  4. sound.play() #播放 
  5. pyglet.app.run() 

兩種方法均可,其實(shí)在大部分加載操作中,都可以用到這兩種方法,比如說media /image/text都可以。

如果我們需要控制播放,則需引入另一個(gè)方法:Player(),注意第一個(gè)是大寫。

  1. play = pyglet.media.Player() 

然后我們將播放音頻添加到一個(gè)隊(duì)列中去:

  1. play.queue(sound)  

最后播放:

  1. play.play()  

通過上面的講述我們現(xiàn)在就可以添加多首音樂到我們的隊(duì)列中了。下面請看:

  1. import pyglet 
  2. win=pyglet.window.Window() 
  3. sound = pyglet.resource.media('11.wav', streaming=False
  4. sound1=pyglet.media.load('2.wav', streaming=False
  5. play = pyglet.media.Player() 
  6. play.queue(sound) #隊(duì)列一 
  7. play.queue(sound1)#隊(duì)列二 
  8. play.play()#播放 
  9. win.close()  #隱藏黑窗口,可以惡搞別人 
  10. pyglet.app.run() 

有時(shí)候我們想讓這些音頻循環(huán)播放那又該怎么辦呢?其實(shí),只需加一個(gè)循環(huán)即可。

  1. import pyglet 
  2. win=pyglet.window.Window() 
  3. sound = pyglet.resource.media('11.wav', streaming=False
  4. sound1=pyglet.media.load('2.wav', streaming=False
  5. play = pyglet.media.Player() 
  6. def xh(): 
  7.   while 1: #條件為真的循環(huán) 
  8.     yield sound  #不斷的迭代 
  9.     yield sound1 
  10. play.queue(xh()) #添加到隊(duì)列 
  11. play.play()   #播放 
  12. pyglet.app.run()  #啟動(dòng) 

六、視頻播放

無所不能的pyglet,游戲 音頻視頻全能啊,哈哈哈。

播放視頻的方法跟音頻比較相似,但也有很多不同的地方。同樣也是兩種方法:

1.使用media.load播放視頻

  1. import pyglet 
  2. win=pyglet.window.Window() 
  3. video = pyglet.media.load('12.mp4') #加載視頻,注意沒有streaming參數(shù) 
  4. play=pyglet.media.Player() #創(chuàng)建播放器對象 
  5. play.queue(video) #添加任務(wù)隊(duì)列 
  6. play.play() #播放 
  7. @win.event 
  8. def on_draw(): 
  9.     win.clear() 
  10.     play.get_texture().blit(30,60) #設(shè)置視頻在黑窗口中的位置,也可使用play.texture.blit(30,60) 
  11. pyglet.app.run() 

2.使用resource.media播放視頻

  1. import pyglet 
  2. win=pyglet.window.Window() 
  3. video = pyglet.resource.media('12.mp4') #加載視頻,注意沒有streaming參數(shù) 
  4. play=pyglet.media.Player() #創(chuàng)建播放器對象 
  5. play.queue(video) #添加任務(wù)隊(duì)列 
  6. play.play() #播放 
  7. @win.event 
  8. def on_draw(): 
  9.     win.clear() 
  10.     play.get_texture().blit(30,60) #設(shè)置視頻在黑窗口中的位置 
  11. pyglet.app.run() 

總結(jié)

pyglet 還有很多好玩的例子,比如canvas畫圖,不過相比較我說的幾點(diǎn),還是會(huì)顯得比較無趣些,希望以上的內(nèi)容能幫助你快速開發(fā)一個(gè)實(shí)用型應(yīng)用程序。

 

責(zé)任編輯:姜華 來源: Python爬蟲與數(shù)據(jù)挖掘
相關(guān)推薦

2023-05-12 08:19:12

Netty程序框架

2021-06-30 00:20:12

Hangfire.NET平臺

2021-11-17 10:11:08

PythonLogging模塊

2021-11-10 09:19:41

PythonShutil模塊

2021-04-24 10:19:41

Python函數(shù)指向

2025-02-19 10:39:26

Python高階函數(shù)函數(shù)名

2021-08-12 14:19:14

Slice數(shù)組類型內(nèi)存

2021-03-24 10:00:32

Python遞歸函數(shù)Python基礎(chǔ)

2021-03-21 07:36:43

Python迭代知識語言

2023-07-30 15:18:54

JavaScript屬性

2023-05-08 08:21:15

JavaNIO編程

2021-01-26 23:46:32

JavaScript數(shù)據(jù)結(jié)構(gòu)前端

2021-03-09 14:04:01

JavaScriptCookie數(shù)據(jù)

2021-06-24 09:05:08

JavaScript日期前端

2021-09-27 09:18:30

ListIterato接口方法

2023-09-06 14:57:46

JavaScript編程語言

2024-01-30 13:47:45

2024-04-19 14:23:52

SwitchJavaScript開發(fā)

2020-12-08 08:09:49

SVG圖標(biāo)Web

2021-03-05 18:04:15

JavaScript循環(huán)代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號