diff --git a/resources/sound/frozen.ogg b/resources/sound/freeze.ogg similarity index 100% rename from resources/sound/frozen.ogg rename to resources/sound/freeze.ogg diff --git a/resources/sound/shovel.ogg b/resources/sound/shovel.ogg new file mode 100644 index 0000000..de13c3b Binary files /dev/null and b/resources/sound/shovel.ogg differ diff --git a/source/component/plant.py b/source/component/plant.py index cc593e1..90a4110 100755 --- a/source/component/plant.py +++ b/source/component/plant.py @@ -30,6 +30,8 @@ class Car(pg.sprite.Sprite): def setWalk(self): if self.state == c.IDLE: self.state = c.WALK + # 播放音效 + pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "carWalking.ogg")) def draw(self, surface): surface.blit(self.image, self.rect) @@ -108,6 +110,12 @@ class Bullet(pg.sprite.Sprite): self.frames = self.explode_frames self.image = self.frames[self.frame_index] + # 播放子弹爆炸音效 + if self.name == c.BULLET_FIREBALL: + pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "firepea.ogg")) + else: + pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "bulletExplode.ogg")) + def draw(self, surface): surface.blit(self.image, self.rect) diff --git a/source/component/zombie.py b/source/component/zombie.py index f668536..85ea948 100755 --- a/source/component/zombie.py +++ b/source/component/zombie.py @@ -1,4 +1,5 @@ import pygame as pg +from random import randint from .. import tool from .. import constants as c @@ -221,8 +222,11 @@ class Zombie(pg.sprite.Sprite): if self.checkToDie(self.losthead_attack_frames): return - if (self.current_time - self.freeze_timer) > c.FREEZE_TIME: + if (self.current_time - self.freeze_timer) >= c.MIN_FREEZE_TIME + randint(0, 2000): self.setWalk() + # 注意寒冰菇解冻后还有减速 + self.ice_slow_timer = self.freeze_timer + 10000 # 每次冰冻冻结 + 减速时间为20 s,而减速有10 s计时,故这里+10 s + self.ice_slow_ratio = 2 def setLostHead(self): self.losthead_timer = self.current_time @@ -274,6 +278,9 @@ class Zombie(pg.sprite.Sprite): return self.ice_slow_ratio # 攻击速度只取决于冰冻状态 def setIceSlow(self): + # 在转入冰冻减速状态时播放冰冻音效 + pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "freeze.ogg")) + # when get a ice bullet damage, slow the attack or walk speed of the zombie self.ice_slow_timer = self.current_time self.ice_slow_ratio = 2 @@ -412,6 +419,9 @@ class Zombie(pg.sprite.Sprite): else: self.changeFrames(self.attack_frames) + # 播放啃咬音效 + pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "zombieAttack.ogg")) + def setDie(self): self.state = c.DIE self.animate_interval = self.die_animate_interval diff --git a/source/constants.py b/source/constants.py index bc0c619..b746c63 100755 --- a/source/constants.py +++ b/source/constants.py @@ -222,7 +222,7 @@ SUN_VALUE = 25 # 僵尸冷冻 ICE_SLOW_TIME = 10000 -FREEZE_TIME = 7500 +MIN_FREEZE_TIME = 4000 ICETRAP = 'IceTrap' # 植物卡片信息 diff --git a/source/state/level.py b/source/state/level.py index 2afad8f..9314563 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -193,6 +193,9 @@ class Level(tool.State): self.waveTime = current_time self.waveZombies = self.waves[self.waveNum - 1] self.numZombie = len(self.waveZombies) + # 第一波刚刚刷出来的时候播放音效 + if self.waveNum == 1: + pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "zombieComing.ogg")) return else: if ((current_time - self.waveTime >= 45000) or (self.bar_type != c.CHOOSEBAR_STATIC and current_time - self.waveTime >= 25000)): @@ -200,6 +203,8 @@ class Level(tool.State): self.waveTime = current_time self.waveZombies = self.waves[self.waveNum - 1] self.numZombie = len(self.waveZombies) + # 一大波时播放音效 + pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "hugeWaveApproching.ogg")) return elif ((current_time - self.waveTime >= 43000) or (self.bar_type != c.CHOOSEBAR_STATIC and current_time - self.waveTime >= 23000)): self.showHugeWaveApprochingTime = current_time @@ -216,7 +221,6 @@ class Level(tool.State): self.waveTime = current_time - 23000 # 即倒计时2000 ms - # 旧机制,目前仅用于调试 def setupZombies(self): def takeTime(element): @@ -587,6 +591,8 @@ class Level(tool.State): if sun.checkCollision(mouse_pos[0], mouse_pos[1]): self.menubar.increaseSunValue(sun.sun_value) clickedSun = True + # 播放收集阳光的音效 + pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "collectSun.ogg")) # 拖动植物或者铲子 if not self.drag_plant and mouse_pos and mouse_click[0] and not clickedSun: @@ -594,6 +600,8 @@ class Level(tool.State): if result: self.setupMouseImage(result[0], result[1]) clickedCardsOrMap = True + # 播放音效 + pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "clickCard.ogg")) elif self.drag_plant: if mouse_click[1]: self.removeMouseImage() @@ -618,6 +626,8 @@ class Level(tool.State): self.drag_shovel = not self.drag_shovel if not self.drag_shovel: self.removeMouseImagePlus() + # 播放点击铲子的音效 + pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "shovel.ogg")) elif self.drag_shovel: # 移出这地方的植物 self.shovelRemovePlant(mouse_pos) @@ -775,6 +785,9 @@ class Level(tool.State): self.map.addMapPlant(map_x, map_y, self.plant_name, sleep=mushroomSleep) self.removeMouseImage() + # 播放种植音效 + pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "plant.ogg")) + def setupHintImage(self): pos = self.canSeedPlant(self.plant_name) if pos and self.mouse_image: @@ -938,6 +951,9 @@ class Level(tool.State): zombie.setBoomDie() def freezeZombies(self, plant): + # 播放冻结音效 + pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "freeze.ogg")) + for i in range(self.map_y_len): for zombie in self.zombie_groups[i]: if zombie.rect.left <= c.SCREEN_WIDTH: @@ -979,6 +995,9 @@ class Level(tool.State): if ((abs(zombie.rect.centerx - x) <= plant.explode_y_range) or ((zombie.rect.right - (x-plant.explode_x_range) > 20) or (zombie.rect.right - (x-plant.explode_x_range))/zombie.rect.width > 0.2, ((x+plant.explode_x_range) - zombie.rect.left > 20) or ((x+plant.explode_x_range) - zombie.rect.left)/zombie.rect.width > 0.2)[zombie.rect.x > x]): # 这代码不太好懂,后面是一个判断僵尸在左还是在右,前面是一个元组,[0]是在左边的情况,[1]是在右边的情况 zombie.setDamage(1800, damageType=c.ZOMBIE_RANGE_DAMAGE) + else: + # 用铲子移除植物时播放音效 + pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "plant.ogg")) # 避免僵尸在用铲子移除植物后还在原位啃食 plant.health = 0 @@ -1111,9 +1130,13 @@ class Level(tool.State): self.game_info[c.LEVEL_NUM] += 1 self.next = c.GAME_VICTORY self.done = True + # 播放胜利音效 + pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "win.ogg")) elif self.checkLose(): self.next = c.GAME_LOSE self.done = True + # 播放失败音效 + pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "lose.ogg")) def drawMouseShow(self, surface): if self.hint_plant: