关卡内也实现了音量调节

This commit is contained in:
星外之神 2022-07-28 15:38:56 +08:00
parent 6508bdcdb7
commit ffc57d12ff
3 changed files with 75 additions and 51 deletions

View File

@ -10,7 +10,9 @@
* 支持选择植物卡片
* 支持白昼模式,夜晚模式,泳池模式,浓雾模式(暂时没有加入雾),传送带模式和坚果保龄球模式
* 支持背景音乐播放
* 支持调节音量
* 支持音效
* 支持与背景音乐一起调节音量
* 支持全屏模式
* 按`F`键进入全屏模式,按`U`键恢复至窗口模式
* 支持用小铲子移除植物
@ -209,6 +211,7 @@ pyinstaller -F pypvz.py `
* `pg.mixer.music.set_volume()`
* 可以用`音量+``音量-`按钮实现
* 注意字体颜色渲染
* 该功能自0.8.14.0已实现
* 关卡开始前增加预览界面
* 增加解锁与选关功能
* 目前的设想与原版不同,在完成两轮冒险模式(初始冒险模式 + 戴夫选关的冒险模式)后可以自主选关~~(当然现在只是画饼)~~

View File

@ -390,7 +390,7 @@ class Level(tool.State):
self.panel.checkCardClick(mouse_pos)
if self.panel.checkStartButtonClick(mouse_pos):
self.initPlay(self.panel.getSelectedCards())
elif self.checkLittleMenuClick(mouse_pos):
elif self.inArea(self.little_menu_rect, *mouse_pos):
self.showLittleMenu = True
c.SOUND_BUTTON_CLICK.play()
@ -500,37 +500,67 @@ class Level(tool.State):
self.little_menu_rect.x = 690
self.little_menu_rect.y = 0
# 弹出的菜单框
frame_rect = (0, 0, 500, 500)
self.big_menu = tool.get_image_menu(tool.GFX[c.BIG_MENU], *frame_rect, c.BLACK, 1.1)
self.big_menu_rect = self.big_menu.get_rect()
self.big_menu_rect.x = 150
self.big_menu_rect.y = 0
# 返回按钮
frame_rect = (0, 0, 342, 87)
self.return_button = tool.get_image_menu(tool.GFX[c.RETURN_BUTTON], *frame_rect, c.BLACK, 1.1)
self.return_button_rect = self.return_button.get_rect()
self.return_button_rect.x = 220
self.return_button_rect.y = 440
# 重新开始按钮
frame_rect = (0, 0, 207, 45)
self.restart_button = tool.get_image_menu(tool.GFX[c.RESTART_BUTTON], *frame_rect, c.BLACK, 1.1)
self.restart_button_rect = self.restart_button.get_rect()
self.restart_button_rect.x = 295
self.restart_button_rect.y = 325
# 主菜单按钮
frame_rect = (0, 0, 206, 43)
self.mainMenu_button = tool.get_image_menu(tool.GFX[c.MAINMENU_BUTTON], *frame_rect, c.BLACK, 1.1)
self.mainMenu_button_rect = self.mainMenu_button.get_rect()
self.mainMenu_button_rect.x = 299
self.mainMenu_button_rect.y = 372
# 音量+、音量-
frame_rect = (0, 0, 39, 41)
font = pg.font.Font(c.FONT_PATH, 35)
font.bold = True
# 音量+
self.volume_plus_button = tool.get_image_menu(tool.GFX[c.VOLUME_BUTTON], *frame_rect, c.BLACK)
sign = font.render("+", True, c.YELLOWGREEN)
sign_rect = sign.get_rect()
sign_rect.x = 8
sign_rect.y = -4
self.volume_plus_button.blit(sign, sign_rect)
self.volume_plus_button_rect = self.volume_plus_button.get_rect()
self.volume_plus_button_rect.x = 500
# 音量-
self.volume_minus_button = tool.get_image_menu(tool.GFX[c.VOLUME_BUTTON], *frame_rect, c.BLACK)
sign = font.render("-", True, c.YELLOWGREEN)
sign_rect = sign.get_rect()
sign_rect.x = 12
sign_rect.y = -6
self.volume_minus_button.blit(sign, sign_rect)
self.volume_minus_button_rect = self.volume_minus_button.get_rect()
self.volume_minus_button_rect.x = 450
# 音量+、-应当处于同一高度
self.volume_minus_button_rect.y = self.volume_plus_button_rect.y = 250
def pauseAndCheckLittleMenuOptions(self, mouse_pos, mouse_click):
# 设置暂停状态
self.pause = True
# 暂停播放音乐
pg.mixer.music.pause()
if mouse_click[0]:
if self.checkReturnClick(mouse_pos):
# 返回键
if self.inArea(self.return_button_rect, *mouse_pos):
# 终止暂停,停止显示菜单
self.pause = False
self.showLittleMenu = False
@ -538,18 +568,35 @@ class Level(tool.State):
pg.mixer.music.unpause()
# 播放点击音效
c.SOUND_BUTTON_CLICK.play()
elif self.checkRestartClick(mouse_pos):
# 重新开始键
elif self.inArea(self.restart_button_rect, *mouse_pos):
self.done = True
self.next = c.LEVEL
# 播放点击音效
c.SOUND_BUTTON_CLICK.play()
elif self.checkMainMenuClick(mouse_pos):
# 主菜单键
elif self.inArea(self.mainMenu_button_rect, *mouse_pos):
self.done = True
self.next = c.MAIN_MENU
self.persist = self.game_info
self.persist[c.CURRENT_TIME] = 0
# 播放点击音效
c.SOUND_BUTTON_CLICK.play()
# 音量+
elif self.inArea(self.volume_plus_button_rect, *mouse_pos):
self.game_info[c.VOLUME] = min(self.game_info[c.VOLUME] + 0.1, 1)
# 一般不会有人想把音乐和音效分开设置故pg.mixer.Sound.set_volume()和pg.mixer.music.set_volume()需要一起用
pg.mixer.music.set_volume(self.game_info[c.VOLUME])
for i in c.SOUNDS:
i.set_volume(self.game_info[c.VOLUME])
c.SOUND_BUTTON_CLICK.play()
elif self.inArea(self.volume_minus_button_rect, *mouse_pos):
self.game_info[c.VOLUME] = max(self.game_info[c.VOLUME] - 0.1, 0)
# 一般不会有人想把音乐和音效分开设置故pg.mixer.Sound.set_volume()和pg.mixer.music.set_volume()需要一起用
pg.mixer.music.set_volume(self.game_info[c.VOLUME])
for i in c.SOUNDS:
i.set_volume(self.game_info[c.VOLUME])
c.SOUND_BUTTON_CLICK.play()
# 一大波僵尸来袭图片显示
@ -585,36 +632,11 @@ class Level(tool.State):
self.level_progress_flag_rect.x = self.level_progress_bar_image_rect.x - 78
self.level_progress_flag_rect.y = self.level_progress_bar_image_rect.y - 3
# 检查小菜单有没有被点击
def checkLittleMenuClick(self, mouse_pos):
x, y = mouse_pos
if (x >= self.little_menu_rect.x and x <= self.little_menu_rect.right and
y >= self.little_menu_rect.y and y <= self.little_menu_rect.bottom):
return True
return False
# 检查小菜单的返回有没有被点击
def checkReturnClick(self, mouse_pos):
x, y = mouse_pos
if (x >= self.return_button_rect.x and x <= self.return_button_rect.right and
y >= self.return_button_rect.y and y <= self.return_button_rect.bottom):
return True
return False
# 检查小菜单的重新开始有没有被点击
def checkRestartClick(self, mouse_pos):
x, y = mouse_pos
if (x >= self.restart_button_rect.x and x <= self.restart_button_rect.right and
y >= self.restart_button_rect.y and y <= self.restart_button_rect.bottom):
return True
return False
# 检查小菜单的主菜单有没有被点击
def checkMainMenuClick(self, mouse_pos):
x, y = mouse_pos
if (x >= self.mainMenu_button_rect.x and x <= self.mainMenu_button_rect.right and
y >= self.mainMenu_button_rect.y and y <= self.mainMenu_button_rect.bottom):
def inArea(self, rect, x, y):
if (x >= rect.x and x <= rect.right and
y >= rect.y and y <= rect.bottom):
return True
else:
return False
# 用小铲子移除植物
@ -643,16 +665,6 @@ class Level(tool.State):
self.removeMouseImagePlus()
return
# 检查小铲子的位置有没有被点击
# 方便放回去
def checkShovelClick(self, mouse_pos):
x, y = mouse_pos
if( self.hasShovel and
x >= self.shovel_box_rect.x and x <= self.shovel_box_rect.right and
y >= self.shovel_box_rect.y and y <= self.shovel_box_rect.bottom):
return True
return False
def play(self, mouse_pos, mouse_click):
# 原版阳光掉落机制需要
# 已掉落的阳光
@ -744,12 +756,12 @@ class Level(tool.State):
# 检查是否点击菜单
if mouse_click[0] and (not clickedSun) and (not clickedCardsOrMap):
if self.checkLittleMenuClick(mouse_pos):
if self.inArea(self.little_menu_rect, *mouse_pos):
# 暂停 显示菜单
self.showLittleMenu = True
# 播放点击音效
c.SOUND_BUTTON_CLICK.play()
elif self.checkShovelClick(mouse_pos):
elif self.inArea(self.shovel_box_rect, *mouse_pos):
self.drag_shovel = not self.drag_shovel
if not self.drag_shovel:
self.removeMouseImagePlus()
@ -1492,6 +1504,14 @@ class Level(tool.State):
# 画僵尸头
surface.blit(self.level_progress_zombie_head_image, self.level_progress_zombie_head_image_rect)
def showCurrentVolumeImage(self, surface):
# 由于音量可变,因此这一内容不能在一开始就结束加载,而应当不断刷新不断显示
font = pg.font.Font(c.FONT_PATH, 30)
volume_tips = font.render(f"音量:{round(self.game_info[c.VOLUME]*100):3}%", True, c.LIGHTGRAY)
volume_tips_rect = volume_tips.get_rect()
volume_tips_rect.x = 275
volume_tips_rect.y = 247
surface.blit(volume_tips, volume_tips_rect)
def draw(self, surface):
self.level.blit(self.background, self.viewport, self.viewport)
@ -1505,6 +1525,7 @@ class Level(tool.State):
surface.blit(self.return_button, self.return_button_rect)
surface.blit(self.restart_button, self.restart_button_rect)
surface.blit(self.mainMenu_button, self.mainMenu_button_rect)
self.showCurrentVolumeImage()
# 以后可能需要插入一个预备的状态(预览显示僵尸、返回战场)
elif self.state == c.PLAY:
if self.hasShovel:
@ -1537,6 +1558,9 @@ class Level(tool.State):
surface.blit(self.return_button, self.return_button_rect)
surface.blit(self.restart_button, self.restart_button_rect)
surface.blit(self.mainMenu_button, self.mainMenu_button_rect)
surface.blit(self.volume_minus_button, self.volume_minus_button_rect)
surface.blit(self.volume_plus_button, self.volume_plus_button_rect)
self.showCurrentVolumeImage(surface)
if self.map_data[c.SPAWN_ZOMBIES] == c.SPAWN_ZOMBIES_AUTO:
self.showLevelProgress(surface)

View File

@ -258,11 +258,10 @@ class Menu(tool.State):
surface.blit(self.volume_minus_button, self.volume_minus_button_rect)
self.showCurrentVolumeImage(surface)
if mouse_pos:
playButtonClickedSound = False
# 返回
if self.inArea(self.return_button_rect, *mouse_pos):
self.option_button_clicked = False
playButtonClickedSound = True
c.SOUND_BUTTON_CLICK.play()
# 音量+
elif self.inArea(self.volume_plus_button_rect, *mouse_pos):
self.game_info[c.VOLUME] = min(self.game_info[c.VOLUME] + 0.1, 1)
@ -270,7 +269,7 @@ class Menu(tool.State):
pg.mixer.music.set_volume(self.game_info[c.VOLUME])
for i in c.SOUNDS:
i.set_volume(self.game_info[c.VOLUME])
playButtonClickedSound = True
c.SOUND_BUTTON_CLICK.play()
# 音量-
elif self.inArea(self.volume_minus_button_rect, *mouse_pos):
self.game_info[c.VOLUME] = max(self.game_info[c.VOLUME] - 0.1, 0)
@ -278,8 +277,6 @@ class Menu(tool.State):
pg.mixer.music.set_volume(self.game_info[c.VOLUME])
for i in c.SOUNDS:
i.set_volume(self.game_info[c.VOLUME])
playButtonClickedSound = True
if playButtonClickedSound:
c.SOUND_BUTTON_CLICK.play()
# 没有点到前两者时常规行检测所有按钮的点击和高亮
else: