Oil Spill游戏其实就是使用鼠标按动来去除油污的一个游戏,在这个游戏中,我们应用了pygame的声音模块。

Oil Spill游戏

声音的相关操作

首先需要对其进行初始化,我们在使用pygame的时候,也是一定要初始化,即pygame.init(),同样的道理,对声音模块的初始化操作为:

pygame.mixer.init()

其次,我们要加载声音文件,pygame支持两种音频文件格式:未压缩的WAV和OGG音频文件。常见的使用方法是将WAV用于较短的音频文件,将OGG用于较长的音频文件。导入方式如下:

new_oil = pygame.mixer.Sound("new_oil.wav")

通过上面的代码创建的new_oil为Sound对象,其有两个方法分别为play()和stop(),这里我们使用pygame.mixer.Channel进行声音的播放,因此需要创建一个Channel对象:

channel = pygame.mixer.find_channel(True)

以上代码即可请求一个可用的频道,但是channel可能为None,因此传递一个True则可以返回可用的最低优先级的频道。

然后就可以使用频道来播放声音了:

channel.play(sound)

油污精灵

因为没有使用精灵图像,而是简单的颜色圆圈,而且与我们之前构建的MySprite类有些不同,因此对MySprite类进行了一些扩展,形成一个新的类——OilSprite类:

class OilSprite(MySprite):def __init__(self):MySprite.__init__(self)# 角度从30到90self.radius = random.randint(0, 60) + 30play_sound(new_oil)def update(self, current_time, rate=30):MySprite.update(self, current_time, rate)def fade(self):r2 = self.radius // 2color = self.image.get_at((r2, r2))# 设置颜色的alpha值逐渐变为0实现渐变的效果if color.a > 5:color.a -= 5pygame.draw.circle(self.image, color, (r2, r2), r2, 0)else:oil_group.remove(self)play_sound(clean_oil)

可以看到,这个类中多了一个属性,即radius,用来绘制油污图像,同时多了一个方法,即fade()函数,用来实现油污的逐渐被擦干净的效果。

油污的生成

设置成每1秒钟生成一个新的油污,因此使用到了计时的功能,首先有一个初试时间:

last_time = 0

然后

# 每秒钟增加一个油污
if ticks > last_time + 1000:add_oil()last_time = ticks

即可实现定时添加新的油污,其中add_oil()如下:

# 添加油污
def add_oil():global oil_group, new_oiloil = OilSprite()image = pygame.Surface((oil.radius, oil.radius)).convert_alpha()image.fill((255, 255, 255, 0))oil.fadelevel = random.randint(50, 150)oil_color = 10, 10, 20, oil.fadelevelr2 = oil.radius // 2pygame.draw.circle(image, oil_color, (r2, r2), r2, 0)oil.set_image(image)oil.X = random.randint(0, 760)oil.Y = random.randint(0, 560)oil_group.add(oil)

因为没有图像,因此使用黑色的圆圈表示油污,半径随机,位置随机

油污的清除

因为要清除油污,是要靠用户用鼠标去点击,因此需要用到碰撞检测:

# 获取鼠标输入
b1, b2, b3 = pygame.mouse.get_pressed()
mx, my = pygame.mouse.get_pos()
pos = (mx + 30, my + 30)
if b1 > 0:pygame.draw.circle(backbuffer, tan, pos, 30, 0)oil_hit = None
for oil in oil_group:if pygame.sprite.collide_rect_ratio(0.5)(cursor, oil):oil_hit = oilif b1 > 0:oil_hit.fade()break

完整源代码

源代码如下:

import random
import sys
import pygame
from pygame.locals import *
from MyLibrary import *darktan = 190, 190, 110, 255
tan = 210, 210, 130, 255class OilSprite(MySprite):def __init__(self):MySprite.__init__(self)# 角度从30到90self.radius = random.randint(0, 60) + 30play_sound(new_oil)def update(self, current_time, rate=30):MySprite.update(self, current_time, rate)def fade(self):r2 = self.radius // 2color = self.image.get_at((r2, r2))# 设置颜色的alpha值逐渐变为0实现渐变的效果if color.a > 5:color.a -= 5pygame.draw.circle(self.image, color, (r2, r2), r2, 0)else:oil_group.remove(self)play_sound(clean_oil)def game_init():global screen, backbuffer, font, timer, oil_group, cursor, cursor_grouppygame.init()screen = pygame.display.set_mode((800, 600))pygame.display.set_caption("Oil Spill Game")font = pygame.font.Font(None, 36)pygame.mouse.set_visible(False)timer = pygame.time.Clock()# 创建一个平面backbuffer = pygame.Surface((800, 600))backbuffer.fill(darktan)# 创建一个油污组oil_group = pygame.sprite.Group()# 创建一个鼠标组cursor = MySprite()cursor.radius = 60image = pygame.Surface((60, 60)).convert_alpha()image.fill((255, 255, 255, 0))pygame.draw.circle(image, (80, 80, 220, 70), (30, 30), 30, 0)pygame.draw.circle(image, (80, 80, 250, 255), (30, 30), 30, 4)cursor.set_image(image)cursor_group = pygame.sprite.GroupSingle()cursor_group.add(cursor)# 初始化音响
def audio_init():global new_oil, clean_oilpygame.mixer.init()new_oil = pygame.mixer.Sound("new_oil.wav")clean_oil = pygame.mixer.Sound("clean_oil.wav")# 播放声音
def play_sound(sound):channel = pygame.mixer.find_channel(True)channel.set_volume(0.5)channel.play(sound)# 添加油污
def add_oil():global oil_group, new_oiloil = OilSprite()image = pygame.Surface((oil.radius, oil.radius)).convert_alpha()image.fill((255, 255, 255, 0))oil.fadelevel = random.randint(50, 150)oil_color = 10, 10, 20, oil.fadelevelr2 = oil.radius // 2pygame.draw.circle(image, oil_color, (r2, r2), r2, 0)oil.set_image(image)oil.X = random.randint(0, 760)oil.Y = random.randint(0, 560)oil_group.add(oil)if __name__ == "__main__":game_init()audio_init()game_over = Falselast_time = 0while True:timer.tick(30)ticks = pygame.time.get_ticks()for event in pygame.event.get():if event.type == QUIT:sys.exit()keys = pygame.key.get_pressed()if keys[K_ESCAPE]:sys.exit()# 获取鼠标输入b1, b2, b3 = pygame.mouse.get_pressed()mx, my = pygame.mouse.get_pos()pos = (mx + 30, my + 30)if b1 > 0:pygame.draw.circle(backbuffer, tan, pos, 30, 0)oil_hit = Nonefor oil in oil_group:if pygame.sprite.collide_rect_ratio(0.5)(cursor, oil):oil_hit = oilif b1 > 0:oil_hit.fade()break# 每秒钟增加一个油污if ticks > last_time + 1000:add_oil()last_time = ticksscreen.blit(backbuffer, (0, 0))# 更新油污组oil_group.update(ticks)oil_group.draw(screen)# 更新鼠标组cursor.position = (mx, my)cursor_group.update(ticks)cursor_group.draw(screen)if oil_hit:print_text(font, 0, 0, "OIL SPLOTCH - CLEAN IT!")else:print_text(font, 0, 0, "CLEAN")pygame.display.update()

运行结果如下:

Pygame学习笔记9:计时、声音和Oil Spill游戏相关推荐

  1. Pygame学习笔记11:三角函数及Tank Battle游戏

    这一次将运用三角函数的相关知识以及前面学过的相关知识,如声音.精灵图像等来设计Tank Battle游戏,即坦克大战. Tank Battle游戏 为了实现该游戏,需要再向MyLibrary.py文件 ...

  2. Pygame学习笔记 4 —— 时间与运动

        还记得我们在之前的程序中如何让兔子动起来的吗,没错,使用event模块检测键盘事件,改变绘图的坐标,画面刷新后兔子就移动了.接下来我们细说如何精确控制时间和运动. 主要内容: pygame的时 ...

  3. Pygame学习笔记 6 —— 3D游戏

        pygame是是上世纪的产品,虽然不适合最3D游戏,但我可以使用pygame来绘制简单的3D图形,就像在白纸上画立体图形一样. 主要内容: 视觉上的远近.3D空间.绘制一个空间图形 一.视觉上 ...

  4. Python第三方库pygame学习笔记(一)

    Pygame Python最经典的2D游戏开发第三方库,也支持3D游戏开发 Pygame适合用于游戏逻辑验证.游戏入门及系统演示验证 Pygame是一种游戏开发引擎,基本逻辑具有参考价值 pygame ...

  5. 【Pygame 学习笔记】8.精灵

    术语"精灵"是旧计算机和游戏机的保留.这些较旧的盒子无法以足够快的速度绘制和擦除普通图形,使其无法用作游戏.这些机器有特殊的硬件来处理需要快速动画的游戏对象.这些对象被称为&quo ...

  6. Python可视化物理随机过程---pygame学习笔记2

    Python可视化物理随机过程-pygame学习笔记2 文章目录 Python可视化物理随机过程---pygame学习笔记2 一.扩散现象的简单的介绍 二.代码实现 三.运行代码的效果展示 四.总结 ...

  7. 《游戏设计艺术(第2版)》——学习笔记(7)第7章 游戏始于一个创意

    <游戏设计艺术(第2版)>学习笔记(7) 第7章 游戏始于一个创意 灵感 陈述问题 如何睡眠 你的无声伙伴 潜意识建议1:给予关注 潜意识建议2:记录你的创意 潜意识建议3:(明智的)满足 ...

  8. 《游戏设计艺术(第2版)》——学习笔记(8)第8章 游戏通过迭代提高

    <游戏设计艺术(第2版)>学习笔记(8) 第8章 游戏通过迭代提高 选择创意 八项测试 迭代规则 软件工程的简短历史 危险--瀑布--保留 巴里·伯姆爱你 敏捷宣言 风险评估与原型设计 制 ...

  9. 传感器自学笔记第十一章——三色RGB学习笔记+高感度声音检测模块+KY-010光遮断传感器+TCRT5000循迹传感器+倾斜模块

    作者:GWD 时间:2019.06.28 三色RGB学习笔记(开关量类传感器) 一.学习要点:无 二.手册分析(开关量传感器) 1.产品用途:RGB LED 模块由一个贴片全彩 LED 制成,通过 R ...

最新文章

  1. activity 流程编辑器_如何读取APK的Activity(Python实现)
  2. java多叉树全路径_算法实战——多叉树全路径遍历
  3. CodeForces - 1030C Vasya and Golden Ticket(思维)
  4. ORM中的Model与DDD中的DomainModel
  5. 解决php保存文件时文件名乱码问题
  6. JAVA 实现生命游戏
  7. WinRAR美化增强版 v5.10 简体中文版
  8. GPX格式地图轨迹生成python
  9. Android集成LAME库,实现pcm转mp3
  10. 无线桥接后如何进入副路由器的页面?
  11. 顺序表前m和后n元素交换位置
  12. 深井泵房无人值守系统 泵站无人值守平台 智慧水务
  13. 局域网限速软件_除了Teamviewer,这些优秀的远程软件你用了吗
  14. java 复制excel_PoiUtil.java 用于excel间sheet复制
  15. 我做的一个Android 下的PDF书架阅读APP
  16. ftp服务器文件传输,FTP服务器之间传输文件
  17. 七月算法机器学习笔记5 -- 特征工程
  18. 阿里云边缘云计算的技术和实践
  19. 微信小程序原生开发学习01
  20. Ubuntu 20.04 时间修改成 24小时制

热门文章

  1. 计算机右击管理在哪,电脑权限管理在哪里
  2. 十二星座运势查询微信小程序源码
  3. IT经典网站(国内,国外)!
  4. php jwt token刷新方案,JWT刷新token策略
  5. 做wish用多大的虚拟服务器,Wish卖家看过来,这几个平台“潜规则”你必须知道!...
  6. 全球与中国高光谱成像设备市场深度研究分析报告
  7. 用OpenCV实现Photoshop算法(九): 高反差保留
  8. 程序员是不是青春饭?
  9. buly上传Mapping文件
  10. 国外优秀设计网站推荐