<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 8908字,需瀏覽 18分鐘

           ·

          2021-05-21 01:26

          前言

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

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

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


          一、安裝

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

          pip install pyglet

          二、基本用法

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

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

          pip list

          還有一種比較Python的方法:

          import sysprint(sys.modules.keys())

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

          print(dir(pyglet))

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

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

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

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

          這是我從它的源代碼文檔中所得的。可以看出都是平常我們見(jiàn)得比較多的英文。這些參數(shù)的說(shuō)明如下:

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

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

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

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

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

          win.get_location()win.set_location(x,y)win.get_size()win.widthwin.height

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

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

          1、加文字

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

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

          text:文本font_name:字體名font_size:字體大小bold:是否加粗italic:是否傾斜color:字體顏色x:文本左下角x坐標(biāo)y:文本左下角y坐標(biāo)width:文本寬度height:文本高度anchor_x:x坐標(biāo)錨點(diǎn),可以分為:left  center rightanchor_y:y坐標(biāo)錨點(diǎn),可以分為:bottom baseline  center  topalign:水平方向位置multiline:是否換行,如果是,需指定寬度dpi:鼠標(biāo)每移動(dòng)一英寸指針在屏幕上移動(dòng)的點(diǎn)數(shù)batch:批量處理group:組

          接下來(lái)我們需要?jiǎng)?chuàng)建一個(gè)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()

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

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

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

          pyglet.app.run()

          2、添加圖片

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

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

          import pygletwin=pyglet.window.Window(600, 600)image=pyglet.image.load('2.jpg') #讀取圖片@win.eventdef on_draw(): #重寫(xiě)方法    win.clear() #窗口清除    image.blit(0, 0) #重繪窗口,從左下角的(0,0)處開(kāi)始繪制pyglet.app.run() #啟動(dòng)

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

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

          import pyglet
          win = pyglet.window.Window()image = pyglet.resource.image('2.jpg') #讀取資源文件@win.eventdef on_draw(): win.clear() image.blit(0, 0)
          pyglet.app.run()

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

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

          pyglet.resource.path = ['./images'] #先導(dǎo)入圖片路徑但是路徑必須和程序在同一個(gè)目錄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 這一個(gè)事件,那么pyglet還有哪些有趣的鍵盤(pán)和鼠標(biāo)處理事件呢?我們一起看下吧。


          3、鍵盤(pán)事件

          用法:

          def on_key_press(symbol, modifiers): #鍵盤(pán)按下    pass
          def on_key_release(symbol, modifiers):#鍵盤(pán)釋放 pass

          1) 常用symbol

          按鍵符號(hào):

          key.A  #字母key._1  #數(shù)字#控制鍵key.ENTER or key.RETURNkey.SPACEkey.BACKSPACEkey.DELETEkey.MINUSkey.EQUALkey.BACKSLASH
          #小鍵盤(pán)key.NUM_1key.NUM_2key.NUM_EQUALkey.NUM_DIVIDEkey.NUM_MULTIPLYkey.NUM_SUBTRACTkey.NUM_ADDkey.NUM_DECIMALkey.NUM_ENTER
          #左右修飾鍵key.LCTRLkey.RCTRLkey.LSHIFTkey.RSHIFT

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

          import pygletfrom pyglet.window import keywin=pyglet.window.Window(500,400)@win.eventdef 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é)果如我們所料:

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

          當(dāng)然,pyglet還能將當(dāng)前鍵盤(pán)狀態(tài)進(jìn)行存儲(chǔ)以便隨時(shí)調(diào)用,可用KeyStateHandler()實(shí)現(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)移動(dòng)  pass  def on_mouse_press(x, y, button, modifiers): #鼠標(biāo)按住    pass
          def on_mouse_release(x, y, button, modifiers):#鼠標(biāo)釋放 pass
          def on_mouse_drag(x, y, dx, dy, buttons, modifiers):#鼠標(biāo)拖動(dòng) pass def on_mouse_enter(x, y): #鼠標(biāo)進(jìn)入窗口 pass
          def on_mouse_leave(x, y): #鼠標(biāo)離開(kāi)窗口 pass def on_mouse_scroll(x, y, scroll_x, scroll_y):#鼠標(biāo)滾輪 pass

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

          import pygletwin=pyglet.window.Window(500,400)@win.eventdef on_mouse_motion(x,y,dx,dy):#鼠標(biāo)移動(dòng)  print('移動(dòng)')@win.event  def on_mouse_press(x, y, button, modifiers): #鼠標(biāo)按住    print('按下鼠標(biāo)')@win.eventdef on_mouse_release(x, y, button, modifiers):#鼠標(biāo)釋放    print('松開(kāi)鼠標(biāo)')@win.eventdef on_mouse_drag(x, y, dx, dy, buttons, modifiers):#鼠標(biāo)拖動(dòng)    print('拖動(dòng)鼠標(biāo)')@win.event   def on_mouse_enter(x, y): #鼠標(biāo)進(jìn)入窗口    print('進(jìn)入窗口')@win.eventdef on_mouse_leave(x, y): #鼠標(biāo)離開(kāi)窗口    print('離開(kāi)窗口')@win.event   def on_mouse_scroll(x, y, scroll_x, scroll_y):#鼠標(biāo)滾輪    print('鼠標(biāo)滾輪')    pyglet.app.run()

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

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

          這個(gè)可以用來(lái)判斷到底是哪邊的鼠標(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è)置可見(jiàn)

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

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

          三、輸入文本事件

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

          import pygletwin=pyglet.window.Window(500,400)@win.eventdef 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=100  height=200pyglet.app.run()

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

          import pygletfrom pyglet.window import keywin=pyglet.window.Window(500,400)class win(pyglet.window.Window): #繼承Window類  def on_resize(self,width,height): #重寫(xiě)方法    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)聽(tīng)鍵盤(pán)事件 if symbol == key.W: print('前進(jìn)') 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()

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


          五、音樂(lè)播放

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

          1.使用media.load播放音頻

          import pygletwin=pyglet.window.Window()sound = pyglet.media.load('11.wav', streaming=False) #加載音樂(lè),注意只能播放wav格式音頻sound.play() #播放pyglet.app.run()

          2.使用resource.media播放音頻

          import pygletwin=pyglet.window.Window()sound = pyglet.resource.media('11.wav', streaming=False) #加載音樂(lè),注意只能播放wav格式音頻sound.play() #播放pyglet.app.run()

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

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

          play = pyglet.media.Player()

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

          play.queue(sound)

          最后播放:

          play.play()

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

          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) #隊(duì)列一play.queue(sound1)#隊(duì)列二play.play()#播放win.close()  #隱藏黑窗口,可以惡搞別人pyglet.app.run()

          有時(shí)候我們想讓這些音頻循環(huán)播放那又該怎么辦呢?其實(shí),只需加一個(gè)循環(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()) #添加到隊(duì)列play.play()   #播放pyglet.app.run()  #啟動(dòng)

          六、視頻播放

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

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

          1.使用media.load播放視頻

          import pygletwin=pyglet.window.Window()video = pyglet.media.load('12.mp4') #加載視頻,注意沒(méi)有streaming參數(shù)play=pyglet.media.Player() #創(chuàng)建播放器對(duì)象play.queue(video) #添加任務(wù)隊(duì)列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') #加載視頻,注意沒(méi)有streaming參數(shù)play=pyglet.media.Player() #創(chuàng)建播放器對(duì)象play.queue(video) #添加任務(wù)隊(duì)列play.play() #播放@win.eventdef on_draw():    win.clear()    play.get_texture().blit(30,60) #設(shè)置視頻在黑窗口中的位置pyglet.app.run()

          總結(jié)

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

          - EOF -

          回復(fù)關(guān)鍵字“簡(jiǎn)明python ”,立即獲取入門(mén)必備書(shū)籍簡(jiǎn)明python教程》電子版

          回復(fù)關(guān)鍵字爬蟲(chóng)”,立即獲取爬蟲(chóng)學(xué)習(xí)資料

          版權(quán)申明:內(nèi)容來(lái)源網(wǎng)絡(luò),版權(quán)歸原創(chuàng)者所有。除非無(wú)法確認(rèn),都會(huì)標(biāo)明作者及出處,如有侵權(quán),煩請(qǐng)告知,我們會(huì)立即刪除并致歉。我們對(duì)文中觀點(diǎn)保持中立,僅供參考、交流之目的。

          點(diǎn)擊關(guān)注【python入門(mén)與進(jìn)階】,閱讀更多精彩內(nèi)容
          ??????
          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文无码免费一区二区三区 | 国产a久久麻豆入口 | 亚洲动漫一区 | 欧美另类激情总和网 | 日韩无码精品视频 |