From fc89acd3a1afd4be396e0852fbdc65007baf7752 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, 10 May 2022 21:58:21 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E5=BE=88=E7=B2=97=E7=95=A5=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E5=AE=9E=E7=8E=B0=E6=92=91=E6=9D=86=E8=B7=B3?= =?UTF-8?q?=E5=83=B5=E5=B0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- resources/data/map/level_2.json | 2 +- source/component/plant.py | 4 --- source/component/zombie.py | 50 +++++++++++++++++++++++++++------ source/constants.py | 2 +- source/state/level.py | 9 ++++-- 6 files changed, 52 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 0e75993..37300ec 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ **本项目为个人python语言学习的练习项目,仅供个人学习和研究使用,不得用于其他用途。如果这个游戏侵犯了版权,请联系我删除** * 已有的植物:向日葵,豌豆射手,坚果墙,寒冰射手,樱桃炸弹,双发射手,三线射手,大嘴花,小喷菇,土豆雷,地刺,胆小菇,倭瓜,火爆辣椒,阳光菇,寒冰菇,魅惑菇,火炬树桩,睡莲,杨桃,咖啡豆,海蘑菇,高坚果,缠绕水草,毁灭菇,墓碑吞噬者,大喷菇 -* 已有的僵尸:普通僵尸,旗帜僵尸,路障僵尸,铁桶僵尸,读报僵尸,橄榄球僵尸,鸭子救生圈僵尸,铁门僵尸 +* 已有的僵尸:普通僵尸,旗帜僵尸,路障僵尸,铁桶僵尸,读报僵尸,橄榄球僵尸,鸭子救生圈僵尸,铁门僵尸,撑杆跳僵尸 * 使用 JSON 文件记录关卡信息数据 * 支持选择植物卡片 * 支持白昼模式,夜晚模式,泳池模式,传送带模式和坚果保龄球模式 diff --git a/resources/data/map/level_2.json b/resources/data/map/level_2.json index 3b5e70a..baa5fbf 100644 --- a/resources/data/map/level_2.json +++ b/resources/data/map/level_2.json @@ -3,6 +3,6 @@ "init_sun_value":50, "shovel":1, "spawn_zombies":"auto", - "included_zombies":["Zombie", "ConeheadZombie"], + "included_zombies":["Zombie", "ConeheadZombie", "PoleVaultingZombie"], "num_flags":3 } \ No newline at end of file diff --git a/source/component/plant.py b/source/component/plant.py index 76d3a20..24abab6 100755 --- a/source/component/plant.py +++ b/source/component/plant.py @@ -237,8 +237,6 @@ class Plant(pg.sprite.Sprite): self.hit_timer = 0 # 被铲子指向时间 self.highlightTime = 0 - # 是否能被越过 - self.skipable = True def loadFrames(self, frames, name, scale, color=c.BLACK): frame_list = tool.GFX[name] @@ -1362,8 +1360,6 @@ class TallNut(Plant): self.load_images() self.cracked1 = False self.cracked2 = False - # 高坚果不能被撑杆跳僵尸和海豚骑士僵尸跳过,虽然目前还没有引入撑杆跳僵尸和海豚骑士僵尸 - self.skipable = False def load_images(self): self.cracked1_frames = [] diff --git a/source/component/zombie.py b/source/component/zombie.py index a4394fb..8670e6f 100755 --- a/source/component/zombie.py +++ b/source/component/zombie.py @@ -851,6 +851,7 @@ class PoleVaultingZombie(Zombie): Zombie.__init__(self, x, y, c.POLE_VAULTING_ZOMBIE, head_group=head_group) self.speed = 1.88 self.jumped = False + self.jumping = False def loadImages(self): self.walk_frames = [] @@ -859,29 +860,62 @@ class PoleVaultingZombie(Zombie): self.losthead_attack_frames = [] self.die_frames = [] self.boomdie_frames = [] - self.walk_after_jump_frames = [] + self.walk_before_jump_frames = [] self.jump_frames = [] - walk_name = self.name + walk_name = self.name + 'WalkAfterJump' attack_name = self.name + 'Attack' losthead_walk_name = self.name + 'LostHead' losthead_attack_name = self.name + 'LostHeadAttack' die_name = self.name + 'Die' boomdie_name = c.BOOMDIE - walk_after_jump_name = self.name + 'WalkAfterJump' + walk_before_jump_name = self.name jump_name = self.name + 'Jump' frame_list = [self.walk_frames, self.attack_frames, self.losthead_walk_frames, self.losthead_attack_frames, self.die_frames, self.boomdie_frames, - self.walk_after_jump_frames, self.jump_frames] + self.walk_before_jump_frames, self.jump_frames] name_list = [walk_name, attack_name, losthead_walk_name, losthead_attack_name, die_name, boomdie_name, - walk_after_jump_name, jump_name] + walk_before_jump_name, jump_name] for i, name in enumerate(name_list): self.loadFrames(frame_list[i], name) - self.frames = self.walk_frames + self.frames = self.walk_before_jump_frames - def setJump(self): - self.changeFrames(self.jump_frames) \ No newline at end of file + def setJump(self, successfullyJumped): + if not self.jumping: + self.jumping = True + self.changeFrames(self.jump_frames) + self.successfullyJumped = successfullyJumped + + def animation(self): + if self.state == c.FREEZE: + self.image.set_alpha(192) + return + + if (self.current_time - self.animate_timer) > (self.animate_interval * self.getTimeRatio()): + self.frame_index += 1 + if self.jumping and (not self.jumped): + self.rect.x -= 5 + if self.frame_index >= self.frame_num: + if self.state == c.DIE: + self.kill() + return + self.frame_index = 0 + if self.jumping and (not self.jumped): + self.changeFrames(self.walk_frames) + if self.successfullyJumped: + self.rect.x -= c.GRID_X_SIZE * 1.3 + self.jumped = True + self.speed = 1.04 + self.animate_timer = self.current_time + + self.image = self.frames[self.frame_index] + if self.is_hypno: + self.image = pg.transform.flip(self.image, True, False) + if (self.current_time - self.hit_timer) >= 200: + self.image.set_alpha(255) + else: + self.image.set_alpha(192) diff --git a/source/constants.py b/source/constants.py index 87357ae..ba2605f 100755 --- a/source/constants.py +++ b/source/constants.py @@ -166,7 +166,7 @@ PANEL_Y_INTERNAL = 73 PANEL_X_INTERNAL = 53 BAR_CARD_X_INTERNAL = 51 CARD_MAX_NUM = 10 # 这里以后可以增加解锁功能,从最初的6格逐渐解锁到10格 -CARD_LIST_NUM = CARD_MAX_NUM +CARD_LIST_NUM = 0#CARD_MAX_NUM # 所选植物信息索引 PLANT_NAME_INDEX = 0 diff --git a/source/state/level.py b/source/state/level.py index 3fd6181..0dac3cc 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -418,6 +418,7 @@ class Level(tool.State): c.CONEHEAD_DUCKY_TUBE_ZOMBIE:(2, 0), # 作为变种,不主动生成 c.BUCKETHEAD_DUCKY_TUBE_ZOMBIE:(4, 0), # 作为变种,不主动生成 c.SCREEN_DOOR_ZOMBIE:(4, 3500), + c.POLE_VAULTING_ZOMBIE:(2, 2000), } # 将僵尸与水上变种对应 self.convertZombieInPool = {c.NORMAL_ZOMBIE:c.DUCKY_TUBE_ZOMBIE, @@ -1067,8 +1068,12 @@ class Level(tool.State): if targetPlant: # 撑杆跳的特殊情况 - if zombie.name == c.POLE_VAULTING_ZOMBIE and (not zombie.jumped): - zombie.setJump() + if zombie.name in {c.POLE_VAULTING_ZOMBIE} and (not zombie.jumped): + map_x, map_y = self.map.getMapIndex(targetPlant.rect.centerx, targetPlant.rect.bottom) + if c.TALLNUT in self.map.map[map_y][map_x][c.MAP_PLANT]: + zombie.setJump(False) + else: + zombie.setJump(True) continue if targetPlant.name == c.WALLNUTBOWLING: