飞道的博客

一篇文章带你了解Python中的游戏开发模块pyglet

489人阅读  评论(0)

前言

为什么我不选择pygame,原因很简单,因为pyglet 更简单,比较轻量级,就好比django和flask的区别。

相信你在读了这篇文章之后也会毅然决然地选择pyglet。

这篇文章主要围绕pyglet 的安装、基本用法和实例三部分进行展开。

 

一、安装

和大多数模块安装方式一样,pyglet 的安装方式如下:

pip install pyglet

 

二、基本用法


  
  1. #导入模块
  2. import pyglet

下面我们来看看这个模块中具体有哪些方法,那么怎么看呢?我们都知道,要查看系统中所有模块的话,可以使用

pip list

还有一种比较Python的方法:


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

恩,但是今天我们要查看的是pyglet的所有方法,所以,dir了解下,用这个内置函数:

print(dir(pyglet))

我们先不看那些带下划线的方法,因为那些方法都是大佬在研究的方向,我们先看比较平民化的方法,比如说第一个app,image,clock,media,os,sys,text,version,window,input,lib,font,event,是不是一看就能知道它是干啥的?什么,你不知道?那只能说明你英语太差了。比如说我想获取它的版本号,那么version肯定是首选了,下面来试试:

结果和我们料想的一样,真的是太有才了。既然我们是要用这个来编写游戏,那么肯定少不了窗口了。

既然谈到窗口,那咱们第一印象肯定是window啦,因为它就有窗口的意思。

我们可以看到它并未显示窗口,说明少了点东西,查看官方文档可知,而且它的参数貌似还不少:

这是我从它的源代码文档中所得的。可以看出都是平常我们见得比较多的英文。这些参数的说明如下:


  
  1. width:宽度
  2. height:高度
  3. caption:标题
  4. resizable:是否可以调整大小
  5. style:风格
  6. fullscreen:是否全屏
  7. visible:是否可见
  8. vsync:暂不清楚
  9. file_drops:文件删除
  10. display:指定的设备
  11. screen:屏幕
  12. config:配置
  13. context:上下文处理器
  14. mode:模式

虽然参数很多,但是并不是每个都能用到。下面我们就简单创建个窗口吧。


  
  1. pyglet.window.Window( 600, 600) #创建一个 600* 600的窗口
  2. pyglet.app.run() #启动 ,有点像flask的启动方式

这样就成功启动了一个窗口。

其实窗口里面还有很多方法,有在用自动提示功能IDE的老铁应该不陌生:


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

想必大家应该比较熟悉了。

但是这也远远不够啊,我们还得给它点修饰,比如说加点文字图片什么的。

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:705933274

1、加文字

为了显示文本,我们得使用text方法,text方法又有很多的方法,因为要添加文本所以先要有一个标签,所以我们先要加个label方法,下面看看label有哪些方法:

可以看出,的确又是一大堆,下面请看参数说明:


  
  1. text:文本
  2. font_name:字体名
  3. font_size:字体大小
  4. bold:是否加粗
  5. italic:是否倾斜
  6. color:字体颜色
  7. x:文本左下角x坐标
  8. y:文本左下角y坐标
  9. width:文本宽度
  10. height:文本高度
  11. anchor_x:x坐标锚点,可以分为:left center right
  12. anchor_y:y坐标锚点,可以分为:bottom baseline center top
  13. align:水平方向位置
  14. multiline:是否换行,如果是,需指定宽度
  15. dpi:鼠标每移动一英寸指针在屏幕上移动的点数
  16. batch:批量处理
  17. group:组

接下来我们需要创建一个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') #中间位置

然后绘制文本:

label.draw()

但是这样并不能将文字加入到窗口中,因为之前的窗口没有清除,窗口重绘其实就是一个清除在添加在清除的过程,因为窗口创建时启用了一个on_draw方法,所以这时我们需要重写on_draw方法。


  
  1. @win.event #装饰器
  2. def on_draw(): #重写on_draw方法
  3. win.clear() #窗口清除
  4. label.draw() #重绘窗口

这样窗口就达到最新的效果,就有了文字,然后再启动:

pyglet.app.run()

2、添加图片

关于图片的话,想必里面的image大家应该比较熟悉。

那么我们先将图片读取出来,然后进行重绘


  
  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() #启动

这里要说到的一个非常重要的参数便是blit了,它和显示文字的draw一样,要想图片显示在屏幕上还得靠它。

当然,官方文档显示还有一种方法:


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

这样也可以,两种方法任选一种,你喜欢就好。

对于加载不同文件夹下的图片,有什么好的策略了:


  
  1. pyglet.resource.path = [ './images'] #先导入图片路径但是路径必须和程序在同一个目录
  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 这一个事件,那么pyglet还有哪些有趣的键盘和鼠标处理事件呢?我们一起看下吧。

 

3、键盘事件

用法:


  
  1. def on_key_press(symbol, modifiers): #键盘按下
  2. pass
  3. def on_key_release(symbol, modifiers): #键盘释放
  4. pass

1) 常用symbol

按键符号:


  
  1. key.A #字母
  2. key._1 #数字
  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. key.NUM_1
  13. key.NUM_2
  14. key.NUM_EQUAL
  15. key.NUM_DIVIDE
  16. key.NUM_MULTIPLY
  17. key.NUM_SUBTRACT
  18. key.NUM_ADD
  19. key.NUM_DECIMAL
  20. key.NUM_ENTER
  21. #左右修饰键
  22. key.LCTRL
  23. key.RCTRL
  24. key.LSHIFT
  25. key.RSHIFT

判断按下哪个键:


  
  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. if symbol == key.W:
  7. print( '前进')
  8. elif symbol == key.S:
  9. print( '后退')
  10. elif symbol == key.A:
  11. print( '左移')
  12. elif symbol == key.D:
  13. print( '右移')
  14. if modifiers & key.MOD_CTRL:
  15.       print( 'over')
  16. pyglet.app.run()

可以看到结果如我们所料:

这样大家是不是就有种想写游戏的冲动了了。

当然,pyglet还能将当前键盘状态进行存储以便随时调用,可用KeyStateHandler()实现。


  
  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) #将键状态装进窗口记录 有装当然就有扔:pop
  6. if kd[key.SPACE]:
  7. print( '按下了空格键')

4、鼠标事件


  
  1. def on_mouse_motion(x,y,dx,dy): #鼠标移动
  2. pass
  3. def on_mouse_press(x, y, button, modifiers): #鼠标按住
  4. pass
  5. def on_mouse_release(x, y, button, modifiers): #鼠标释放
  6. pass
  7. def on_mouse_drag(x, y, dx, dy, buttons, modifiers): #鼠标拖动
  8. pass
  9. def on_mouse_enter(x, y): #鼠标进入窗口
  10. pass
  11. def on_mouse_leave(x, y): #鼠标离开窗口
  12. pass
  13. def on_mouse_scroll(x, y, scroll_x, scroll_y): #鼠标滚轮
  14. pass

我们可以实现下它的部分有趣功能:


  
  1. import pyglet
  2. win=pyglet.window.Window( 500, 400)
  3. @win.event
  4. def on_mouse_motion(x,y,dx,dy): #鼠标移动
  5. print( '移动')
  6. @win.event
  7. def on_mouse_press(x, y, button, modifiers): #鼠标按住
  8. print( '按下鼠标')
  9. @win.event
  10. def on_mouse_release(x, y, button, modifiers): #鼠标释放
  11. print( '松开鼠标')
  12. @win.event
  13. def on_mouse_drag(x, y, dx, dy, buttons, modifiers): #鼠标拖动
  14. print( '拖动鼠标')
  15. @win.event
  16. def on_mouse_enter(x, y): #鼠标进入窗口
  17. print( '进入窗口')
  18. @win.event
  19. def on_mouse_leave(x, y): #鼠标离开窗口
  20. print( '离开窗口')
  21. @win.event
  22. def on_mouse_scroll(x, y, scroll_x, scroll_y): #鼠标滚轮
  23. print( '鼠标滚轮')
  24. pyglet.app.run()

可以看到,我们成功捕获到鼠标的运行轨迹。

鼠标常数:

这个可以用来判断到底是哪边的鼠标按键被触发了。


  
  1. pyglet.window.mouse.LEFT #左边
  2. pyglet.window.mouse.MIDDLE #中间滚轮
  3. pyglet.window.mouse.RIGHT #右边

改变鼠标光标:


  
  1. win.set_mouse_visible(visible= True) #显示 False隐藏
  2. cursor = win.get_system_mouse_cursor(win.CURSOR_HELP) #获取操作系统定义的游标
  3. win.set_mouse_cursor(cursor) #设置鼠标外观

也可以使用自定义图像作为光标:


  
  1. image = pyglet.image.load( '2.jpg') #读取图片
  2. cursor = pyglet.window.ImageMouseCursor(image, 16, 8) #将图片添加到鼠标游标上
  3. win.set_mouse_cursor(cursor) #设置鼠标游标
  4. win.set_mouse_visible(visible= True) #设置可见

激活鼠标独占模式:

win.set_exclusive_mouse(True)#射击游戏常

 

三、输入文本事件

用于游戏时输入某些命令可以更改某些参数,值,达到一定的效果。


  
  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.重设大小

用法: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()

我们都知道,如果每个都去这样设置,费时费力,而且也不简洁,我们可以用一个类封装:


  
  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 #重设宽度
  7. self.height= 100 #重设高度
  8. def on_text(self,text): #文本事件
  9. aa=input( 'shuru:')
  10. if aa== 'I love you':
  11. print( 'i love you too')
  12. def on_key_press(self,symbol, modifiers): #监听键盘事件
  13. if symbol == key.W:
  14. print( '前进')
  15. self.width=self.width+ 100
  16. elif symbol == key.S:
  17. print( '后退')
  18. self.width=self.width+ 200
  19. elif symbol == key.A:
  20. print( '左移')
  21. self.width=self.width -200
  22. elif symbol == key.D:
  23. print( '右移')
  24. self.width=self.width -100
  25. if modifiers & key.MOD_CTRL:
  26. print( 'over')
  27. self.width=self.width+ 300
  28. win()
  29. pyglet.app.run()

有点卡顿,不过问题不大,最重要的是我们把它实现了。

 

五、音乐播放

pyglet不光可以制作游戏,它还可以播放音乐,那么它是怎么实现的呢?

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()

两种方法均可,其实在大部分加载操作中,都可以用到这两种方法,比如说media /image/text都可以。

如果我们需要控制播放,则需引入另一个方法:Player(),注意第一个是大写。

play = pyglet.media.Player()

然后我们将播放音频添加到一个队列中去:

play.queue(sound) 

最后播放:

play.play() 

通过上面的讲述我们现在就可以添加多首音乐到我们的队列中了。下面请看:


  
  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) #队列一
  7. play.queue(sound1) #队列二
  8. play.play() #播放
  9. win.close() #隐藏黑窗口,可以恶搞别人
  10. pyglet.app.run()

有时候我们想让这些音频循环播放那又该怎么办呢?其实,只需加一个循环即可。


  
  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: #条件为真的循环
  8. yield sound #不断的迭代
  9. yield sound1
  10. play.queue(xh()) #添加到队列
  11. play.play() #播放
  12. pyglet.app.run() #启动

 

六、视频播放

无所不能的pyglet,游戏 音频视频全能啊,哈哈哈。

播放视频的方法跟音频比较相似,但也有很多不同的地方。同样也是两种方法:

1.使用media.load播放视频


  
  1. import pyglet
  2. win=pyglet.window.Window()
  3. video = pyglet.media.load( '12.mp4') #加载视频,注意没有streaming参数
  4. play=pyglet.media.Player() #创建播放器对象
  5. play.queue(video) #添加任务队列
  6. play.play() #播放
  7. @win.event
  8. def on_draw():
  9. win.clear()
  10. play.get_texture().blit( 30, 60) #设置视频在黑窗口中的位置,也可使用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参数
  4. play=pyglet.media.Player() #创建播放器对象
  5. play.queue(video) #添加任务队列
  6. play.play() #播放
  7. @win.event
  8. def on_draw():
  9. win.clear()
  10. play.get_texture().blit( 30, 60) #设置视频在黑窗口中的位置
  11. pyglet.app.run()

 

总结

pyglet 还有很多好玩的例子,比如canvas画图,不过相比较我说的几点,还是会显得比较无趣些,希望以上的内容能帮助你快速开发一个实用型应用程序。

文章到这里就结束了,不光是打工的程序员难,大家都很难的啦

我退休后一直在学习如何写文章,说实在的,每次在后台看到一些读者的回应都觉得很欣慰,对于自媒体我是个刚入门的人,还是个傻大叔…为了感谢读者们,我想把我收藏的一些编程干货贡献给大家,回馈每一个读者,希望能帮到你们。

干货主要有:

① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤Python所有知识点汇总(可以弄清楚Python的所有方向和技术)

*如果你用得到的话可以直接拿走,在我的QQ技术交流群里(纯技术,广告勿入)可以自助拿走,群号是705933274。*


转载:https://blog.csdn.net/aaahtml/article/details/116427167
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场