From 2862aa28b51fba1d4adb5422634c494b717251bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Mon, 1 Aug 2022 22:30:25 +0800 Subject: [PATCH 01/17] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=94=A8str=E4=BD=9Cke?= =?UTF-8?q?y=E5=AF=BC=E8=87=B4keyerror=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/menubar.py | 2 +- source/state/level.py | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/source/component/menubar.py b/source/component/menubar.py index 1f1b4b6..70e96c1 100755 --- a/source/component/menubar.py +++ b/source/component/menubar.py @@ -93,7 +93,7 @@ class Card(): image.blit(frozen_image, (0,0), (0, 0, self.rect.w, frozen_height)) image.blit(self.orig_image, (0,frozen_height), (0, frozen_height, self.rect.w, self.rect.h - frozen_height)) - elif self.sun_cost > sun_value: #disable status + if self.sun_cost > sun_value: #disable status image = self.orig_image.copy() image.set_alpha(192) elif self.clicked: diff --git a/source/state/level.py b/source/state/level.py index d383241..f1d2d06 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -102,7 +102,7 @@ class Level(tool.State): # 可以考虑将波刷新和一波中的僵尸生成分开 # useableZombie是指可用的僵尸种类的元组 # inevitableZombie指在本轮必然出现的僵尸,输入形式为字典: {波数1:(僵尸1, 僵尸2……), 波数2:(僵尸1, 僵尸2……)……} - def createWaves(self, useableZombies, numFlags, survivalRounds=0, inevitableZombieDict=None): + def createWaves(self, useableZombies, numFlags, survivalRounds=0, inevitable_zombie_dict=None): waves = [] @@ -130,10 +130,10 @@ class Level(tool.State): if (self.bar_type != c.CHOOSEBAR_STATIC): volume += 2 - if inevitableZombieDict and (wave in inevitableZombieDict): - for newZombie in inevitableZombieDict[str(wave)]: - zombieList.append(newZombie) - volume -= c.CREATE_ZOMBIE_DICT[newZombie][0] + if inevitable_zombie_dict and (wave in inevitable_zombie_dict): + for new_zombie in inevitable_zombie_dict[wave]: + zombieList.append(new_zombie) + volume -= c.CREATE_ZOMBIE_DICT[new_zombie][0] if volume < 0: logger.warning(f"第{wave}波中手动设置的僵尸级别总数超过上限!") @@ -141,23 +141,23 @@ class Level(tool.State): minCost = c.CREATE_ZOMBIE_DICT[min(useableZombies, key=lambda x:c.CREATE_ZOMBIE_DICT[x][0])][0] while (volume >= minCost) and (len(zombieList) < 50): - newZombie = random.choices(useableZombies, weights)[0] + new_zombie = random.choices(useableZombies, weights)[0] # 普通僵尸、路障僵尸、铁桶僵尸有概率生成水中变种 if self.background_type in c.POOL_EQUIPPED_BACKGROUNDS: # 有泳池第一轮的第四波设定上生成水生僵尸 if survivalRounds == 0 and wave == 4: - if newZombie in c.CONVERT_ZOMBIE_IN_POOL: - newZombie = c.CONVERT_ZOMBIE_IN_POOL[newZombie] + if new_zombie in c.CONVERT_ZOMBIE_IN_POOL: + new_zombie = c.CONVERT_ZOMBIE_IN_POOL[new_zombie] elif survivalRounds > 0 or wave > 4: if random.randint(1, 3) == 1: # 1/3概率水上,暂时人为设定 - if newZombie in c.CONVERT_ZOMBIE_IN_POOL: - newZombie = c.CONVERT_ZOMBIE_IN_POOL[newZombie] + if new_zombie in c.CONVERT_ZOMBIE_IN_POOL: + new_zombie = c.CONVERT_ZOMBIE_IN_POOL[new_zombie] # 首先几轮不出水生僵尸 - elif newZombie in c.WATER_ZOMBIE: + elif new_zombie in c.WATER_ZOMBIE: continue - if c.CREATE_ZOMBIE_DICT[newZombie][0] <= volume: - zombieList.append(newZombie) - volume -= c.CREATE_ZOMBIE_DICT[newZombie][0] + if c.CREATE_ZOMBIE_DICT[new_zombie][0] <= volume: + zombieList.append(new_zombie) + volume -= c.CREATE_ZOMBIE_DICT[new_zombie][0] waves.append(zombieList) # print(wave, zombieList, len(zombieList)) @@ -424,7 +424,7 @@ class Level(tool.State): self.createWaves( useableZombies=self.map_data[c.INCLUDED_ZOMBIES], numFlags=self.map_data[c.NUM_FLAGS], survivalRounds=0, - inevitableZombieDict=self.map_data[c.INEVITABLE_ZOMBIE_DICT]) + inevitable_zombie_dict=self.map_data[c.INEVITABLE_ZOMBIE_DICT]) else: self.createWaves( useableZombies=self.map_data[c.INCLUDED_ZOMBIES], numFlags=self.map_data[c.NUM_FLAGS], From 99deb7bbe8306fbeb486911e9a416cd76a20505c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Mon, 1 Aug 2022 22:34:58 +0800 Subject: [PATCH 02/17] =?UTF-8?q?=E6=A4=8D=E7=89=A9=E5=8D=A1=E7=89=87?= =?UTF-8?q?=E5=9C=A8=E5=86=B7=E5=8D=B4=E6=97=B6=E9=97=B4=E4=B8=8D=E8=B6=B3?= =?UTF-8?q?=E4=B8=94=E9=98=B3=E5=85=89=E4=B9=9F=E4=B8=8D=E8=B6=B3=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=8F=A0=E5=8A=A0=E4=B8=A4=E8=80=85=E6=95=88=E6=9E=9C?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=EF=BC=8C=E5=8D=B3=E5=90=8C=E6=97=B6=E6=94=B9?= =?UTF-8?q?=E5=8F=98=E9=80=8F=E6=98=8E=E5=BA=A6=E4=B8=8E=E5=9B=BE=E5=83=8F?= =?UTF-8?q?=E8=A6=86=E7=9B=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/menubar.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/component/menubar.py b/source/component/menubar.py index 70e96c1..19acedd 100755 --- a/source/component/menubar.py +++ b/source/component/menubar.py @@ -86,6 +86,9 @@ class Card(): time = current_time - self.frozen_timer if time < self.frozen_time: #cool down status image = pg.Surface([self.rect.w, self.rect.h]) + # 在冷却时间不足且阳光也不足时,叠加两者效果显示,即同时改变透明度与图像覆盖 + if self.sun_cost > sun_value: + image.set_alpha(192) frozen_image = self.orig_image.copy() frozen_image.set_alpha(128) frozen_height = (self.frozen_time - time)/self.frozen_time * self.rect.h @@ -93,7 +96,7 @@ class Card(): image.blit(frozen_image, (0,0), (0, 0, self.rect.w, frozen_height)) image.blit(self.orig_image, (0,frozen_height), (0, frozen_height, self.rect.w, self.rect.h - frozen_height)) - if self.sun_cost > sun_value: #disable status + elif self.sun_cost > sun_value: #disable status image = self.orig_image.copy() image.set_alpha(192) elif self.clicked: From 0f59007e82300fb72fd073a0e3c32a37399fafb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Mon, 1 Aug 2022 22:53:12 +0800 Subject: [PATCH 03/17] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B0=8F=E6=8E=A8?= =?UTF-8?q?=E8=BD=A6=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/state/level.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/state/level.py b/source/state/level.py index f1d2d06..71b9f8e 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -312,7 +312,7 @@ class Level(tool.State): self.cars = [] for i in range(self.map_y_len): y = self.map.getMapGridPos(0, i)[1] - self.cars.append(plant.Car(-40, y+20, i)) + self.cars.append(plant.Car(-45, y+20, i)) # 更新函数每帧被调用,将鼠标事件传入给状态处理函数 def update(self, surface, current_time, mouse_pos, mouse_click): @@ -1177,9 +1177,10 @@ class Level(tool.State): for i in range(len(self.cars)): if self.cars[i]: for zombie in self.zombie_groups[i]: - if zombie and zombie.state != c.DIE and (not zombie.losthead) and (zombie.rect.centerx <= 0): + if (zombie and zombie.state != c.DIE and (not zombie.losthead) + and (pg.sprite.collide_mask(zombie, self.cars[i]))): self.cars[i].setWalk() - if zombie.rect.centerx <= self.cars[i].rect.x: + if pg.sprite.collide_mask(zombie, self.cars[i]): zombie.health = 0 if self.cars[i].dead: self.cars[i] = None From 205ec949e173be299b6b99fdd3c6504ef387dc23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Mon, 1 Aug 2022 22:54:21 +0800 Subject: [PATCH 04/17] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E5=B0=8F=E6=8E=A8?= =?UTF-8?q?=E8=BD=A6=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/plant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/component/plant.py b/source/component/plant.py index 9481718..e05adef 100755 --- a/source/component/plant.py +++ b/source/component/plant.py @@ -22,7 +22,7 @@ class Car(pg.sprite.Sprite): def update(self, game_info): self.current_time = game_info[c.CURRENT_TIME] if self.state == c.WALK: - self.rect.x += 4 + self.rect.x += 6 if self.rect.x > c.SCREEN_WIDTH + 60: self.dead = True From 80021191ffbe076027a5d8c3076877bb7db386eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Mon, 1 Aug 2022 23:14:01 +0800 Subject: [PATCH 05/17] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E5=A4=A7=E5=98=B4?= =?UTF-8?q?=E8=8A=B1=E9=9F=B3=E6=95=88=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/plant.py | 7 +++++-- source/state/level.py | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/source/component/plant.py b/source/component/plant.py index e05adef..884518d 100755 --- a/source/component/plant.py +++ b/source/component/plant.py @@ -647,8 +647,11 @@ class Chomper(Plant): def attacking(self): if self.frame_index == (self.frame_num - 3): - # 播放吞的音效 - c.SOUND_BIGCHOMP.play() + # 播放吞的音效 由于一帧在这个循环中执行了若干次,可能被设置播放若干次导致声音重叠,所以用if保护 + if not self.should_diggest: + # 在尚未检测到需要消化时播放音效 + c.SOUND_BIGCHOMP.play() + # 对活着的僵尸才需要吞下去消化 if self.attack_zombie.alive(): self.should_diggest = True self.attack_zombie.kill() diff --git a/source/state/level.py b/source/state/level.py index 71b9f8e..c647e3a 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -366,7 +366,7 @@ class Level(tool.State): def choose(self, mouse_pos, mouse_click): # 如果暂停 if self.show_game_menu: - self.pauseAndCheckLittleMenuOptions(mouse_pos, mouse_click) + self.pauseAndCheckMenuOptions(mouse_pos, mouse_click) return elif mouse_pos and mouse_click[0]: @@ -544,7 +544,7 @@ class Level(tool.State): # 音量+、-应当处于同一高度 self.sound_volume_minus_button_rect.y = self.sound_volume_plus_button_rect.y = 250 - def pauseAndCheckLittleMenuOptions(self, mouse_pos, mouse_click): + def pauseAndCheckMenuOptions(self, mouse_pos, mouse_click): # 设置暂停状态 self.pause = True # 暂停播放音乐 @@ -660,7 +660,7 @@ class Level(tool.State): # 如果暂停 if self.show_game_menu: - self.pauseAndCheckLittleMenuOptions(mouse_pos, mouse_click) + self.pauseAndCheckMenuOptions(mouse_pos, mouse_click) return if self.map_data[c.SPAWN_ZOMBIES] == c.SPAWN_ZOMBIES_LIST: From 72cad4a3fd51856227d05497705ad90a630b068d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Mon, 1 Aug 2022 23:19:21 +0800 Subject: [PATCH 06/17] =?UTF-8?q?=E6=9A=82=E6=97=B6=E8=AE=BE=E5=AE=9A?= =?UTF-8?q?=E4=B8=BA=E5=A4=A7=E5=98=B4=E8=8A=B1=E6=B2=A1=E6=9C=89=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E6=94=BB=E5=87=BB=E6=97=B6=E4=B8=8D=E5=8F=91=E5=87=BA?= =?UTF-8?q?=E5=A3=B0=E9=9F=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/plant.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/component/plant.py b/source/component/plant.py index 884518d..ab665be 100755 --- a/source/component/plant.py +++ b/source/component/plant.py @@ -647,14 +647,14 @@ class Chomper(Plant): def attacking(self): if self.frame_index == (self.frame_num - 3): - # 播放吞的音效 由于一帧在这个循环中执行了若干次,可能被设置播放若干次导致声音重叠,所以用if保护 - if not self.should_diggest: - # 在尚未检测到需要消化时播放音效 - c.SOUND_BIGCHOMP.play() # 对活着的僵尸才需要吞下去消化 if self.attack_zombie.alive(): - self.should_diggest = True - self.attack_zombie.kill() + if not self.should_diggest: + # 播放吞的音效 由于一帧在这个循环中执行了若干次,可能被设置播放若干次导致声音重叠,所以用if保护 + # 在尚未检测到需要消化时播放音效 + c.SOUND_BIGCHOMP.play() + self.should_diggest = True + self.attack_zombie.kill() if (self.frame_index + 1) == self.frame_num: if self.should_diggest: self.setDigest() From 9fa8fbb8474d47bf986663869d9a85431f16ecac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Tue, 2 Aug 2022 12:52:46 +0800 Subject: [PATCH 07/17] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E5=9D=9A=E6=9E=9C?= =?UTF-8?q?=E4=BF=9D=E9=BE=84=E7=90=832?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../graphics/Cards/card_giantwallnut.png | Bin 0 -> 38203 bytes .../WallNut/GiantWallNut/GiantWallNut_0.png | Bin 0 -> 15758 bytes source/component/map.py | 33 +++++- source/component/plant.py | 65 ++++++----- source/component/zombie.py | 18 +-- source/constants.py | 16 ++- source/state/level.py | 106 +++++++++--------- 7 files changed, 145 insertions(+), 93 deletions(-) create mode 100644 resources/graphics/Cards/card_giantwallnut.png create mode 100644 resources/graphics/Plants/WallNut/GiantWallNut/GiantWallNut_0.png diff --git a/resources/graphics/Cards/card_giantwallnut.png b/resources/graphics/Cards/card_giantwallnut.png new file mode 100644 index 0000000000000000000000000000000000000000..ee80111c8f112fa1d33184b71ad4c82b7556e758 GIT binary patch literal 38203 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 Y3oJ>m3L5}~o&W#<07*qoM6N<$g0e&l$N&HU literal 0 HcmV?d00001 diff --git a/resources/graphics/Plants/WallNut/GiantWallNut/GiantWallNut_0.png b/resources/graphics/Plants/WallNut/GiantWallNut/GiantWallNut_0.png new file mode 100644 index 0000000000000000000000000000000000000000..878834739f89f6f8ff20219bbd08780baeafd1bc GIT binary patch literal 15758 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 c.SCREEN_WIDTH + 60: + if self.rect.x > c.SCREEN_WIDTH + 25: self.dead = True def setWalk(self): @@ -39,7 +39,7 @@ class Car(pg.sprite.Sprite): class Bullet(pg.sprite.Sprite): def __init__( self, x, start_y, dest_y, name, damage, effect=None, passed_torchwood_x=None, - damageType=c.ZOMBIE_DEAFULT_DAMAGE): + damage_type=c.ZOMBIE_DEAFULT_DAMAGE): pg.sprite.Sprite.__init__(self) self.name = name @@ -56,7 +56,7 @@ class Bullet(pg.sprite.Sprite): self.y_vel = 15 if (dest_y > start_y) else -15 self.x_vel = 10 self.damage = damage - self.damageType = damageType + self.damage_type = damage_type self.effect = effect self.state = c.FLY self.current_time = 0 @@ -82,14 +82,8 @@ class Bullet(pg.sprite.Sprite): self.explode_frames = [] fly_name = self.name - if self.name == c.BULLET_MUSHROOM: - explode_name = "BulletMushRoomExplode" - elif self.name == c.BULLET_PEA_ICE: - explode_name = "PeaIceExplode" - elif self.name == c.BULLET_SEASHROOM: - explode_name = "BulletSeaShroomExplode" - elif self.name == c.BULLET_STAR: - explode_name = "StarBulletExplode" + if self.name in c.BULLET_INDEPENDENT_BOOM_IMG: + explode_name = f"{self.name}Explode" else: explode_name = "PeaNormalExplode" @@ -184,8 +178,8 @@ class Fume(pg.sprite.Sprite): # 杨桃的子弹 class StarBullet(Bullet): - def __init__(self, x, start_y, damage, direction, level, damageType = c.ZOMBIE_DEAFULT_DAMAGE): # direction指星星飞行方向 - Bullet.__init__(self, x, start_y, start_y, c.BULLET_STAR, damage, damageType = damageType) + def __init__(self, x, start_y, damage, direction, level, damage_type = c.ZOMBIE_DEAFULT_DAMAGE): # direction指星星飞行方向 + Bullet.__init__(self, x, start_y, start_y, c.BULLET_STAR, damage, damage_type = damage_type) self.level = level self.map_y = self.level.map.getMapIndex(self.rect.x, self.rect.centery)[1] @@ -819,7 +813,7 @@ class Squash(Plant): if (self.frame_index + 1) == self.frame_num: for zombie in self.zombie_group: if self.canAttack(zombie): - zombie.setDamage(1800, damageType=c.ZOMBIE_RANGE_DAMAGE) + zombie.setDamage(1800, damage_type=c.ZOMBIE_RANGE_DAMAGE) self.health = 0 # 避免僵尸在原位啃食 self.map_plant_set.remove(c.SQUASH) self.kill() @@ -878,7 +872,7 @@ class Spikeweed(Plant): zombie.health = zombie.losthead_health killSelf = True else: - zombie.setDamage(20, damageType=c.ZOMBIE_COMMON_DAMAGE) + zombie.setDamage(20, damage_type=c.ZOMBIE_COMMON_DAMAGE) if killSelf: self.health = 0 # 播放攻击音效,同子弹打击 @@ -1161,7 +1155,7 @@ class WallNutBowling(Plant): self.handleMapYPosition() if self.shouldChangeDirection(): self.changeDirection(-1) - if self.init_rect.x > c.SCREEN_WIDTH + 60: + if self.init_rect.x > c.SCREEN_WIDTH + 25: self.health = 0 self.move_timer += self.move_interval @@ -1203,12 +1197,6 @@ class WallNutBowling(Plant): self.disable_hit_y = map_y def animation(self): - if (self.current_time - self.animate_timer) > self.animate_interval: - self.frame_index += 1 - if self.frame_index >= self.frame_num: - self.frame_index = 0 - self.animate_timer = self.current_time - image = self.frames[self.frame_index] self.image = pg.transform.rotate(image, self.rotate_degree) self.mask = pg.mask.from_surface(self.image) @@ -1249,7 +1237,7 @@ class RedWallNutBowling(Plant): elif (self.current_time - self.move_timer) >= self.move_interval: self.rotate_degree = (self.rotate_degree - 30) % 360 self.init_rect.x += self.vel_x - if self.init_rect.x > c.SCREEN_WIDTH + 60: + if self.init_rect.x > c.SCREEN_WIDTH + 25: self.health = 0 self.move_timer += self.move_interval @@ -1336,7 +1324,7 @@ class StarFruit(Plant): self.shoot_timer = self.current_time - 700 elif (self.current_time - self.shoot_timer) >= 1400: # 向后打的杨桃子弹无视铁门与报纸防具 - self.bullet_group.add(StarBullet(self.rect.left - 10, self.rect.y + 15, c.BULLET_DAMAGE_NORMAL, c.STAR_BACKWARD, self.level, damageType = c.ZOMBIE_COMMON_DAMAGE)) + self.bullet_group.add(StarBullet(self.rect.left - 10, self.rect.y + 15, c.BULLET_DAMAGE_NORMAL, c.STAR_BACKWARD, self.level, damage_type = c.ZOMBIE_COMMON_DAMAGE)) # 其他方向的杨桃子弹伤害效果与豌豆等同 self.bullet_group.add(StarBullet(self.rect.centerx - 20, self.rect.bottom - self.rect.h - 15, c.BULLET_DAMAGE_NORMAL, c.STAR_UPWARD, self.level)) self.bullet_group.add(StarBullet(self.rect.centerx - 20, self.rect.bottom - 5, c.BULLET_DAMAGE_NORMAL, c.STAR_DOWNWARD, self.level)) @@ -1740,7 +1728,7 @@ class FumeShroom(Plant): # 烟雾只是个动画,实际伤害由本身完成 for target_zombie in self.zombie_group: if self.canAttack(target_zombie): - target_zombie.setDamage(c.BULLET_DAMAGE_NORMAL, damageType=c.ZOMBIE_RANGE_DAMAGE) + target_zombie.setDamage(c.BULLET_DAMAGE_NORMAL, damage_type=c.ZOMBIE_RANGE_DAMAGE) self.shoot_timer = self.current_time self.show_attack_frames = True # 播放发射音效 @@ -1829,3 +1817,30 @@ class PumpkinHead(Plant): elif not self.cracked2 and self.health <= c.WALLNUT_CRACKED2_HEALTH: self.changeFrames(self.cracked2_frames) self.cracked2 = True + +class GiantWallNut(Plant): + def __init__(self, x, y): + Plant.__init__(self, x, y, c.GIANTWALLNUT, 1, None) + self.init_rect = self.rect.copy() + self.rotate_degree = 0 + self.animate_interval = 200 + self.move_timer = 0 + self.move_interval = 70 + self.vel_x = random.randint(12, 15) + + def idling(self): + if self.move_timer == 0: + self.move_timer = self.current_time + elif (self.current_time - self.move_timer) >= self.move_interval: + self.rotate_degree = (self.rotate_degree - 30) % 360 + self.init_rect.x += self.vel_x + if self.init_rect.x > c.SCREEN_WIDTH: + self.health = 0 + self.move_timer += self.move_interval + + def animation(self): + image = self.frames[self.frame_index] + self.image = pg.transform.rotate(image, self.rotate_degree) + self.mask = pg.mask.from_surface(self.image) + # must keep the center postion of image when rotate + self.rect = self.image.get_rect(center=self.init_rect.center) diff --git a/source/component/zombie.py b/source/component/zombie.py index 07c816e..7513812 100755 --- a/source/component/zombie.py +++ b/source/component/zombie.py @@ -346,23 +346,23 @@ class Zombie(pg.sprite.Sprite): if (self.current_time - self.ice_slow_timer) > c.ICE_SLOW_TIME: self.ice_slow_ratio = 1 - def setDamage(self, damage, effect=None, damageType=c.ZOMBIE_COMMON_DAMAGE): + def setDamage(self, damage, effect=None, damage_type=c.ZOMBIE_COMMON_DAMAGE): # 冰冻减速效果 if effect == c.BULLET_EFFECT_ICE: - if damageType == c.ZOMBIE_DEAFULT_DAMAGE: # 寒冰射手不能穿透二类防具进行减速 + if damage_type == c.ZOMBIE_DEAFULT_DAMAGE: # 寒冰射手不能穿透二类防具进行减速 if not self.helmet_type2: self.setIceSlow() else: self.setIceSlow() # 解冻 elif effect == c.BULLET_EFFECT_UNICE: - if damageType == c.ZOMBIE_DEAFULT_DAMAGE: # 寒冰射手不能穿透二类防具进行减速 + if damage_type == c.ZOMBIE_DEAFULT_DAMAGE: # 寒冰射手不能穿透二类防具进行减速 if not self.helmet_type2: self.ice_slow_ratio = 1 else: self.ice_slow_ratio = 1 - if damageType == c.ZOMBIE_DEAFULT_DAMAGE: # 不穿透二类防具的攻击 + if damage_type == c.ZOMBIE_DEAFULT_DAMAGE: # 不穿透二类防具的攻击 # 从第二类防具开始逐级传递 if self.helmet_type2: self.helmet_type2_health -= damage @@ -383,7 +383,7 @@ class Zombie(pg.sprite.Sprite): self.helmet_health = 0 # 注意合并后清零 else: # 没有防具 self.health -= damage - elif damageType == c.ZOMBIE_COMMON_DAMAGE: # 无视二类防具,将攻击一类防具与本体视为整体的攻击 + elif damage_type == c.ZOMBIE_COMMON_DAMAGE: # 无视二类防具,将攻击一类防具与本体视为整体的攻击 if self.helmet: # 存在一类防具 self.helmet_health -= damage if self.helmet_health <= 0: @@ -391,7 +391,7 @@ class Zombie(pg.sprite.Sprite): self.helmet_health = 0 # 注意合并后清零 else: # 没有一类防具 self.health -= damage - elif damageType == c.ZOMBIE_RANGE_DAMAGE: + elif damage_type == c.ZOMBIE_RANGE_DAMAGE: # 从第二类防具开始逐级传递 if self.helmet_type2: self.helmet_type2_health -= damage @@ -422,9 +422,9 @@ class Zombie(pg.sprite.Sprite): self.helmet_health = 0 # 注意合并后清零 else: # 没有防具 self.health -= damage - elif damageType == c.ZOMBIE_ASH_DAMAGE: + elif damage_type == c.ZOMBIE_ASH_DAMAGE: self.health -= damage # 无视任何防具 - elif damageType == c.ZOMBIE_WALLNUT_BOWLING_DANMAGE: + elif damage_type == c.ZOMBIE_WALLNUT_BOWLING_DANMAGE: # 逻辑:对防具的多余伤害不传递 if self.helmet_type2: # 对二类防具伤害较一般情况低,拟合铁门需要砸3次的设定 @@ -435,7 +435,7 @@ class Zombie(pg.sprite.Sprite): self.health -= damage else: print("警告:植物攻击类型错误,现在默认进行类豌豆射手型攻击") - self.setDamage(damage, effect=effect, damageType=c.ZOMBIE_DEAFULT_DAMAGE) + self.setDamage(damage, effect=effect, damage_type=c.ZOMBIE_DEAFULT_DAMAGE) # 记录攻击时间 self.hit_timer = self.current_time diff --git a/source/constants.py b/source/constants.py index dc38fc5..5cad5da 100755 --- a/source/constants.py +++ b/source/constants.py @@ -359,7 +359,7 @@ PLANT_CARD_INFO = (# 元组 (植物名称, 卡片名称, 阳光, 冷却时间) CARD_GARLIC := "card_garlic", 50, 7500), - # 应当保证这两个在一般模式下不可选的特殊植物恒在最后 + # 应当保证这3个在一般模式下不可选的特殊植物恒在最后 (WALLNUTBOWLING := "WallNutBowling", CARD_WALLNUT := "card_wallnut", 0, @@ -368,6 +368,10 @@ PLANT_CARD_INFO = (# 元组 (植物名称, 卡片名称, 阳光, 冷却时间) CARD_REDWALLNUT := "card_redwallnut", 0, 0), + (GIANTWALLNUT := "GiantWallNut", + CARD_GIANTWALLNUT := "card_giantwallnut", + 0, + 0), ) # 卡片中的植物名称与索引序号的对应关系,指定名称以得到索引值 @@ -376,7 +380,7 @@ for i, item in enumerate(PLANT_CARD_INFO): PLANT_CARD_INDEX[item[PLANT_NAME_INDEX]] = i # 指定了哪些卡可选(排除坚果保龄球特殊植物) -CARDS_TO_CHOOSE = range(len(PLANT_CARD_INFO) - 2) +CARDS_TO_CHOOSE = range(len(PLANT_CARD_INFO) - 3) # 植物集体属性集合 @@ -408,6 +412,7 @@ PLANT_DIE_SOUND_EXCEPTIONS = { ICEFROZENPLOT, HOLE, GRAVE, JALAPENO, REDWALLNUTBOWLING, CHERRYBOMB, + GIANTWALLNUT, } # 直接水生植物 @@ -426,7 +431,7 @@ PLANT_NON_CHECK_ATTACK_STATE = ( # 这里运用了集合运算 SUNSHROOM, COFFEEBEAN, GRAVEBUSTER, LILYPAD, HYPNOSHROOM, GARLIC, - PUMPKINHEAD, + PUMPKINHEAD, GIANTWALLNUT, } | # 非植物类 NON_PLANT_OBJECTS @@ -492,6 +497,11 @@ STAR_BACKWARD = "backward" #向后 STAR_UPWARD = "upward" # 向上 STAR_DOWNWARD = "downward" # 向下 +# 有爆炸图片的子弹 +BULLET_INDEPENDENT_BOOM_IMG = { BULLET_PEA, BULLET_PEA_ICE, + BULLET_MUSHROOM, BULLET_SEASHROOM, + BULLET_STAR, } + # 僵尸信息 ZOMBIE_IMAGE_RECT = "zombie_image_rect" ZOMBIE_HEAD = "ZombieHead" diff --git a/source/state/level.py b/source/state/level.py index c647e3a..91c4647 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -102,28 +102,28 @@ class Level(tool.State): # 可以考虑将波刷新和一波中的僵尸生成分开 # useableZombie是指可用的僵尸种类的元组 # inevitableZombie指在本轮必然出现的僵尸,输入形式为字典: {波数1:(僵尸1, 僵尸2……), 波数2:(僵尸1, 僵尸2……)……} - def createWaves(self, useableZombies, numFlags, survivalRounds=0, inevitable_zombie_dict=None): + def createWaves(self, useable_zombies, num_flags, survival_rounds=0, inevitable_zombie_dict=None): waves = [] - self.numFlags = numFlags + self.num_flags = num_flags # 权重值 weights = [] - for zombie in useableZombies: + for zombie in useable_zombies: weights.append(c.CREATE_ZOMBIE_DICT[zombie][1]) # 按照原版pvz设计的僵尸容量函数,是从无尽解析的,但是普通关卡也可以遵循 - for wave in range(1, 10 * numFlags + 1): - volume = int(int((wave + survivalRounds*20)*0.8)/2) + 1 - zombieList = [] + for wave in range(1, 10 * num_flags + 1): + volume = int(int((wave + survival_rounds*20)*0.8)/2) + 1 + zombie_list = [] # 大波僵尸情况 if wave % 10 == 0: # 容量增大至2.5倍 volume = int(volume*2.5) # 先生成旗帜僵尸 - zombieList.append(c.FLAG_ZOMBIE) + zombie_list.append(c.FLAG_ZOMBIE) volume -= c.CREATE_ZOMBIE_DICT[c.FLAG_ZOMBIE][0] # 传送带模式应当增大僵尸容量 @@ -132,23 +132,23 @@ class Level(tool.State): if inevitable_zombie_dict and (wave in inevitable_zombie_dict): for new_zombie in inevitable_zombie_dict[wave]: - zombieList.append(new_zombie) + zombie_list.append(new_zombie) volume -= c.CREATE_ZOMBIE_DICT[new_zombie][0] if volume < 0: logger.warning(f"第{wave}波中手动设置的僵尸级别总数超过上限!") # 防止因为僵尸最小等级过大,使得总容量无法完全利用,造成死循环的检查机制 - minCost = c.CREATE_ZOMBIE_DICT[min(useableZombies, key=lambda x:c.CREATE_ZOMBIE_DICT[x][0])][0] + min_cost = c.CREATE_ZOMBIE_DICT[min(useable_zombies, key=lambda x:c.CREATE_ZOMBIE_DICT[x][0])][0] - while (volume >= minCost) and (len(zombieList) < 50): - new_zombie = random.choices(useableZombies, weights)[0] + while (volume >= min_cost) and (len(zombie_list) < 50): + new_zombie = random.choices(useable_zombies, weights)[0] # 普通僵尸、路障僵尸、铁桶僵尸有概率生成水中变种 if self.background_type in c.POOL_EQUIPPED_BACKGROUNDS: # 有泳池第一轮的第四波设定上生成水生僵尸 - if survivalRounds == 0 and wave == 4: + if survival_rounds == 0 and wave == 4: if new_zombie in c.CONVERT_ZOMBIE_IN_POOL: new_zombie = c.CONVERT_ZOMBIE_IN_POOL[new_zombie] - elif survivalRounds > 0 or wave > 4: + elif survival_rounds > 0 or wave > 4: if random.randint(1, 3) == 1: # 1/3概率水上,暂时人为设定 if new_zombie in c.CONVERT_ZOMBIE_IN_POOL: new_zombie = c.CONVERT_ZOMBIE_IN_POOL[new_zombie] @@ -156,22 +156,22 @@ class Level(tool.State): elif new_zombie in c.WATER_ZOMBIE: continue if c.CREATE_ZOMBIE_DICT[new_zombie][0] <= volume: - zombieList.append(new_zombie) + zombie_list.append(new_zombie) volume -= c.CREATE_ZOMBIE_DICT[new_zombie][0] - waves.append(zombieList) - # print(wave, zombieList, len(zombieList)) + waves.append(zombie_list) + # print(wave, zombie_list, len(zombie_list)) self.waves = waves # 针对有泳池的关卡 # 表示尚未生成最后一波中从水里冒出来的僵尸 - self.createdZombieFromPool = False + self.created_zombie_from_pool = False # 僵尸的刷新机制 - def refreshWaves(self, current_time, survivalRounds=0): + def refreshWaves(self, current_time, survival_rounds=0): # 最后一波或者大于最后一波 - # 如果在夜晚按需从墓碑生成僵尸 + # 如果在夜晚按需从墓碑生成僵尸 有泳池时从水中生成僵尸 # 否则直接return if self.wave_num >= self.map_data[c.NUM_FLAGS] * 10: if self.map_data[c.BACKGROUND_TYPE] == c.BACKGROUND_NIGHT: @@ -227,7 +227,7 @@ class Level(tool.State): self.zombie_groups[item[1]].add(zombie.ConeHeadZombie(item_x, item_y, self.head_group)) self.grave_zombie_created = True elif self.map_data[c.BACKGROUND_TYPE] in c.POOL_EQUIPPED_BACKGROUNDS: - if not self.createdZombieFromPool: + if not self.created_zombie_from_pool: if current_time - self.wave_time > 1500: for i in range(3): # 水中倒数四列内可以在此时产生僵尸。共产生3个 @@ -235,14 +235,14 @@ class Level(tool.State): item_x, item_y = self.map.getMapGridPos(map_x, map_y) # 用随机数指定产生的僵尸类型 # 暂时设定为生成概率相同 - zombieType = random.randint(1, 3) - if zombieType == 1: + zombie_type = random.randint(1, 3) + if zombie_type == 1: self.zombie_groups[map_y].add(zombie.BucketHeadDuckyTubeZombie(item_x, item_y, self.head_group)) - elif zombieType == 2: + elif zombie_type == 2: self.zombie_groups[map_y].add(zombie.ConeHeadDuckyTubeZombie(item_x, item_y, self.head_group)) else: self.zombie_groups[map_y].add(zombie.DuckyTubeZombie(item_x, item_y, self.head_group)) - self.createdZombieFromPool = True + self.created_zombie_from_pool = True return # 还未开始出现僵尸 @@ -250,7 +250,7 @@ class Level(tool.State): if (self.wave_time == 0): # 表明刚刚开始游戏 self.wave_time = current_time else: - if (survivalRounds == 0) and (self.bar_type == c.CHOOSEBAR_STATIC): # 首次选卡等待时间较长 + if (survival_rounds == 0) and (self.bar_type == c.CHOOSEBAR_STATIC): # 首次选卡等待时间较长 if current_time - self.wave_time >= 18000: self.wave_num += 1 self.wave_time = current_time @@ -404,6 +404,7 @@ class Level(tool.State): if self.background_type in c.DAYTIME_BACKGROUNDS and self.bar_type == c.CHOOSEBAR_STATIC: self.produce_sun = True + self.fallen_sun = 0 # 已掉落的阳光 else: self.produce_sun = False self.sun_timer = self.current_time @@ -419,16 +420,16 @@ class Level(tool.State): self.wave_zombies = [] self.zombie_num = 0 - # 暂时没有生存模式,所以 survivalRounds = 0 + # 暂时没有生存模式,所以 survival_rounds = 0 if c.INEVITABLE_ZOMBIE_DICT in self.map_data: - self.createWaves( useableZombies=self.map_data[c.INCLUDED_ZOMBIES], - numFlags=self.map_data[c.NUM_FLAGS], - survivalRounds=0, + self.createWaves( useable_zombies=self.map_data[c.INCLUDED_ZOMBIES], + num_flags=self.map_data[c.NUM_FLAGS], + survival_rounds=0, inevitable_zombie_dict=self.map_data[c.INEVITABLE_ZOMBIE_DICT]) else: - self.createWaves( useableZombies=self.map_data[c.INCLUDED_ZOMBIES], - numFlags=self.map_data[c.NUM_FLAGS], - survivalRounds=0) + self.createWaves( useable_zombies=self.map_data[c.INCLUDED_ZOMBIES], + num_flags=self.map_data[c.NUM_FLAGS], + survival_rounds=0) self.setupCars() # 地图有铲子才添加铲子 @@ -458,9 +459,9 @@ class Level(tool.State): else: grade_graves = 1 - graveVolume = c.GRAVES_GRADE_INFO[grade_graves] + grave_volume = c.GRAVES_GRADE_INFO[grade_graves] self.grave_set = set() - while len(self.grave_set) < graveVolume: + while len(self.grave_set) < grave_volume: map_x = random.randint(4, 8) # 注意是从0开始编号 map_y = random.randint(0, 4) self.grave_set.add((map_x, map_y)) @@ -654,10 +655,6 @@ class Level(tool.State): return def play(self, mouse_pos, mouse_click): - # 原版阳光掉落机制需要 - # 已掉落的阳光 - self.fallen_sun = 0 - # 如果暂停 if self.show_game_menu: self.pauseAndCheckMenuOptions(mouse_pos, mouse_click) @@ -703,14 +700,13 @@ class Level(tool.State): x, y = self.map.getMapGridPos(map_x, map_y) self.sun_group.add(plant.Sun(x, 0, x, y)) self.fallen_sun += 1 - - # wcb 添加 + # 检查有没有捡到阳光 clicked_sun = False clicked_cards_or_map = False if not self.drag_plant and not self.drag_shovel and mouse_pos and mouse_click[0]: for sun in self.sun_group: - if sun.checkCollision(mouse_pos[0], mouse_pos[1]): + if sun.checkCollision(*mouse_pos): self.menubar.increaseSunValue(sun.sun_value) clicked_sun = True # 播放收集阳光的音效 @@ -767,7 +763,7 @@ class Level(tool.State): self.menubar.update(self.current_time) - # 检查碰撞啥的 + # 检查碰撞 self.checkBulletCollisions() self.checkZombieCollisions() self.checkPlants() @@ -925,6 +921,8 @@ class Level(tool.State): new_plant = plant.Garlic(x, y) elif self.plant_name == c.PUMPKINHEAD: new_plant = plant.PumpkinHead(x, y) + elif self.plant_name == c.GIANTWALLNUT: + new_plant = plant.GiantWallNut(x, y) if new_plant.can_sleep and self.background_type in c.DAYTIME_BACKGROUNDS: @@ -1016,13 +1014,13 @@ class Level(tool.State): continue if collided_func(zombie, bullet): if zombie.state != c.DIE: - zombie.setDamage(bullet.damage, effect=bullet.effect, damageType=bullet.damageType) + zombie.setDamage(bullet.damage, effect=bullet.effect, damage_type=bullet.damage_type) bullet.setExplode() # 火球有溅射伤害 if bullet.name == c.BULLET_FIREBALL: for rangeZombie in self.zombie_groups[i]: if abs(rangeZombie.rect.x - bullet.rect.x) <= (c.GRID_X_SIZE // 2): - rangeZombie.setDamage(c.BULLET_DAMAGE_FIREBALL_RANGE, effect=None, damageType=c.ZOMBIE_DEAFULT_DAMAGE) + rangeZombie.setDamage(c.BULLET_DAMAGE_FIREBALL_RANGE, effect=None, damage_type=c.ZOMBIE_DEAFULT_DAMAGE) break @@ -1105,7 +1103,9 @@ class Level(tool.State): zombie.prey_map_x, zombie.prey_map_y = self.map.getMapIndex(target_plant.rect.centerx, target_plant.rect.centery) # 撑杆跳的特殊情况 if zombie.name in {c.POLE_VAULTING_ZOMBIE} and (not zombie.jumped): - if not zombie.jumping: + if target_plant.name == c.GIANTWALLNUT: + zombie.health = 0 + elif not zombie.jumping: zombie.jump_map_x, zombie.jump_map_y = min(c.GRID_X_LEN - 1, zombie.prey_map_x), min(self.map_y_len - 1, zombie.prey_map_y) jump_x = target_plant.rect.x - c.GRID_X_SIZE * 0.6 if c.TALLNUT in self.map.map[zombie.jump_map_y][zombie.jump_map_x][c.MAP_PLANT]: @@ -1123,15 +1123,17 @@ class Level(tool.State): if target_plant.canHit(i): # target_plant.vel_y不为0,有纵向速度,表明已经发生过碰撞,对铁门秒杀(这里实现为忽略二类防具攻击) if target_plant.vel_y and zombie.name == c.SCREEN_DOOR_ZOMBIE: - zombie.setDamage(c.WALLNUT_BOWLING_DAMAGE, damageType=c.ZOMBIE_COMMON_DAMAGE) + zombie.setDamage(c.WALLNUT_BOWLING_DAMAGE, damage_type=c.ZOMBIE_COMMON_DAMAGE) else: - zombie.setDamage(c.WALLNUT_BOWLING_DAMAGE, damageType=c.ZOMBIE_WALLNUT_BOWLING_DANMAGE) + zombie.setDamage(c.WALLNUT_BOWLING_DAMAGE, damage_type=c.ZOMBIE_WALLNUT_BOWLING_DANMAGE) target_plant.changeDirection(i) # 播放撞击音效 c.SOUND_BOWLING_IMPACT.play() elif target_plant.name == c.REDWALLNUTBOWLING: if target_plant.state == c.IDLE: target_plant.setAttack() + elif target_plant.name == c.GIANTWALLNUT: + zombie.health = 0 elif zombie.target_y_change: # 大蒜作用正在生效的僵尸不进行传递 continue @@ -1194,7 +1196,7 @@ class Level(tool.State): ((zombie.rect.right - (x-x_range) > 20) or (zombie.rect.right - (x-x_range))/zombie.rect.width > 0.2, ((x+x_range) - zombie.rect.left > 20) or ((x+x_range) - zombie.rect.left)/zombie.rect.width > 0.2)[zombie.rect.x > x]): # 这代码不太好懂,后面是一个判断僵尸在左还是在右,前面是一个元组,[0]是在左边的情况,[1]是在右边的情况 if effect == c.BULLET_EFFECT_UNICE: zombie.ice_slow_ratio = 1 - zombie.setDamage(1800, damageType=c.ZOMBIE_ASH_DAMAGE) + zombie.setDamage(1800, damage_type=c.ZOMBIE_ASH_DAMAGE) if zombie.health <= 0: zombie.setBoomDie() @@ -1205,7 +1207,7 @@ class Level(tool.State): for i in range(self.map_y_len): for zombie in self.zombie_groups[i]: zombie.setFreeze(plant.trap_frames[0]) - zombie.setDamage(20, damageType=c.ZOMBIE_RANGE_DAMAGE) # 寒冰菇还有全场20的伤害 + zombie.setDamage(20, damage_type=c.ZOMBIE_RANGE_DAMAGE) # 寒冰菇还有全场20的伤害 def killPlant(self, target_plant, shovel=False): x, y = target_plant.getPosition() @@ -1284,7 +1286,7 @@ class Level(tool.State): # 双判断:发生碰撞或在攻击范围内 if ((pg.sprite.collide_mask(zombie, target_plant)) or (abs(zombie.rect.centerx - target_plant.rect.centerx) <= target_plant.explode_x_range)): - zombie.setDamage(1800, damageType=c.ZOMBIE_RANGE_DAMAGE) + zombie.setDamage(1800, damage_type=c.ZOMBIE_RANGE_DAMAGE) target_plant.boomed = True elif target_plant.name == c.SQUASH: for zombie in self.zombie_groups[i]: @@ -1494,8 +1496,8 @@ class Level(tool.State): pg.draw.rect(surface, c.YELLOWGREEN, filledBarRect) # 画旗帜 - for i in range(self.numFlags): - self.level_progress_flag_rect.x = self.level_progress_bar_image_rect.x + int((150*i)/self.numFlags) + 5 # 常数是猜的 + for i in range(self.num_flags): + self.level_progress_flag_rect.x = self.level_progress_bar_image_rect.x + int((150*i)/self.num_flags) + 5 # 常数是猜的 # 当指示进度的僵尸头在旗帜左侧时升高旗帜 if self.level_progress_flag_rect.x - 7 >= self.level_progress_zombie_head_image_rect.x: self.level_progress_flag_rect.y = self.level_progress_bar_image_rect.y - 15 # 常数是猜的 From ce62e9b35c68d7d47b97f3e32f1c76b9eb7a4fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Tue, 2 Aug 2022 13:35:25 +0800 Subject: [PATCH 08/17] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=B0=8F=E6=8E=A8?= =?UTF-8?q?=E8=BD=A6=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/plant.py | 2 +- source/state/level.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/source/component/plant.py b/source/component/plant.py index 4ce1e5f..e6e8dd0 100755 --- a/source/component/plant.py +++ b/source/component/plant.py @@ -22,7 +22,7 @@ class Car(pg.sprite.Sprite): def update(self, game_info): self.current_time = game_info[c.CURRENT_TIME] if self.state == c.WALK: - self.rect.x += 6 + self.rect.x += 5 if self.rect.x > c.SCREEN_WIDTH + 25: self.dead = True diff --git a/source/state/level.py b/source/state/level.py index 91c4647..84b31ee 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -1182,7 +1182,8 @@ class Level(tool.State): if (zombie and zombie.state != c.DIE and (not zombie.losthead) and (pg.sprite.collide_mask(zombie, self.cars[i]))): self.cars[i].setWalk() - if pg.sprite.collide_mask(zombie, self.cars[i]): + if (pg.sprite.collide_mask(zombie, self.cars[i]) or + self.cars[i].rect.x <= zombie.rect.centerx <= self.cars[i].rect.right): zombie.health = 0 if self.cars[i].dead: self.cars[i] = None From 8cd22a114038da4a17be44ac7c2f929e4f9be3d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Tue, 2 Aug 2022 14:49:27 +0800 Subject: [PATCH 09/17] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8D=97=E7=93=9C?= =?UTF-8?q?=E5=A4=B4bug=E2=80=9C=E5=AE=89=E5=80=8D=E6=99=8B=E4=B8=89?= =?UTF-8?q?=E7=9A=84=E4=BF=9D=E9=95=96=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/state/level.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/source/state/level.py b/source/state/level.py index 84b31ee..9914f52 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -1076,11 +1076,19 @@ class Level(tool.State): # 在生效状态下忽略啃食碰撞但其他状况下不能忽略的情形 elif plant.name in c.SKIP_ZOMBIE_COLLISION_CHECK_WHEN_WORKING: if not plant.start_boom: - attackable_common_plants.append(plant) + attackable_common_plants.append(plant) else: if attackable_common_plants: # 默认为最右侧的一个植物 target_plant = max(attackable_common_plants, key=lambda i: i.rect.x) + map_x, map_y = self.map.getMapIndex(target_plant.rect.centerx, target_plant.rect.centery) + if c.PUMPKINHEAD in self.map.map[map_y][map_x][c.MAP_PLANT]: + for actual_target_plant in self.plant_groups[i]: + # 检测同一格的其他植物 + if self.map.getMapIndex(actual_target_plant.rect.centerx, actual_target_plant.rect.bottom) == (map_x, map_y): + if actual_target_plant.name == c.PUMPKINHEAD: + target_plant = actual_target_plant + break elif attackable_backup_plants: target_plant = max(attackable_backup_plants, key=lambda i: i.rect.x) map_x, map_y = self.map.getMapIndex(target_plant.rect.centerx, target_plant.rect.centery) From 7240c61765024bb820bbdbe115ede5c94f9a0a36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Tue, 2 Aug 2022 18:19:35 +0800 Subject: [PATCH 10/17] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9D=9A=E6=9E=9C?= =?UTF-8?q?=E4=BF=9D=E9=BE=84=E7=90=83=E9=97=AA=E9=80=80bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WallNut/GiantWallNut/GiantWallNut_0.png | Bin 15758 -> 18767 bytes source/component/plant.py | 3 ++- source/state/level.py | 17 ++++++++++------- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/resources/graphics/Plants/WallNut/GiantWallNut/GiantWallNut_0.png b/resources/graphics/Plants/WallNut/GiantWallNut/GiantWallNut_0.png index 878834739f89f6f8ff20219bbd08780baeafd1bc..23e13debe049b5bb0d004ba19b3df557a6508745 100644 GIT binary patch literal 18767 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 self.map.width or map_y >= self.map.height): + if c.PUMPKINHEAD in self.map.map[map_y][map_x][c.MAP_PLANT]: + for actual_target_plant in self.plant_groups[i]: + # 检测同一格的其他植物 + if self.map.getMapIndex(actual_target_plant.rect.centerx, actual_target_plant.rect.bottom) == (map_x, map_y): + if actual_target_plant.name == c.PUMPKINHEAD: + target_plant = actual_target_plant + break elif attackable_backup_plants: target_plant = max(attackable_backup_plants, key=lambda i: i.rect.x) map_x, map_y = self.map.getMapIndex(target_plant.rect.centerx, target_plant.rect.centery) @@ -1113,6 +1114,7 @@ class Level(tool.State): if zombie.name in {c.POLE_VAULTING_ZOMBIE} and (not zombie.jumped): if target_plant.name == c.GIANTWALLNUT: zombie.health = 0 + c.SOUND_BOWLING_IMPACT.play() elif not zombie.jumping: zombie.jump_map_x, zombie.jump_map_y = min(c.GRID_X_LEN - 1, zombie.prey_map_x), min(self.map_y_len - 1, zombie.prey_map_y) jump_x = target_plant.rect.x - c.GRID_X_SIZE * 0.6 @@ -1142,6 +1144,7 @@ class Level(tool.State): target_plant.setAttack() elif target_plant.name == c.GIANTWALLNUT: zombie.health = 0 + c.SOUND_BOWLING_IMPACT.play() elif zombie.target_y_change: # 大蒜作用正在生效的僵尸不进行传递 continue From fde1661ec5d3d72e82c8e6d90553614cff3b7b32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Tue, 2 Aug 2022 19:06:01 +0800 Subject: [PATCH 11/17] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/map.py | 28 +++++++++++++++++++++++----- source/constants.py | 1 + source/state/level.py | 8 +++++--- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/source/component/map.py b/source/component/map.py index 03bb455..6a610af 100755 --- a/source/component/map.py +++ b/source/component/map.py @@ -179,6 +179,7 @@ LEVEL_MAP_DATA = ( # 第0关:测试模式地图 { c.BACKGROUND_TYPE: 2, + c.GAME_TITLE: "隐藏测试关卡", c.INIT_SUN_NAME: 5000, c.SHOVEL: 1, c.SPAWN_ZOMBIES: c.SPAWN_ZOMBIES_LIST, @@ -203,6 +204,7 @@ LEVEL_MAP_DATA = ( # 第1关:单行草皮 { c.BACKGROUND_TYPE: 7, + c.GAME_TITLE: "白天 1-1", c.INIT_SUN_NAME: 150, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -212,6 +214,7 @@ LEVEL_MAP_DATA = ( # 第2关:三行草皮 { c.BACKGROUND_TYPE: 8, + c.GAME_TITLE: "白天 1-2", c.INIT_SUN_NAME: 50, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -221,6 +224,7 @@ LEVEL_MAP_DATA = ( # 第3关 { c.BACKGROUND_TYPE: 0, + c.GAME_TITLE: "白天 1-3", c.INIT_SUN_NAME: 50, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -230,6 +234,7 @@ LEVEL_MAP_DATA = ( # 第4关 { c.BACKGROUND_TYPE: 0, + c.GAME_TITLE: "白天 1-4", c.INIT_SUN_NAME: 50, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -239,6 +244,7 @@ LEVEL_MAP_DATA = ( # 第5关 目前白天最后一关 { c.BACKGROUND_TYPE: 0, + c.GAME_TITLE: "白天 1-5", c.INIT_SUN_NAME: 50, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -248,6 +254,7 @@ LEVEL_MAP_DATA = ( # 第6关 目前夜晚第一关 { c.BACKGROUND_TYPE: 1, + c.GAME_TITLE: "黑夜 2-1", c.INIT_SUN_NAME: 50, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -258,6 +265,7 @@ LEVEL_MAP_DATA = ( # 第7关 { c.BACKGROUND_TYPE: 1, + c.GAME_TITLE: "黑夜 2-2", c.INIT_SUN_NAME: 50, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -269,6 +277,7 @@ LEVEL_MAP_DATA = ( # 第8关 目前为夜晚最后一关 { c.BACKGROUND_TYPE: 1, + c.GAME_TITLE: "黑夜 2-3", c.INIT_SUN_NAME: 50, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -287,6 +296,7 @@ LEVEL_MAP_DATA = ( # 第9关 目前为泳池模式第一关 { c.BACKGROUND_TYPE: 2, + c.GAME_TITLE: "泳池 3-1", c.INIT_SUN_NAME: 50, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -297,6 +307,7 @@ LEVEL_MAP_DATA = ( # 第10关 { c.BACKGROUND_TYPE: 2, + c.GAME_TITLE: "泳池 3-2", c.INIT_SUN_NAME: 50, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -308,6 +319,7 @@ LEVEL_MAP_DATA = ( # 第11关 { c.BACKGROUND_TYPE: 2, + c.GAME_TITLE: "泳池 3-3", c.INIT_SUN_NAME: 50, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -318,6 +330,7 @@ LEVEL_MAP_DATA = ( # 第12关 目前为泳池最后一关 { c.BACKGROUND_TYPE: 2, + c.GAME_TITLE: "泳池 3-4", c.INIT_SUN_NAME: 50, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -330,6 +343,7 @@ LEVEL_MAP_DATA = ( # 第13关 目前为浓雾第一关 尚未完善 { c.BACKGROUND_TYPE: 2, + c.GAME_TITLE: "浓雾 4-1", c.INIT_SUN_NAME: 50, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -347,12 +361,11 @@ LITTLE_GAME_MAP_DATA = ( # 第0关 测试 { c.BACKGROUND_TYPE: 6, + c.GAME_TITLE: "隐藏测试关卡", c.CHOOSEBAR_TYPE: c.CHOOSEBAR_BOWLING, c.SHOVEL: 0, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, - c.INCLUDED_ZOMBIES: ( c.NORMAL_ZOMBIE, c.CONEHEAD_ZOMBIE, - c.POLE_VAULTING_ZOMBIE, c.BUCKETHEAD_ZOMBIE, - c.NEWSPAPER_ZOMBIE, c.SCREEN_DOOR_ZOMBIE), + c.INCLUDED_ZOMBIES: ( c.SCREEN_DOOR_ZOMBIE,), c.NUM_FLAGS:3, c.CARD_POOL: { c.WALLNUTBOWLING: 0, c.REDWALLNUTBOWLING: 0, @@ -361,6 +374,7 @@ LITTLE_GAME_MAP_DATA = ( # 第1关 坚果保龄球 { c.BACKGROUND_TYPE: 6, + c.GAME_TITLE: "坚果保龄球", c.CHOOSEBAR_TYPE: c.CHOOSEBAR_BOWLING, c.SHOVEL: 0, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -373,6 +387,7 @@ LITTLE_GAME_MAP_DATA = ( # 第2关 白天 大决战 { c.BACKGROUND_TYPE: 0, + c.GAME_TITLE: "大决战(白天)", c.CHOOSEBAR_TYPE: c.CHOOSEBAR_MOVE, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -390,6 +405,7 @@ LITTLE_GAME_MAP_DATA = ( # 第3关 夜晚 大决战 { c.BACKGROUND_TYPE: 1, + c.GAME_TITLE: "大决战(黑夜)", c.CHOOSEBAR_TYPE: c.CHOOSEBAR_MOVE, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -409,6 +425,7 @@ LITTLE_GAME_MAP_DATA = ( # 第4关 泳池 大决战 { c.BACKGROUND_TYPE: 2, + c.GAME_TITLE: "大决战(泳池)", c.CHOOSEBAR_TYPE: c.CHOOSEBAR_MOVE, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -425,9 +442,10 @@ LITTLE_GAME_MAP_DATA = ( c.JALAPENO: 50, c.THREEPEASHOOTER: 300,} }, -# 第6关 坚果保龄球2 +# 第5关 坚果保龄球2 { c.BACKGROUND_TYPE: 6, + c.GAME_TITLE: "坚果保龄球(II)", c.CHOOSEBAR_TYPE: c.CHOOSEBAR_BOWLING, c.SHOVEL: 0, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, @@ -435,7 +453,7 @@ LITTLE_GAME_MAP_DATA = ( c.POLE_VAULTING_ZOMBIE, c.BUCKETHEAD_ZOMBIE, c.NEWSPAPER_ZOMBIE, c.SCREEN_DOOR_ZOMBIE), c.NUM_FLAGS:3, - c.CARD_POOL: { c.WALLNUTBOWLING: 300, + c.CARD_POOL: { c.WALLNUTBOWLING: 500, c.REDWALLNUTBOWLING: 100, c.GIANTWALLNUT:100,} }, diff --git a/source/constants.py b/source/constants.py index 5cad5da..9c60fb2 100755 --- a/source/constants.py +++ b/source/constants.py @@ -126,6 +126,7 @@ BACKGROUND_NAME = "Background" BACKGROUND_TYPE = "background_type" INIT_SUN_NAME = "init_sun_value" ZOMBIE_LIST = "zombie_list" +GAME_TITLE = "title" # 地图类型 BACKGROUND_DAY = 0 diff --git a/source/state/level.py b/source/state/level.py index 83d4997..cca8783 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -35,21 +35,23 @@ class Level(tool.State): if self.game_info[c.GAME_MODE] == c.MODE_ADVENTURE: if 0 <= self.game_info[c.LEVEL_NUM] < map.TOTAL_LEVEL: self.map_data = map.LEVEL_MAP_DATA[self.game_info[c.LEVEL_NUM]] - pg.display.set_caption(f"pypvz: 冒险模式 第{self.game_info[c.LEVEL_NUM]}关") + pg.display.set_caption(f"pypvz: 冒险模式 {self.map_data[c.GAME_TITLE]}") else: self.game_info[c.LEVEL_NUM] = 1 self.saveUserData() self.map_data = map.LEVEL_MAP_DATA[self.game_info[c.LEVEL_NUM]] + pg.display.set_caption(f"pypvz: 冒险模式 {self.map_data[c.GAME_TITLE]}") logger.warning("关卡数设定错误!进入默认的第一关!") # 小游戏模式 elif self.game_info[c.GAME_MODE] == c.MODE_LITTLEGAME: if 0 <= self.game_info[c.LITTLEGAME_NUM] < map.TOTAL_LITTLE_GAME: self.map_data = map.LITTLE_GAME_MAP_DATA[self.game_info[c.LITTLEGAME_NUM]] - pg.display.set_caption(f"pypvz: 玩玩小游戏 第{self.game_info[c.LITTLEGAME_NUM]}关") + pg.display.set_caption(f"pypvz: 玩玩小游戏 {self.map_data[c.GAME_TITLE]}") else: self.game_info[c.LITTLEGAME_NUM] = 1 self.saveUserData() self.map_data = map.LITTLE_GAME_MAP_DATA[self.game_info[c.LITTLEGAME_NUM]] + pg.display.set_caption(f"pypvz: 冒险模式 {self.map_data[c.GAME_TITLE]}") logger.warning("关卡数设定错误!进入默认的第一关!") # 是否有铲子的信息:无铲子时为0,有铲子时为1,故直接赋值即可 self.has_shovel = self.map_data[c.SHOVEL] @@ -287,7 +289,7 @@ class Level(tool.State): zombie_nums = 0 for i in range(self.map_y_len): zombie_nums += len(self.zombie_groups[i]) - if (zombie_nums / self.zombie_num < random.uniform(0.15, 0.25)) and (current_time - self.wave_time > 4000): + if self.zombie_num and (zombie_nums / self.zombie_num < random.uniform(0.15, 0.25)) and (current_time - self.wave_time > 4000): # 当僵尸所剩无几并且时间过了4000 ms以上时,改变时间记录,使得2000 ms后刷新僵尸(所以需要判断剩余时间是否大于2000 ms) if self.bar_type == c.CHOOSEBAR_STATIC: if current_time - 43000 < self.wave_time: # 判断剩余时间是否有2000 ms From 9801133724dcd1050a89492762da4fd04993b30a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Tue, 2 Aug 2022 19:41:14 +0800 Subject: [PATCH 12/17] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B0=8F=E6=8E=A8?= =?UTF-8?q?=E8=BD=A6=E8=A7=A6=E5=8F=91bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/map.py | 2 +- source/state/level.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/source/component/map.py b/source/component/map.py index 6a610af..60f16af 100755 --- a/source/component/map.py +++ b/source/component/map.py @@ -365,7 +365,7 @@ LITTLE_GAME_MAP_DATA = ( c.CHOOSEBAR_TYPE: c.CHOOSEBAR_BOWLING, c.SHOVEL: 0, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, - c.INCLUDED_ZOMBIES: ( c.SCREEN_DOOR_ZOMBIE,), + c.INCLUDED_ZOMBIES: ( c.POLE_VAULTING_ZOMBIE,), c.NUM_FLAGS:3, c.CARD_POOL: { c.WALLNUTBOWLING: 0, c.REDWALLNUTBOWLING: 0, diff --git a/source/state/level.py b/source/state/level.py index cca8783..6da90d3 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -1196,7 +1196,7 @@ class Level(tool.State): and (pg.sprite.collide_mask(zombie, self.cars[i]))): self.cars[i].setWalk() if (pg.sprite.collide_mask(zombie, self.cars[i]) or - self.cars[i].rect.x <= zombie.rect.centerx <= self.cars[i].rect.right): + self.cars[i].rect.x <= zombie.rect.right <= self.cars[i].rect.right): zombie.health = 0 if self.cars[i].dead: self.cars[i] = None @@ -1417,7 +1417,6 @@ class Level(tool.State): for i in range(self.map_y_len): for zombie in self.zombie_groups[i]: if zombie.rect.right < -20 and (not zombie.losthead) and (zombie.state != c.DIE): - print(zombie.rect.right, zombie.losthead, zombie.state,zombie.name) return True return False From bf3fdc08b995fbea67b1df26a8c2127bc4f27215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Tue, 2 Aug 2022 20:17:12 +0800 Subject: [PATCH 13/17] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AD=A6=E5=91=8A?= =?UTF-8?q?=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/state/level.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/state/level.py b/source/state/level.py index 6da90d3..cce0c56 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -41,7 +41,7 @@ class Level(tool.State): self.saveUserData() self.map_data = map.LEVEL_MAP_DATA[self.game_info[c.LEVEL_NUM]] pg.display.set_caption(f"pypvz: 冒险模式 {self.map_data[c.GAME_TITLE]}") - logger.warning("关卡数设定错误!进入默认的第一关!") + logger.warning("关卡数设定错误!进入默认的第一关!\n") # 小游戏模式 elif self.game_info[c.GAME_MODE] == c.MODE_LITTLEGAME: if 0 <= self.game_info[c.LITTLEGAME_NUM] < map.TOTAL_LITTLE_GAME: @@ -52,7 +52,7 @@ class Level(tool.State): self.saveUserData() self.map_data = map.LITTLE_GAME_MAP_DATA[self.game_info[c.LITTLEGAME_NUM]] pg.display.set_caption(f"pypvz: 冒险模式 {self.map_data[c.GAME_TITLE]}") - logger.warning("关卡数设定错误!进入默认的第一关!") + logger.warning("关卡数设定错误!进入默认的第一关!\n") # 是否有铲子的信息:无铲子时为0,有铲子时为1,故直接赋值即可 self.has_shovel = self.map_data[c.SHOVEL] From 6ae7007bb9af26ca2b2beac5333544984e0ea132 Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Tue, 2 Aug 2022 22:29:23 +0800 Subject: [PATCH 14/17] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B8=AE=E5=8A=A9?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E6=89=93=E5=BC=80=E9=9F=B3=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/sound/helpScreen.ogg | Bin 0 -> 12960 bytes source/constants.py | 1 + source/state/screen.py | 1 + 3 files changed, 2 insertions(+) create mode 100755 resources/sound/helpScreen.ogg diff --git a/resources/sound/helpScreen.ogg b/resources/sound/helpScreen.ogg new file mode 100755 index 0000000000000000000000000000000000000000..e39e6ab65a727feff6be419cbd12392eeabb0491 GIT binary patch literal 12960 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 python 3.8),免得要维护两个 SOUNDS = ( # 程序交互等 SOUND_TAPPING_CARD := _getSound("tap.ogg"), + SOUND_HELP_SCREEN := _getSound("helpScreen.ogg"), # 植物 SOUND_FIREPEA_EXPLODE := _getSound("firepea.ogg"), SOUND_BULLET_EXPLODE := _getSound("bulletExplode.ogg"), diff --git a/source/state/screen.py b/source/state/screen.py index 4a6e873..6837c0c 100644 --- a/source/state/screen.py +++ b/source/state/screen.py @@ -223,6 +223,7 @@ class HelpScreen(tool.State): self.setupImage() pg.display.set_caption("pypvz: 帮助") pg.mixer.music.stop() + c.SOUND_HELP_SCREEN.play() def setupImage(self): # 主体 From 95b4d789e5039cb7b8a30e98f6c91850e0af9dfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Wed, 3 Aug 2022 09:15:36 +0800 Subject: [PATCH 15/17] =?UTF-8?q?=E5=8E=8B=E7=BC=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/sound/helpScreen.ogg | Bin 12960 -> 8080 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/sound/helpScreen.ogg b/resources/sound/helpScreen.ogg index e39e6ab65a727feff6be419cbd12392eeabb0491..d243e5159f5b44b4812a5501da469a52e159a91e 100755 GIT binary patch literal 8080 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 Date: Fri, 5 Aug 2022 14:23:36 +0800 Subject: [PATCH 16/17] =?UTF-8?q?=E7=AE=80=E5=8C=96=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=85=B3=E5=8D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/map.py | 2 +- source/state/level.py | 28 +++++++++++++--------------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/source/component/map.py b/source/component/map.py index 60f16af..298cf58 100755 --- a/source/component/map.py +++ b/source/component/map.py @@ -366,7 +366,7 @@ LITTLE_GAME_MAP_DATA = ( c.SHOVEL: 0, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, c.INCLUDED_ZOMBIES: ( c.POLE_VAULTING_ZOMBIE,), - c.NUM_FLAGS:3, + c.NUM_FLAGS:1, c.CARD_POOL: { c.WALLNUTBOWLING: 0, c.REDWALLNUTBOWLING: 0, c.GIANTWALLNUT:100,} diff --git a/source/state/level.py b/source/state/level.py index cce0c56..74fa7b4 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -110,39 +110,37 @@ class Level(tool.State): self.num_flags = num_flags - # 权重值 - weights = [] - for zombie in useable_zombies: - weights.append(c.CREATE_ZOMBIE_DICT[zombie][1]) + # 权重值,c.CREATE_ZOMBIE_DICT[zombie][1]即为对应的权重 + weights = [c.CREATE_ZOMBIE_DICT[zombie][1] for zombie in useable_zombies] # 按照原版pvz设计的僵尸容量函数,是从无尽解析的,但是普通关卡也可以遵循 for wave in range(1, 10 * num_flags + 1): - volume = int(int((wave + survival_rounds*20)*0.8)/2) + 1 + zombie_volume = int(int((wave + survival_rounds*20)*0.8)/2) + 1 zombie_list = [] # 大波僵尸情况 if wave % 10 == 0: # 容量增大至2.5倍 - volume = int(volume*2.5) + zombie_volume = int(zombie_volume*2.5) # 先生成旗帜僵尸 zombie_list.append(c.FLAG_ZOMBIE) - volume -= c.CREATE_ZOMBIE_DICT[c.FLAG_ZOMBIE][0] + zombie_volume -= c.CREATE_ZOMBIE_DICT[c.FLAG_ZOMBIE][0] # 传送带模式应当增大僵尸容量 if (self.bar_type != c.CHOOSEBAR_STATIC): - volume += 2 + zombie_volume += 2 if inevitable_zombie_dict and (wave in inevitable_zombie_dict): for new_zombie in inevitable_zombie_dict[wave]: zombie_list.append(new_zombie) - volume -= c.CREATE_ZOMBIE_DICT[new_zombie][0] - if volume < 0: + zombie_volume -= c.CREATE_ZOMBIE_DICT[new_zombie][0] + if zombie_volume < 0: logger.warning(f"第{wave}波中手动设置的僵尸级别总数超过上限!") # 防止因为僵尸最小等级过大,使得总容量无法完全利用,造成死循环的检查机制 min_cost = c.CREATE_ZOMBIE_DICT[min(useable_zombies, key=lambda x:c.CREATE_ZOMBIE_DICT[x][0])][0] - while (volume >= min_cost) and (len(zombie_list) < 50): + while (zombie_volume >= min_cost) and (len(zombie_list) < 50): new_zombie = random.choices(useable_zombies, weights)[0] # 普通僵尸、路障僵尸、铁桶僵尸有概率生成水中变种 if self.background_type in c.POOL_EQUIPPED_BACKGROUNDS: @@ -157,9 +155,9 @@ class Level(tool.State): # 首先几轮不出水生僵尸 elif new_zombie in c.WATER_ZOMBIE: continue - if c.CREATE_ZOMBIE_DICT[new_zombie][0] <= volume: + if c.CREATE_ZOMBIE_DICT[new_zombie][0] <= zombie_volume: zombie_list.append(new_zombie) - volume -= c.CREATE_ZOMBIE_DICT[new_zombie][0] + zombie_volume -= c.CREATE_ZOMBIE_DICT[new_zombie][0] waves.append(zombie_list) # print(wave, zombie_list, len(zombie_list)) @@ -1504,9 +1502,9 @@ class Level(tool.State): # 填充的进度条信息 # 常数为拟合值 - filledBarRect = (self.level_progress_zombie_head_image_rect.x + 3, self.level_progress_bar_image_rect.y + 6, int((150 * self.wave_num) / (self.map_data[c.NUM_FLAGS] * 10)) + 5, 9) + filled_bar_rect = (self.level_progress_zombie_head_image_rect.x + 3, self.level_progress_bar_image_rect.y + 6, int((150 * self.wave_num) / (self.map_data[c.NUM_FLAGS] * 10)) + 5, 9) # 画填充的进度条 - pg.draw.rect(surface, c.YELLOWGREEN, filledBarRect) + pg.draw.rect(surface, c.YELLOWGREEN, filled_bar_rect) # 画旗帜 for i in range(self.num_flags): From d93acfe9e38796fca356c5117e92531234e9cab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Fri, 5 Aug 2022 14:49:21 +0800 Subject: [PATCH 17/17] =?UTF-8?q?=E4=BF=AE=E5=A4=8D4-1=E5=85=B3=E7=9A=84bu?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/map.py | 4 ++-- source/state/level.py | 30 +++++++++++++++++------------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/source/component/map.py b/source/component/map.py index 298cf58..ce01487 100755 --- a/source/component/map.py +++ b/source/component/map.py @@ -342,14 +342,14 @@ LEVEL_MAP_DATA = ( }, # 第13关 目前为浓雾第一关 尚未完善 { - c.BACKGROUND_TYPE: 2, + c.BACKGROUND_TYPE: 3, c.GAME_TITLE: "浓雾 4-1", c.INIT_SUN_NAME: 50, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, c.INCLUDED_ZOMBIES: ( c.NORMAL_ZOMBIE, c.NEWSPAPER_ZOMBIE, c.ZOMBONI, c.FOOTBALL_ZOMBIE, - c.CONEHEAD_ZOMBIE, c.BUCKETHEAD_HEALTH), + c.CONEHEAD_ZOMBIE, c.BUCKETHEAD_ZOMBIE), c.NUM_FLAGS:4 }, ) diff --git a/source/state/level.py b/source/state/level.py index 74fa7b4..6091cf6 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -96,7 +96,7 @@ class Level(tool.State): # 改用列表生成器直接生成内容,不再在这里使用for循环 self.plant_groups = [pg.sprite.Group() for i in range(self.map_y_len)] self.zombie_groups = [pg.sprite.Group() for i in range(self.map_y_len)] - self.hypno_zombie_groups = [pg.sprite.Group() for i in range(self.map_y_len)] #zombies who are hypno after eating hypnoshroom + self.hypno_zombie_groups = [pg.sprite.Group() for i in range(self.map_y_len)] # 被魅惑的僵尸 self.bullet_groups = [pg.sprite.Group() for i in range(self.map_y_len)] @@ -159,7 +159,6 @@ class Level(tool.State): zombie_list.append(new_zombie) zombie_volume -= c.CREATE_ZOMBIE_DICT[new_zombie][0] waves.append(zombie_list) - # print(wave, zombie_list, len(zombie_list)) self.waves = waves @@ -183,13 +182,13 @@ class Level(tool.State): unoccupied = [] occupied = [] # 毁灭菇坑与冰道应当特殊化 - exceptionObjects = {c.HOLE, c.ICEFROZENPLOT} + exception_objects = {c.HOLE, c.ICEFROZENPLOT} # 遍历能生成墓碑的区域 for map_y in range(0, 4): for map_x in range(4, 8): # 为空、为毁灭菇坑、为冰道时看作未被植物占据 if ((not self.map.map[map_y][map_x][c.MAP_PLANT]) or - (all((i in exceptionObjects) for i in self.map.map[map_y][map_x][c.MAP_PLANT]))): + (all((i in exception_objects) for i in self.map.map[map_y][map_x][c.MAP_PLANT]))): unoccupied.append((map_x, map_y)) # 已有墓碑的格子不应该放到任何列表中 elif c.GRAVE not in self.map.map[map_y][map_x][c.MAP_PLANT]: @@ -209,7 +208,7 @@ class Level(tool.State): checkMapX, _ = self.map.getMapIndex(i.rect.centerx, i.rect.bottom) if map_x == checkMapX: # 不杀死毁灭菇坑和冰道 - if i.name not in exceptionObjects: + if i.name not in exception_objects: i.health = 0 self.plant_groups[map_y].add(plant.Grave(posX, posY)) self.map.map[map_y][map_x][c.MAP_PLANT].add(c.GRAVE) @@ -1548,14 +1547,6 @@ class Level(tool.State): self.showAllContentOfMenu(surface) # 以后可能需要插入一个预备的状态(预览显示僵尸、返回战场) elif self.state == c.PLAY: - if self.has_shovel: - # 画铲子 - surface.blit(self.shovel_box, self.shovel_box_rect) - surface.blit(self.shovel, self.shovel_rect) - # 画小菜单 - surface.blit(self.little_menu, self.little_menu_rect) - - self.menubar.draw(surface) for i in range(self.map_y_len): self.plant_groups[i].draw(surface) self.zombie_groups[i].draw(surface) @@ -1565,6 +1556,19 @@ class Level(tool.State): if self.cars[i]: self.cars[i].draw(surface) self.head_group.draw(surface) + + # 浓雾模式的雾 + #if self.background_type == c.BACKGROUND_FOG: + # pg.draw.rect(surface, c.LIGHTGRAY, (400, 0, 400, 600)) + + if self.has_shovel: + # 画铲子 + surface.blit(self.shovel_box, self.shovel_box_rect) + surface.blit(self.shovel, self.shovel_rect) + # 画小菜单 + surface.blit(self.little_menu, self.little_menu_rect) + + self.menubar.draw(surface) self.sun_group.draw(surface) if self.drag_plant: