使用Python pyglet库编写一个可播放音乐的扬声器类流程详解

 更新时间:2024年03月23日 10:19:59   作者:Hann Yang  
这篇文章主要介绍了使用Python pyglet库编写一个可播放音乐的扬声器类,Pyglet主要用于创建视频游戏、独立游戏和多媒体应用,它提供了一组用于制作游戏的常用功能,包括图形渲染、声音播放、事件处理等等,需要的朋友可以参考下

一、绘制喇叭

本篇将教你用pyglet画一个小喇叭,如下图。这里要用到pyglet库shapes模块中的圆弧Arc和多边形Pylygon画出这个扬声器的图片:

Arc(x, y, radius, segments=None, angle=6.283185307179586, start_angle=0, closed=False, color=(255, 255, 255, 255), batch=None, group=None)

x,y 是圆弧的圆心坐标;

radius 是半径;

angle是圆心角的弧度数;

start_angle是圆弧起始的弧度数,以水平线起始时,值为0;

圆弧控件没有表示粗细的参数,只能多画几个同心圆弧来加粗。

Polygon(*coordinates, color=(255, 255, 255, 255), batch=None, group=None)

coordinates是多边形的各个端点的坐标列表,也可以写成元组方式;

多边形控件是填充形状,没有粗细参数也不能只画边线。

代码如下:

import pyglet
window = pyglet.window.Window(800,500)
batch = pyglet.graphics.Batch()
color = (255, 255, 255)
pi = 3.141592653589793
arc = []
x, y = 380, 250
for i in [*range(6),*range(18,24),*range(36,42)]:
    arc.append(pyglet.shapes.Arc(x=x, y=y, radius=50-i/2, angle=pi/2, start_angle=-pi/4, color=color, batch=batch))
coordinates = [x+10, y+8], [x, y+8], [x, y-8], [x+10, y-8], [x+16, y-14], [x+16, y+14]
polygon = pyglet.shapes.Polygon(*coordinates, color=color, batch=batch)
@window.event
def on_draw():
    window.clear()
    batch.draw()
pyglet.app.run()

二、扬声器类

改写为一个类便于调用,可以画在任意坐标处:

class Speaker:

class Speaker:
    def __init__(self, x, y, color=(255, 255, 255)):
        self.arc = []
        pi = 3.141592653589793
        for i in [*range(6),*range(18,24),*range(36,42)]:
                self.arc.append(pyglet.shapes.Arc(x=x, y=y, radius=50-i/2, angle=pi/2, start_angle=-pi/4, color=color, batch=batch))
        coordinates = [x+10, y+8], [x, y+8], [x, y-8], [x+10, y-8], [x+16, y-14], [x+16, y+14]
        self.polygon = pyglet.shapes.Polygon(*coordinates, color=color, batch=batch)

调用代码:

import pyglet
window = pyglet.window.Window(800,500)
batch = pyglet.graphics.Batch()
class Speaker:
    def __init__(self, x, y, color=(255, 255, 255)):
        self.arc = []
        pi = 3.141592653589793
        for i in [*range(6),*range(18,24),*range(36,42)]:
            self.arc.append(pyglet.shapes.Arc(x=x, y=y, radius=50-i/2, angle=pi/2, start_angle=-pi/4, color=color, batch=batch))
        coordinates = [x+10, y+8], [x, y+8], [x, y-8], [x+10, y-8], [x+16, y-14], [x+16, y+14]
        self.polygon = pyglet.shapes.Polygon(*coordinates, color=color, batch=batch)
@window.event
def on_draw():
    window.clear()
    batch.draw()
speaker1 = Speaker(380, 250)
speaker2 = Speaker(600, 360)
pyglet.app.run()

运行效果:

三、禁音状态

再加两条红色直线表示禁音状态,shapes.Line用法:

Line(x, y, x2, y2, width=1, color=(255, 255, 255, 255), batch=None, group=None)

x,y, x2,y2 为直线两端点的坐标;

width为直线粗细,缺省默认值为1,直线控件有粗细的。

代码如下:

import pyglet
window = pyglet.window.Window(800,500)
batch = pyglet.graphics.Batch()
class Speaker:
    def __init__(self, x, y, color=(255, 255, 255)):
        self.arc = []
        pi = 3.141592653589793
        for i in [*range(6),*range(18,24),*range(36,42)]:
            self.arc.append(pyglet.shapes.Arc(x=x, y=y, radius=50-i/2, angle=pi/2, start_angle=-pi/4, color=color, batch=batch))
        coordinates = [x+10, y+8], [x, y+8], [x, y-8], [x+10, y-8], [x+16, y-14], [x+16, y+14]
        self.polygon = pyglet.shapes.Polygon(*coordinates, color=color, batch=batch)
        self.line1 = pyglet.shapes.Line(x, y-24, x+48, y+24, width=3, color=(255, 0, 0), batch=batch)
        self.line2 = pyglet.shapes.Line(x, y+24, x+48, y-24, width=3, color=(255, 0, 0), batch=batch)
@window.event
def on_draw():
    window.clear()
    batch.draw()
speaker1 = Speaker(380, 250)
speaker2 = Speaker(600, 360)
pyglet.app.run()

运行效果:

四、设置状态

再为Speaker类增加两个属性和一个方法,用于设置状态:

self.line1.visible =Flase

self.line2.visible = Flase

def enabled(self, enabled=True):

self.line1.visible = self.line2.visible = not enabled

调用代码:

import pyglet
window = pyglet.window.Window(800,500)
batch = pyglet.graphics.Batch()
class Speaker:
    def __init__(self, x, y, color=(255, 255, 255)):
        self.arc = []
        pi = 3.141592653589793
        for i in [*range(6),*range(18,24),*range(36,42)]:
            self.arc.append(pyglet.shapes.Arc(x=x, y=y, radius=50-i/2, angle=pi/2, start_angle=-pi/4, color=color, batch=batch))
        coordinates = [x+10, y+8], [x, y+8], [x, y-8], [x+10, y-8], [x+16, y-14], [x+16, y+14]
        self.polygon = pyglet.shapes.Polygon(*coordinates, color=color, batch=batch)
        self.line1 = pyglet.shapes.Line(x, y-24, x+48, y+24, width=3, color=(255, 0, 0), batch=batch)
        self.line2 = pyglet.shapes.Line(x, y+24, x+48, y-24, width=3, color=(255, 0, 0), batch=batch)
        self.line1.visible = self.line2.visible = False
    def set_enabled(self, enabled=True):
        self.line1.visible = self.line2.visible = not enabled
@window.event
def on_draw():
    window.clear()
    batch.draw()
speaker1 = Speaker(380, 250)
speaker2 = Speaker(600, 360)
speaker2.set_enabled(False)
pyglet.app.run()

运行效果:

五、切换状态

继续增加鼠标点击切换状态的功能,增加属性和方法:

属性:

self.x = x

self.y = y

self.enabled = True

方法:

    def set_enabled(self, enabled=True):
        self.enabled = enabled
        self.line1.visible = self.line2.visible = not enabled
    def on_mouse_over(self, x, y):
        return self.x <= x <= self.x+50 and self.y-35 <= y <= self.y+35

增加鼠标点击事件:

@window.event
def on_mouse_press(x, y, button, modifier):
    if speaker1.on_mouse_over(x,y):
        speaker1.enabled = not speaker1.enabled
        speaker1.set_enabled(speaker1.enabled)
    if speaker2.on_mouse_over(x,y):
        speaker2.enabled = not speaker2.enabled
        speaker2.set_enabled(speaker2.enabled)

运行效果:分别点击两个图标,就能各自切换状态

六、播放音乐

使用 media 模块调入mp3音乐,配合Speaker类播放

media = pyglet.media.load('voice1.mp3')

sound = pyglet.media.Player()

sound.queue(media)

sound.loop = True

sound.play()

鼠标事件中增加音乐播放和暂停的代码:

@window.event
def on_mouse_press(x, y, button, modifier):
    if speaker.on_mouse_over(x,y):
        speaker.enabled = not speaker.enabled
        speaker.set_enabled(speaker.enabled)
        if speaker.enabled:
            sound.play()
        else:
            sound.pause() 

完整代码:

import pyglet
window = pyglet.window.Window(800,500)
batch = pyglet.graphics.Batch()
class Speaker:
    def __init__(self, x, y, color=(255, 255, 255)):
        self.arc = []
        pi = 3.141592653589793
        for i in [*range(6),*range(18,24),*range(36,42)]:
            self.arc.append(pyglet.shapes.Arc(x=x, y=y, radius=50-i/2, angle=pi/2, start_angle=-pi/4, color=color, batch=batch))
        coordinates = [x+10, y+8], [x, y+8], [x, y-8], [x+10, y-8], [x+16, y-14], [x+16, y+14]
        self.polygon = pyglet.shapes.Polygon(*coordinates, color=color, batch=batch)
        self.line1 = pyglet.shapes.Line(x, y-24, x+48, y+24, width=3, color=(255, 0, 0), batch=batch)
        self.line2 = pyglet.shapes.Line(x, y+24, x+48, y-24, width=3, color=(255, 0, 0), batch=batch)
        self.line1.visible = self.line2.visible = False
        self.x = x
        self.y = y
        self.enabled = True
    def set_enabled(self, enabled=True):
        self.enabled = enabled
        self.line1.visible = self.line2.visible = not enabled
    def on_mouse_over(self, x, y):
        return self.x <= x <= self.x+50 and self.y-35 <= y <= self.y+35
@window.event
def on_draw():
    window.clear()
    batch.draw()
@window.event
def on_mouse_press(x, y, button, modifier):
    if speaker.on_mouse_over(x,y):
        speaker.enabled = not speaker.enabled
        speaker.set_enabled(speaker.enabled)
        if speaker.enabled:
            sound.play()
        else:
            sound.pause()
speaker = Speaker(720, 450)
media = pyglet.media.load('voice1.mp3')
sound = pyglet.media.Player()
sound.queue(media)
sound.loop = True
sound.play()
pyglet.app.run()

运行代码后,就能播放音乐了,点击扬声器图标可以切换音乐的播放和暂停状态。

以上就是使用Python pyglet库编写一个可播放音乐的扬声器类流程详解的详细内容,更多关于Python pyglet的资料请关注脚本之家其它相关文章!

相关文章

  • python  创建一个保留重复值的列表的补码

    python 创建一个保留重复值的列表的补码

    这篇文章主要介绍了python 创建一个保留重复值的列表的补码的相关资料,需要的朋友可以参考下
    2018-10-10
  • python实现去掉字符串中的\xa0、\t、\n

    python实现去掉字符串中的\xa0、\t、\n

    这篇文章主要介绍了python实现去掉字符串中的\xa0、\t、\n方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • python查找指定文件夹下所有文件并按修改时间倒序排列的方法

    python查找指定文件夹下所有文件并按修改时间倒序排列的方法

    今天小编就为大家分享一篇python查找指定文件夹下所有文件并按修改时间倒序排列的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python实现多路视频多窗口播放功能

    Python实现多路视频多窗口播放功能

    这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下
    2025-02-02
  • python如何设置静态变量

    python如何设置静态变量

    在本篇内容里小编给大家整理的是一篇关于python如何设置静态变量的相关文章,有兴趣的朋友们可以参考下。
    2020-09-09
  • python3实现全角和半角字符转换的方法示例

    python3实现全角和半角字符转换的方法示例

    在自然语言处理过程中,全角、半角的的不一致会导致信息抽取不一致,因此需要统一,下面这篇文章主要给大家介绍了关于python3中全角和半角字符转换的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • Python图像处理二值化方法实例汇总

    Python图像处理二值化方法实例汇总

    这篇文章主要介绍了Python图像处理二值化方法实例汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 解决Pycharm调用Turtle时 窗口一闪而过的问题

    解决Pycharm调用Turtle时 窗口一闪而过的问题

    今天小编就为大家分享一篇解决Pycharm调用Turtle时 窗口一闪而过的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • Python 中如何使用requests模块发布表单数据

    Python 中如何使用requests模块发布表单数据

    requests 库是 Python 的主要方面之一,用于创建对已定义 URL 的 HTTP 请求,本篇文章介绍了 Python requests 模块,并说明了我们如何使用该模块在 Python 中发布表单数据,感兴趣的朋友跟随小编一起看看吧
    2023-06-06
  • Python英文单词大小写转换常用方法示例

    Python英文单词大小写转换常用方法示例

    这篇文章主要为大家介绍了Python英文单词大小写转换常用方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01

最新评论