当前位置: 代码迷 >> 综合 >> py实现外星人入侵(二次开发)——2.添加音乐
  详细解决方案

py实现外星人入侵(二次开发)——2.添加音乐

热度:97   发布时间:2023-12-12 23:49:28.0

前言

这次的魔爪放在音乐部分,主要使用的是pygame.mixer以及其中的music。
我在背景音乐上添加了内容,并在发射子弹和子弹碰到外星人的时候播放音乐(噪音)。

话不多说,我们就开始看吧。

准备素材

首先贴一个B站dl的百度网盘:链接,有一说一这容量还是很震撼的。
这里就不推荐网站了,找了几个下载的时候都比较烦人,如果有好的可以在下面评论区推荐一下。
另外我查了一下,貌似背景音乐需要使用ogg格式,剩下的wav格式就行(虽然推荐wvb,但我没找到),常见的比如mp3貌似pygame支持的不算很好。
转文件格式的网站:链接,在线转,感觉海星。

将准备好的三个音频准备好,在代码文件夹alien中新建一个music文件夹,将三个音频分别命名放好。在这里插入图片描述
bg_music:背景音乐
boom:子弹打中飞船
bullet:子弹发射

随后我们将相对路径放在setting中,同时设置了一些其他的变量:

        """音效设置"""   #音频文件路径self.bullet_music = "./alien/music/bullet.wav"self.boom_music = "./alien/music/boom.wav"self.bg_music = "./alien/music/bg_music.ogg"#音量设置self.load = 0.5     #0~1

相对路径的问题,去看我上一篇博客。

背景音乐

背景音乐是随时随地都要播放的,同时我选择的是循环播放。

    #播放音乐pygame.mixer.music.load(ai_setting.bg_music)pygame.mixer.music.set_volume(ai_setting.load)           #设置音量pygame.mixer.music.play(-1)

直接扔代码吧。
第一行是导入音频地址,第二行是设置音量,都是采用设置类里面的参数(音量是从0到1)。
第三行是播放,play有两个参数,第一个是循环次数,如果为-1则循环播放;
另一个参数start还要看音频的格式,ogg的单位为秒。

如果对music的其他内容感兴趣,分享一篇dl的博客。

其他音频

其实还想对飞船碰到外星人和外星人碰到底部以及游戏结束的时候分别添加,但是套路都一样,这里我们拿子弹发射作为例子

因为屏幕上的子弹总数只有三个,所以不能选择检测到按下空格就播放,我选择的是在向子弹编组添加内容的时候进行播放,这样目标就是game_function中的fire_bullet函数。

我写了一个fire——music函数,在添加子弹的时候调用函数。

def fire_music(path,stats):sound = pygame.mixer.Sound(path)if(stats.level > 10):sound.set_volume(1)else:sound.set_volume(0.1*stats.level)sound.play()

解释:
首先,我们不能再使用之前的方法了,因为如果还使用的话在播放后面的音频就会使背景音乐停止,这不是我们想要的效果,所以我使用了另外一个方法:
pygame.mixer.Sound方法创建了sound对象。

同时我不希望就只能播放音乐这样无聊,所以我将音量设置为和等级线性相关,这样就能在等级上升的同时提高音量。当然了,因为最大音量就是1,所以我添加了一个判断条件。

基本上流程都差不多。

其他情况

如果是子弹击中外星人,那么我的添加是在:check_bullet_alien_collisions函数中,因为在函数中处理了击中外星人的得分问题,使用了groupcollide方法(这部分我在之前的函数博客中也有提到),在遍历返回在字典的同时,不但处理了得分问题,还进行了音频播放,不过没有封装成函数。

    if collisions:for alien in collisions.values():#确保每一个外星人都会被算上分数,防止一个子弹对应多个外星人stats.score += ai_settings.alien_pointssb.prep_score()Sound = pygame.mixer.Sound(ai_settings.boom_music)Sound.set_volume(0.3)Sound.play()check_high_score(stats,sb)

如果是外星人碰到飞船或者碰到底部,那么我们就可以在ship_hit中处理,情况基本上相同。

  相关解决方案