我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python飞机大战实例有感——pyga

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python飞机大战实例有感——pyga

目录

  • pygame如何实现“切歌”以及多曲重奏?
    • 一、pygame实现切歌
      • 初始化路径
      • 尝试一
      • 尝试二
      • 尝试三
      • 成功
      • 总结
    • 二、如何在python多线程顺序执行的情况下实现音乐和音效同时播放?
      • 尝试一
      • 尝试二
      • 尝试三
      • 尝试四
      • 成功
      • 总结

昨天晚上研究了好久pygame的音乐混合器mixer,出了很多问题后最终成功,不过学习本来也不可能一帆风顺的吗,下面我就来讲一讲我遇到的问题。

一、pygame实现切歌

初始化路径

# 导库,需安装
import pygame
# 把路径赋值分别给三个变量,以便之后加载。
music_file_path1 = "./sound/background.mp3"
music_file_path2 = "./sound/background1.mp3"
music_file_path3 = "./sound/dead.mp3"
# 初始化混合器
pygame.mixer.init()

尝试一

开始尝试直接加载新的音乐,想着循环里有调用play方法,是不是直接调用load方法修改路径,就能播放其他音乐了呢?

# 加载初始背景音乐
pygame.mixer.music.load(music_file_path1)
while True:
  pygame.mixer.music.play()
  if 死亡:
    # 切换死亡音乐
    pygame.mixer.music.load(music_file_path3)
    for 检测按键
        if 按键:
            #重开游戏,并切换成初始背景音乐
            pygame.mixer.music.load(music_file_path1)
  if 达成条件进入第二关:
    # 切换为第二关背景音乐
    pygame.mixer.music.load(music_file_path2)
  # 延时50ms之后进入下层循环
  pygame.time.delay(50)

失败、、、没有完成切换音乐,只有播放初始音乐,切换的部分是静音的。

尝试二

是不是可以考虑多开几个线程呢?之前java我就这么捣鼓过,这个算是写的比较乱的,主要还是不懂的太多。

# 导库,系统自带的。
import threading
# 定义一个函数以便线程来执行。
def bgm(music_file_path):
  pygame.mixer.music.load(music_file_path)
  pygame.mixer.music.play()

...

# 新建3个子线程
thread1 = threading.Thread(bgm(music_file_path1))
thread2 = threading.Thread(bgm(music_file_path2))
thread3 = threading.Thread(bgm(music_file_path3))
# 启动线程1
thread1.strat()
while True:
  if 死亡:
    # 切换死亡音乐
    thread3.strat()
    for 检测按键
        if 按键:
            #重开游戏,并切换成初始背景音乐
            thread1.strat()
  if 达成条件进入第二关:
    # 切换为第二关背景音乐
    thread2.strat()
  # 延时50ms之后进入下层循环
  pygame.time.delay(50)

同样失败了,刚开始,运行的就是死亡时候的背景音乐,也就是说,只有最后加载的那个起作用了,在具体点说,此时的thread1, thread2, thread3已经是完全相同的了。

尝试三

加了许多改变,bgm函数里加了初始化mixer,线程改为了在循环里运行匿名线程。(因为直接在循环里thread1.start()的话,会报错,说线程只能启动一次。)

# 导库,系统自带的。
import threading
# 定义一个函数以便线程来执行。
def bgm(music_file_path):
  pygame.mi
  pygame.mixer.music.load(music_file_path)
  pygame.mixer.music.play()

...

while True:
  # 默认音乐
  threading.Thread(bgm(music_file_path1)).start()
  if 死亡:
    # 切换死亡音乐
    threading.Thread(bgm(music_file_path3)).start()
    for 检测按键
        if 按键:
            #重开游戏,并切换成初始背景音乐
            threading.Thread(bgm(music_file_path1)).start()
  if 达成条件进入第二关:
    # 切换为第二关背景音乐
    threading.Thread(bgm(music_file_path2)).start()
  # 延时50ms之后进入下层循环
  pygame.time.delay(50)

现在看也觉得怎么看怎么错的,不过这倒是给我提供了一个思路,只要每次切换音乐的时候重新初始化一下mixer就能播放新的了。

成功

尝试不止三次,我只是找了3个可能比较有代表性的例子,希望大家能从中吸取经验,下面,我将展示成功的代码。

# 定义3个变量来表示是否在播放哪首音乐。
sound1, sound2, sound3 = True, True, True
# 加载初始背景音乐
pygame.mixer.music.load(music_file_path1)
pygame.mixer.music.play()
while True:
  if 死亡:
    # 切换死亡音乐
    # 通过sound的True, False的值的改变,控制只有第一次进入这个判断条件的时候才会初始化混合器。防止出现每50ms加载一次音乐的开头50ms的情况。
    if sound3:
        pygame.mixer.init()
        pygame.mixer.music.load(music_file_path3)
        sound3 = False
        sound1, sound2 = True, True
    if pygame.mixer.get_busy != 1:
        pygame.mixer.music.play()
    for 检测按键
        if 按键:
            #重开游戏,并切换成初始背景音乐
            if sound1:
              pygame.mixer.init()
              pygame.mixer.music.load(music_file_path1)
              sound1 = False
              sound2, sound3 = True, True
            if pygame.mixer.get_busy != 1:
              pygame.mixer.music.play()
  if 达成条件进入第二关:
    # 切换为第二关背景音乐
    if sound2:
      pygame.mixer.init()
      pygame.mixer.music.load(music_file_path1)
      sound2 = False
      sound1, sound3 = True, True
    if pygame.mixer.get_busy != 1:
      pygame.mixer.music.play()
  # 延时50ms之后进入下层循环
  pygame.time.delay(50)

最终成功!

总结

二、如何在python多线程顺序执行的情况下实现音乐和音效同时播放?

这个其实挺简单的,就是我开始的时候被坑了,被坑的原因现在也不太清楚。。

尝试一

# 飞机的发射子弹类
def launch_bullet:
  sound = pygame.mixer.Sound("./sound/bullet.wav")
  sound.play()
# 敌机的被击毁判断
if 敌机被击毁:
  sound = pygame.mixer.Sound("./sound/boom.wav")
  sound.play()

真的很简单的啊,就这样就应该可以了啊,结果它报错了,说unable to open file "./sound/bullet.wav",无奈,只能换方法。。

尝试二

经过查阅发现了winsound这个模块,然后,testing...

# 导入模块,系统自带的
import winsound
# 飞机的发射子弹类
def launch_bullet:
  winsound.PlaySound("./sound/bullet.wav", SND_NOSTOP)
# 敌机的被击毁判断
if 敌机被击毁:
  winsound.PlaySound("./sound/boom.wav", SND_NOSTOP)

然后成功感受到了单线程的恶意。。。

尝试三

于是就用多线程吧,结合java的经验,一定手到擒来的吧!

# 再次尝试使用threading
import threading
import winsound
# 飞机的发射子弹类
def launch_bullet:
  # 直接匿名函数先测试走起!
  threading.Thread(winsound.PlaySound("./sound/bullet.wav", SND_NOSTOP)).start()
# 敌机的被击毁判断
if 敌机被击毁:
  threading.Thread(winsound.PlaySound("./sound/boom.wav", SND_NOSTOP)).start()

有点错愕地发现失败了,跟之前一次的尝试结果一样,然后才知道原来python的多线程因为什么原因我忘了,还是顺序执行的。

尝试四

在网上了解到了多进程可以实现并发访问,于是

# 系统自带
import multiprocessing
import winsound
# 飞机的发射子弹类
def launch_bullet:
  multiprocessing.freeze__support()
  p = multiprocessing.Process(winsound.PlaySound("./sound/bullet.wav", SND_NOSTOP))
  p.start()
# 敌机的被击毁判断
if 敌机被击毁:
  multiprocessing.freeze__support()
  p = multiprocessing.Process(winsound.PlaySound("./sound/boom.wav", SND_NOSTOP))
  p.start()

然后每射一发子弹,就给我打开一个新窗口,我。。。。

成功

最后决定还是再给Sound一个机会,他文档上不是说只能加载wav和ogg吗?wav失败了,我再重新找一下ogg的素材吧。然后就成功了。就成功了。。。我捣鼓半天,结果是素材的原因。

# 飞机的__init__方法里
    self.sound = pygame.mixer.Sound("./sound/bullet.ogg")
# 飞机的发射子弹类
def launch_bullet:
  self.sound.play()
# 敌机的__init__方法里
    self.sound = pygame.mixer.Sound("./sound/get_score.ogg")
# 敌机的被击毁判断
if 敌机被击毁:
  self.sound.play()

具体第一次尝试为何失败我们仍未可知,也许是文件太大了?

总结

真的是一次印象挺深刻的经历,深刻到我这篇全文都是没看之前的代码敲出来的,甚至学了个新单词mixer是混合器的意思。程序源码我会放在我的github上。

飞机大战源码

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python飞机大战实例有感——pyga

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python飞机大战实例有感——pyga

目录 pygame如何实现“切歌”以及多曲重奏? 一、pygame实现切歌 初始化路径 尝试一 尝试二 尝试三 成功
2023-01-31

python -- 飞机大战(实验)

小Q:今天无意间发现了大神写的python飞机项目,和一本好资料,记录一下。前一阵子看了一篇文章:青少年如何使用Python开始游戏开发 。看完照葫芦画瓢写了一个,觉得挺好玩儿,相当于简单学了下Pygame库。这篇文章是个12岁小孩儿写的,
2023-01-31

Python实现简单飞机大战

本文实例为大家分享了Python实现简单飞机大战的具体代码,供大家参考,具体内容如下 功能 玩家飞机可以移动,可以发射子弹,敌机随机产生,自由坠落。未添加击落敌机的功能。主要用来练习类的封装与继承。 源码# -*- coding=utf-8
2022-06-02

Python如何实现飞机大战项目

这篇文章主要介绍Python如何实现飞机大战项目,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下plane_main.pyimport pygamefrom 飞机大战.plane_sprites impor
2023-06-20

怎么用Python实现小游戏飞机大战

本篇内容介绍了“怎么用Python实现小游戏飞机大战”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、环境安装本文是写的游戏代码,基于Pyg
2023-06-25

Python中怎么实现一个飞机大战游戏

Python中怎么实现一个飞机大战游戏,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。功能玩家飞机可以移动,可以发射子弹,敌机随机产生,自由坠落。未添加击落敌机的功能。主要用
2023-06-20

JS实现飞机大战小游戏的示例代码

小编给大家分享一下JS实现飞机大战小游戏的示例代码,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!先制作好要做好的几步以及背景样式var canvas = document.getElementById("canvas");
2023-06-15

Pygame库200行代码实现简易飞机大战的示例分析

这篇文章将为大家详细讲解有关Pygame库200行代码实现简易飞机大战的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。写在开头,因为这个小游戏的实验主要是帮助我熟悉pygame库的使
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录