来源:<em>Python</em>爬虫与数据挖掘 作者:<em>Python</em>进阶者 前言 为什么我不选择pygame,原因很简单,因为pyglet 更简单,比较轻量级,就好比django和flask的区别。相信你在读了这篇文章之后也会毅然决然的选择pyglet。
2021-05-27 15:00:08
來源:Python爬蟲與資料探勘
作者:Python進階者
前言
為什麼我不選擇pygame,原因很簡單,因為pyglet 更簡單,比較輕量級,就好比django和flask的區別。
相信你在讀了這篇文章之後也會毅然決然的選擇pyglet。
這篇文章主要圍繞pyglet 的安裝、基本用法和例項三部分進行展開。
一、安裝
和大多數模組安裝方式一樣,pyglet 的安裝方式如下:
pip install pyglet
二、基本用法
#匯入模組
import pyglet
下面我們來看看這個模組中具體有哪些方法,那麼怎麼看呢?我們都知道,要檢視系統中所有模組的話,可以使用pip list還有一種比較Python的方法:import sysprint(sys.modules.keys())
恩,但是今天我們要檢視的是pyglet的所有方法,所以,dir瞭解下,用這個內建函數:print(dir(pyglet))
我們先不看那些帶下劃線的方法,因為那些方法都是大佬在研究的方向,我們先看比較平民化的方法,比如說第一個app,image,clock,media,os,sys,text,version,window,input,lib,font,event,是不是一看就能知道它是幹啥的?什麼,你不知道?那隻能說明你英語太差了。比如說我想獲取它的版本號,那麼version肯定是首選了,下面來試試:
結果和我們料想的一樣,真的是太有才了。既然我們是要用這個來編寫遊戲,那麼肯定少不了視窗了。
既然談到視窗,那咱們第一印象肯定是window啦,因為它就有視窗的意思。
我們可以看到它並未顯示視窗,說明少了點東西,檢視官方文件可知,而且它的參數貌似還不少:
這是我從它的原始碼文件中所得的。可以看出都是平常我們見得比較多的英文。這些參數的說明如下:
width:寬度
height:高度
caption:標題
resizable:是否可以調整大小
style:風格
fullscreen:是否全屏
visible:是否可見
vsync:暫不清楚
file_drops:檔案刪除
display:指定的裝置
screen:螢幕
config:配置
context:上下文處理器
mode:模式
雖然參數很多,但是並不是每個都能用到。下面我們就簡單創建個視窗吧。
pyglet.window.Window(600, 600) #創建一個600*600的視窗
pyglet.app.run() #啟動 ,有點像flask的啟動方式
這樣就成功啟動了一個視窗。
其實窗口裡面還有很多方法,有在用自動提示功能IDE的老鐵應該不陌生:
win.get_location()
win.set_location(x,y)
win.get_size()
win.width
win.height
想必大家應該比較熟悉了。
但是這也遠遠不夠啊,我們還得給它點修飾,比如說加點文字圖片什麼的。
1、加文字
為了顯示文字,我們得使用text方法,text方法又有很多子方法,因為要新增文字所以先要有一個標籤,所以我們先要加個label方法,下面看看label有哪些方法:
可以看出,的確又是一大堆,下面請看參數說明:
text:文字
font_name:字型名
font_size:字型大小
bold:是否加粗
italic:是否傾斜
color:字型顏色
x:文字左下角x座標
y:文字左下角y座標
width:文字寬度
height:文字高度
anchor_x:x座標錨點,可以分為:left center right
anchor_y:y座標錨點,可以分為:bottom baseline center top
align:水平方向位置
multiline:是否換行,如果是,需指定寬度
dpi:滑鼠每移動一英寸指針在螢幕上移動的點數
batch:批量處理
group:組
接下來我們需要創建一個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()
但是這樣並不能將文字加入到視窗中,因為之前的視窗沒有清除,視窗重繪其實就是一個清除在新增在清除的過程,因為視窗創建時啟用了一個on_draw方法,所以這時我們需要重寫on_draw方法。
@win.event #裝飾器
def on_draw():#重寫on_draw方法
win.clear() #視窗清除
label.draw() #重繪視窗
這樣視窗就達到最新的效果,就有了文字,然後在啟動:
pyglet.app.run()
2、新增圖片
關於圖片的話,想必裡面的image大家應該比較熟悉。
那麼我們先將圖片讀取出來,然後進行重繪
import pyglet
win=pyglet.window.Window(600, 600)
image=pyglet.image.load('2.jpg') #讀取圖片
@win.event
def on_draw(): #重寫方法
win.clear() #視窗清除
image.blit(0, 0) #重繪視窗,從左下角的(0,0)處開始繪製
pyglet.app.run() #啟動
這裡要說到的一個非常重要的參數便是blit了,它和顯示文字的draw一樣,要想圖片顯示在螢幕上還得靠它。
當然,官方文件顯示還有一種方法:
import pyglet
win = pyglet.window.Window()
image = pyglet.resource.image('2.jpg') #讀取資原始檔
@win.event
def on_draw():
win.clear()
image.blit(0, 0)
pyglet.app.run()
這樣也可以,兩種方法任選一種,你喜歡就好。
對於載入不同資料夾下的圖片,有什麼好的策略了:
pyglet.resource.path = ['./images'] #先匯入圖片路徑但是路徑必須和程式在同一個目錄
pyglet.resource.reindex() #建立索引
image = pyglet.resource.image("1.jpg") #載入圖片
image.get_region(x, y, width, height) #得到新圖片
也可以使用image.load()
from pyglet import image
picture = image.load('picture.png') #讀取圖片
#你可以截圖這張圖片,生成張新的圖片。
picture.get_region(x, y, width, height)
目前我們僅僅只接觸到了on_draw 這一個事件,那麼pyglet還有哪些有趣的鍵盤和滑鼠處理事件呢?我們一起看下吧。
3、鍵盤事件
用法:
def on_key_press(symbol, modifiers): #鍵盤按下
pass
def on_key_release(symbol, modifiers):#鍵盤釋放
pass
1) 常用symbol
按鍵符號:
key.A #字母
key._1 #數字
#控制鍵
key.ENTER or key.RETURN
key.SPACE
key.BACKSPACE
key.DELETE
key.MINUS
key.EQUAL
key.BACKSLASH
#小鍵盤
key.NUM_1
key.NUM_2
key.NUM_EQUAL
key.NUM_DIVIDE
key.NUM_MULTIPLY
key.NUM_SUBTRACT
key.NUM_ADD
key.NUM_DECIMAL
key.NUM_ENTER
#左右修飾鍵
key.LCTRL
key.RCTRL
key.LSHIFT
key.RSHIFT
判斷按下哪個鍵:
import pyglet
from pyglet.window import key
win=pyglet.window.Window(500,400)
@win.event
def on_key_press(symbol, modifiers):
if symbol == key.W:
print('前進')
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()
可以看到結果如我們所料:
這樣大家是不是就有種想寫遊戲的衝動了了。
當然,pyglet還能將當前鍵盤狀態進行儲存以便隨時呼叫,可用KeyStateHandler()實現。
import pyglet
from pyglet.window import key
win=pyglet.window.Window(500,400)
kd = key.KeyStateHandler() #初始化
win.push_handlers(kd) #將鍵狀態裝進視窗記錄 有裝當然就有扔:pop
if kd[key.SPACE]:
print('按下了空格鍵')
4、滑鼠事件
def on_mouse_motion(x,y,dx,dy):#滑鼠移動
pass
def on_mouse_press(x, y, button, modifiers): #滑鼠按住
pass
def on_mouse_release(x, y, button, modifiers):#滑鼠釋放
pass
def on_mouse_drag(x, y, dx, dy, buttons, modifiers):#滑鼠拖動
pass
def on_mouse_enter(x, y): #滑鼠進入視窗
pass
def on_mouse_leave(x, y): #滑鼠離開視窗
pass
def on_mouse_scroll(x, y, scroll_x, scroll_y):#滑鼠滾輪
pass
我們可以實現下它的部分有趣功能:
import pyglet
win=pyglet.window.Window(500,400)
@win.event
def on_mouse_motion(x,y,dx,dy):#滑鼠移動
print('移動')
@win.event
def on_mouse_press(x, y, button, modifiers): #滑鼠按住
print('按下滑鼠')
@win.event
def on_mouse_release(x, y, button, modifiers):#滑鼠釋放
print('鬆開滑鼠')
@win.event
def on_mouse_drag(x, y, dx, dy, buttons, modifiers):#滑鼠拖動
print('拖動滑鼠')
@win.event
def on_mouse_enter(x, y): #滑鼠進入視窗
print('進入視窗')
@win.event
def on_mouse_leave(x, y): #滑鼠離開視窗
print('離開視窗')
@win.event
def on_mouse_scroll(x, y, scroll_x, scroll_y):#滑鼠滾輪
print('滑鼠滾輪')
pyglet.app.run()
可以看到,我們成功捕獲到滑鼠的運行軌跡。
滑鼠常數:
這個可以用來判斷到底是哪邊的滑鼠按鍵被觸發了。
pyglet.window.mouse.LEFT #左邊
pyglet.window.mouse.MIDDLE #中間滾輪
pyglet.window.mouse.RIGHT #右邊
改變滑鼠游標:
win.set_mouse_visible(visible=True) #顯示 False隱藏
cursor = win.get_system_mouse_cursor(win.CURSOR_HELP) #獲取作業系統定義的遊標
win.set_mouse_cursor(cursor) #設定滑鼠外觀
也可以使用自定義影象作為游標:
image = pyglet.image.load('2.jpg') #讀取圖片
cursor = pyglet.window.ImageMouseCursor(image, 16, 8) #將圖片新增到滑鼠遊標上
win.set_mouse_cursor(cursor) #設定滑鼠遊標
win.set_mouse_visible(visible=True) #設定可見
啟用滑鼠獨佔模式:
win.set_exclusive_mouse(True)#射擊遊戲常
三、輸入文字事件
用於遊戲時輸入某些命令可以更改某些參數,值,達到一定的效果。
import pyglet
win=pyglet.window.Window(500,400)
@win.event
def on_text(text): #輸入文字事件
if text=='i love you':
print('i love you too')
四、window下的事件
1.重設大小
用法:on_resize(width,height)
win=pyglet.window.Window(500,400)
@window.event
def on_resize(width,height):
width=100
height=200
pyglet.app.run()
我們都知道,如果每個都去這樣設定,費時費力,而且也不簡潔,我們可以用一個類封裝:
import pyglet
from pyglet.window import key
win=pyglet.window.Window(500,400)
class win(pyglet.window.Window): #繼承Window類
def on_resize(self,width,height): #重寫方法
self.width=200 #重設寬度
self.height=100 #重設高度
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): #監聽鍵盤事件
if symbol == key.W:
print('前進')
self.width=self.width+100
elif symbol == key.S:
print('後退')
self.width=self.width+200
elif symbol == key.A:
print('左移')
self.width=self.width-200
elif symbol == key.D:
print('右移')
self.width=self.width-100
if modifiers & key.MOD_CTRL:
print('over')
self.width=self.width+300
win()
pyglet.app.run()
有點卡頓,不過問題不大,最重要的是我們把它實現了。
五、音樂播放
pyglet不光可以製作遊戲,它還可以播放音樂,那麼它是怎麼實現的呢?
1.使用media.load播放音訊
import pyglet
win=pyglet.window.Window()
sound = pyglet.media.load('11.wav', streaming=False) #載入音樂,注意只能播放wav格式音訊
sound.play() #播放
pyglet.app.run()
2.使用resource.media播放音訊
import pyglet
win=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()
通過上面的講述我們現在就可以新增多首音樂到我們的佇列中了。下面請看:
import pyglet
win=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()
有時候我們想讓這些音訊迴圈播放那又該怎麼辦呢?其實,只需加一個迴圈即可。
import pyglet
win=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: #條件為真的迴圈
yield sound #不斷的迭代
yield sound1
play.queue(xh()) #新增到佇列
play.play() #播放
pyglet.app.run() #啟動
六、視訊播放
無所不能的pyglet,遊戲 音訊視訊全能啊,哈哈哈。
播放視訊的方法跟音訊比較相似,但也有很多不同的地方。同樣也是兩種方法:
1.使用media.load播放視訊
import pyglet
win=pyglet.window.Window()
video = pyglet.media.load('12.mp4') #載入視訊,注意沒有streaming參數
play=pyglet.media.Player() #創建播放器物件
play.queue(video) #新增任務佇列
play.play() #播放
@win.event
def on_draw():
win.clear()
play.get_texture().blit(30,60) #設定視訊在黑視窗中的位置,也可使用play.texture.blit(30,60)
pyglet.app.run()
2.使用resource.media播放視訊
import pyglet
win=pyglet.window.Window()
video = pyglet.resource.media('12.mp4') #載入視訊,注意沒有streaming參數
play=pyglet.media.Player() #創建播放器物件
play.queue(video) #新增任務佇列
play.play() #播放
@win.event
def on_draw():
win.clear()
play.get_texture().blit(30,60) #設定視訊在黑視窗中的位置
pyglet.app.run()
總結
pyglet 還有很多好玩的例子,比如canvas畫圖,不過相比較我說的幾點,還是會顯得比較無趣些,希望以上的內容能幫助你快速開發一個實用型應用程式。
相關文章
来源:<em>Python</em>爬虫与数据挖掘 作者:<em>Python</em>进阶者 前言 为什么我不选择pygame,原因很简单,因为pyglet 更简单,比较轻量级,就好比django和flask的区别。相信你在读了这篇文章之后也会毅然决然的选择pyglet。
2021-05-27 15:00:08
5月27日,王俊凯官宣了自己的新的身份,告知粉丝自己成了<em>英特尔</em>酷睿品牌的代言人。 21岁的王俊凯,出道以来就具备高人气,在商业上也有很高的价值,代言过的品牌也不计其数,一个新的身份的官宣,也让我们看到了他
2021-05-27 14:30:54
<em>英特尔</em>Evo平台认证的出现,让不懂轻薄本的朋友,只需要认准是否有认证就能够买到综合使用体验出众的产品。当然,通过<em>英特尔</em>Evo平台认证的轻薄本,其售价普遍偏高,毕竟整个认证过程相对较为严苛。不过有一款
2021-05-27 14:30:25
这些参数都让<em>iPhone</em>手机的生产成本大幅度下降。在拍照方面,苹果采用的摄像头也是1200万像素,有一说一,4800万像素摄像头、6400万像素摄像头、1亿像素摄像头的成本肯定高于1200万像素摄像头,而这就是苹果节约
2021-05-27 14:00:38
<em>iPhone</em> 12 Pro Max去年10月上市的,上市不久国外知名拆解机构iFixit就完成了对此款手机的拆解分析。不过关于核心器件成本分析一直没有给出。直到最近TechInsights对苹果<em>iPhone</em> 12 Pro Max 5G智能手
2021-05-27 14:00:18
徐工集团做工程机械在中国的规模第一,在全球现在排名第三;华大智造做基因测序仪,全球就三家公司,它是中国唯一一家;海光是做X86架构服务器CPU芯片,也是中国唯一一家,全球也就是<em>英特尔</em>、AMD和它三家;准时达是
2021-05-27 13:31:36