使用pygame实现音乐播放器(二)

前一篇文章中我们已经实现了图片显示和音乐的播放,接下来实现按钮点击。点击按钮需要通过事件处理实现。

pygame是基于事件驱动的,也就是说如果没有任何事件,游戏会停下等待用户操作(事件),所以游戏里首先要有一个事件循环,不停检测用户的事件,否则程序会直接结束。在pygame中,用户按键、鼠标操作、窗口变化等都会产生事件,这些事件按照发生的先后顺序入队,我们可以在事件循环中,从事件队列中取出事件进行处理。

  • 事件获取

    我们可以使用以下方法从事件队列中获取事件,下面这些方法都返回事件对象。

    方法名 参数 功能
    pygame.event.get(type或typelist) type或typelist,如果指定了type或typelist则只获取指定类型的事件 从队列中获取并删除事件。
    pygame.event.poll() 从队列中返回并删除一个事件。如果事件队列为空,那么会立刻返回类型为 pygame.NOEVENT 的事件。
    pygame.event.wait() 从队列中返回并删除一个事件。如果队列为空,那么该函数将持续等待直至队列中有一个事件。当程序在等待时,它将保持睡眠状态,直到一个事件发生才会继续。

    请注意,如果你用pygame.event.get()只从队列中获取和删除指定的事件,那么久而久之,队列可能被你不关注的事件所填满。

  • 事件类型

    事件对象有一个type属性,表示事件的类型,系统已经定义了事件类型,这些事件类型的常量可以从pygame.locals中获取

    事件 产生途径 参数
    QUIT 用户按下关闭按钮 none
    ATIVEEVENT Pygame被激活或者隐藏 gain, state
    KEYDOWN 键盘被按下 unicode, key, mod
    KEYUP 键盘被放开 key, mod
    MOUSEMOTION 鼠标移动 pos, rel, buttons
    MOUSEBUTTONDOWN 鼠标按下 pos, button
    MOUSEBUTTONUP 鼠标放开 pos, button
    VIDEORESIZE Pygame窗口缩放 size, w, h
    VIDEOEXPOSE Pygame窗口部分公开(expose) none
    USEREVENT 触发了一个用户事件 code

    事件类型支持等值比较。如果两个事件具有相同的类型和属性值,那么认为两个事件是相等的。

  • 鼠标事件

    • MOUSEMOTION 鼠标移动事件,事件会在鼠标动作时发生,它有三个参数:

      • buttons:一个含有三个数字的元组,三个值分别代表左键、中键和右键,1就是按下了。

      • pos:鼠标光标的位置

      • rel:代表了现在距离上次产生鼠标事件时的距离

    • MOUSEBUTTONUP 鼠标键释放事件

      • event.pos 鼠标当前坐标值(x,y),相对于窗口左上角

      • event.button 鼠标按下键编号n取值 0/1/2,分别对应三个键

    • MOUSEBUTTONDOWN 鼠标键按下事件

      • event.pos 鼠标当前坐标值(x,y),相对于窗口左上角

      • event.button 鼠标按下键编号n取值为整数,左键为1,右键为3,设备相关

我们可以把背景图中的上一首、停止、下一首和音量按钮的位置定义如下:

NEXTBUTTONPOS = pygame.Rect(300,292,69,66)  # 下一首按钮的位置
STOPBUTTONPOS = pygame.Rect(210,292,69,66)  # 停止按钮的位置
PREVIOUSBUTTONPOS = pygame.Rect(110,292,69,66)  # 前一首按钮的位置
VOLUMEBUTTONPOS = pygame.Rect(30,325,28,21)  # 音量按钮的位置

在pygame中Rect类型可以描述对象的位置,屏幕左上角为原点:

Pygame 通过 Rect 对象存储和操作矩形区域。一个 Rect 对象可以由 left,top,width,height 几个值创建。Rect 也可以是由 Pygame 的对象所创建,它们拥有一下属性:

x,y  # 坐标
top, left, bottom, right  # top是y,left是x
topleft # 左上角坐标,是一个元组(x,y)
midtop, midleft, midbottom, midright
center, centerx, centery
width, height  # 宽,高
w,h # 宽,高
size # 大小,元组(w,h)

最重要的是它有一个collidepoint(point)可以测试一个点是否在矩形之中,我们可以使用这个方法测试是否点中按钮

running = True
while running:
    # 处理用户的事件
    for event in pygame.event.get():
        # type事件类型
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN: # 按下鼠标
            if NEXTBUTTONPOS.collidepoint(event.pos):
                print("下一首按钮")
            elif PREVIOUSBUTTONPOS.collidepoint(event.pos):
                print("前一首按钮")
            elif STOPBUTTONPOS.collidepoint(event.pos):
                print("停止按钮")
            elif VOLUMEBUTTONPOS.collidepoint(event.pos):
                print("音量按钮")

event.pos代表鼠标的坐标,是一个点,这样就可以测试鼠标是否点击到按钮上了

1、下一首按钮实现

首先的计算index的值,获取要播放的歌曲的下标,如果越界应该设置为0,实现循环播放,在这里可以使用模运算解决越界问题

 if NEXTBUTTONPOS.collidepoint(event.pos): # 下一首
       index  = (index + 1) % len(song_list) # 计算下一首的下标
       play(index)

2、上一首的实现

elif PREVIOUSBUTTONPOS.collidepoint(event.pos): # 前一首
    index = (len(song_list) - 1)  if index == 0 else (len(song_list) - 1)
    play(index)

3、停止按钮实现

elif STOPBUTTONPOS.collidepoint(event.pos):
     pygame.mixer.music.stop()

4、音量按钮实现

按鼠标左键增加音量,右键减少音量

volume = pygame.mixer.music.get_volume()  # 获取当前的音量
if event.button == 1:  #左键增加
       volume = (volume+0.1) if volume <= 0.9 else 1  
       pygame.mixer.music.set_volume(volume)  # 设置音量
elif event.button == 3:  # 右键减少
       volume = (volume-0.1) if volume > 0.1 else 0
       pygame.mixer.music.set_volume(volume)

未完待续.....

猜你喜欢

转载自blog.csdn.net/chengshaolei2012/article/details/114146310
今日推荐