From 11e8eb8e6eca7ddce8e765e825d232e3f2a01fee 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, 13 Apr 2022 19:03:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E5=AF=92=E5=86=B0?= =?UTF-8?q?=E5=B0=84=E6=89=8B=E6=97=A0=E6=B3=95=E5=87=8F=E9=80=9F=E6=8C=81?= =?UTF-8?q?=E6=9C=89=E4=BA=8C=E7=B1=BB=E9=98=B2=E5=85=B7=E7=9A=84=E5=83=B5?= =?UTF-8?q?=E5=B0=B8=20=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=9D=9A=E6=9E=9C?= =?UTF-8?q?=E4=BF=9D=E9=BE=84=E7=90=83=E5=8D=95=E7=8B=AC=E7=9A=84=E6=94=BB?= =?UTF-8?q?=E5=87=BB=E6=A8=A1=E5=BC=8F=20=E4=BF=AE=E6=94=B9=EF=BC=9A?= =?UTF-8?q?=E8=AF=BB=E6=8A=A5=E5=83=B5=E5=B0=B8=E3=80=81=E6=97=97=E5=B8=9C?= =?UTF-8?q?=E5=83=B5=E5=B0=B8=E7=94=9F=E5=91=BD=E5=80=BC=E3=80=81=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E9=80=9F=E5=BA=A6=E6=81=A2=E5=A4=8D=E5=8E=9F=E7=89=88?= =?UTF-8?q?=E8=AE=BE=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/zombie.py | 43 +++++++++++++++++++++++++++++--------- source/constants.py | 10 ++++----- source/state/level.py | 3 ++- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/source/component/zombie.py b/source/component/zombie.py index 79db07c..525c943 100755 --- a/source/component/zombie.py +++ b/source/component/zombie.py @@ -88,14 +88,15 @@ class Zombie(pg.sprite.Sprite): self.changeFrames(self.walk_frames) self.helmetType2 = False if self.name == c.NEWSPAPER_ZOMBIE: - self.speed = 2 + self.speed = 2.5 + self.animate_interval = 300 # 因为加速了时间间隔要除以倍率,所以减小动画帧率 if (self.current_time - self.walk_timer) > (c.ZOMBIE_WALK_INTERVAL * self.getTimeRatio()): self.walk_timer = self.current_time if self.is_hypno: - self.rect.x += self.speed + self.rect.x += 1 else: - self.rect.x -= self.speed + self.rect.x -= 1 def attacking(self): self.checkToDie(self.losthead_attack_frames) @@ -106,7 +107,7 @@ class Zombie(pg.sprite.Sprite): if self.helmetType2Health <= 0 and self.helmetType2: self.changeFrames(self.attack_frames) self.helmetType2 = False - if (self.current_time - self.attack_timer) > (c.ATTACK_INTERVAL * self.getTimeRatio()): + if (self.current_time - self.attack_timer) > (c.ATTACK_INTERVAL * self.getAttackTimeRatio()): if self.prey.health > 0: if self.prey_is_plant: self.prey.setDamage(self.damage, self) @@ -174,10 +175,13 @@ class Zombie(pg.sprite.Sprite): self.image.set_alpha(192) def getTimeRatio(self): - return self.ice_slow_ratio + return (self.ice_slow_ratio / self.speed) # 目前的机制为:冰冻减速状态与自身速度共同决定行走的时间间隔 + + def getAttackTimeRatio(self): + return self.ice_slow_ratio # 攻击速度只取决于冰冻状态 def setIceSlow(self): - '''when get a ice bullet damage, slow the attack or walk speed of the zombie''' + # 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 @@ -187,6 +191,14 @@ class Zombie(pg.sprite.Sprite): self.ice_slow_ratio = 1 def setDamage(self, damage, ice=False, damageType=c.ZOMBIE_COMMON_DAMAGE): + # 冰冻减速效果 + if ice: + if damageType == c.ZOMBIE_DEAFULT_DAMAGE: # 寒冰射手不能穿透二类防具进行减速 + if not self.helmetType2: + self.setIceSlow() + else: + self.setIceSlow() + if damageType == c.ZOMBIE_DEAFULT_DAMAGE: # 不穿透二类防具的攻击 # 从第二类防具开始逐级传递 if self.helmetType2: @@ -248,15 +260,25 @@ class Zombie(pg.sprite.Sprite): self.health -= damage elif damageType == c.ZOMBIE_ASH_DAMAGE: self.health -= damage # 无视任何防具 + elif damageType == c.ZOMBIE_WALLNUT_BOWLING_DANMAGE: + # 逻辑:对防具的多余伤害不传递 + # 以后增设铁门后可能需要设置侧面冲撞特殊性 + if self.helmetType2: + self.helmetType2Health -= damage + if self.helmetType2Health <= 0: + self.helmetType2 = False + elif self.helmet: # 不存在二类防具,但是存在一类防具 + self.helmetHealth -= damage + if self.helmetHealth <= 0: + self.helmet = False + else: # 没有防具 + self.health -= damage else: print('警告:植物攻击类型错误,现在默认进行类豌豆射手型攻击') setDamage(damage, ice=ice, damageType=c.ZOMBIE_DEAFULT_DAMAGE) # 记录攻击时间 self.hit_timer = self.current_time - # 冰冻减速效果 - if ice: - self.setIceSlow() def setWalk(self): self.state = c.WALK @@ -431,7 +453,8 @@ class BucketHeadZombie(Zombie): class FlagZombie(Zombie): def __init__(self, x, y, head_group): - Zombie.__init__(self, x, y, c.FLAG_ZOMBIE, head_group, bodyHealth=c.FLAG_HEALTH + c.NORMAL_HEALTH) + Zombie.__init__(self, x, y, c.FLAG_ZOMBIE, head_group) + self.speed = 1.25 def loadImages(self): self.walk_frames = [] diff --git a/source/constants.py b/source/constants.py index d035a91..79ee618 100755 --- a/source/constants.py +++ b/source/constants.py @@ -175,17 +175,17 @@ BOOMDIE = 'BoomDie' ZOMBIE_DEAFULT_DAMAGE = 'helmet2First' ZOMBIE_HELMET_2_FIRST = 'helmet2First' # 优先攻击二类防具 ZOMBIE_COMMON_DAMAGE = 'commonDamage' # 优先攻击僵尸与一类防具的整体 -ZOMBIE_RANGE_DAMAGE = 'rangeDAMAGE' # 范围攻击,同时伤害二类防具与(僵尸与一类防具的整体) -ZOMBIE_ASH_DAMAGE = 'ashDAMAGE' # 灰烬植物攻击,直接伤害本体 +ZOMBIE_RANGE_DAMAGE = 'rangeDamage' # 范围攻击,同时伤害二类防具与(僵尸与一类防具的整体) +ZOMBIE_ASH_DAMAGE = 'ashDamage' # 灰烬植物攻击,直接伤害本体 +ZOMBIE_WALLNUT_BOWLING_DANMAGE = 'wallnutBowlingDamage' # 坚果保龄球冲撞伤害 # 僵尸生命值设置 LOSTHEAD_HEALTH = 70 NORMAL_HEALTH = 200 # 普通僵尸生命值 -FLAG_HEALTH = 50 CONEHEAD_HEALTH = 370 BUCKETHEAD_HEALTH = 1100 -NEWSPAPER_HEALTH = 200 +NEWSPAPER_HEALTH = 150 ATTACK_INTERVAL = 500 ZOMBIE_WALK_INTERVAL = 60 # 僵尸步行间隔 @@ -213,6 +213,6 @@ PLAY = 'play' BACKGROUND_DAY = 0 BACKGROUND_NIGHT = 1 BACKGROUND_POOL = 2 -BACKGROUND_FOOGY = 3 +BACKGROUND_FOG = 3 BACKGROUND_ROOF = 4 BACKGROUND_ROOFNIGHT = 5 \ No newline at end of file diff --git a/source/state/level.py b/source/state/level.py index d3bc92b..b43b15c 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -606,7 +606,8 @@ class Level(tool.State): if plant: if plant.name == c.WALLNUTBOWLING: if plant.canHit(i): - zombie.setDamage(c.WALLNUT_BOWLING_DAMAGE, damageType=c.ZOMBIE_DEAFULT_DAMAGE) + zombie.setDamage(c.WALLNUT_BOWLING_DAMAGE, damageType=c.ZOMBIE_WALLNUT_BOWLING_DANMAGE) + # 注意:以上语句为通用处理,以后加入了铁门僵尸需要单独设置直接冲撞就直接杀死 plant.changeDirection(i) elif plant.name == c.REDWALLNUTBOWLING: if plant.state == c.IDLE: