初步增加冰车僵尸

This commit is contained in:
星外之神 2022-05-14 11:58:12 +08:00
parent 700ebaa7c4
commit 8a934ebbb1
6 changed files with 105 additions and 4 deletions

View File

@ -4,7 +4,7 @@
"shovel":1, "shovel":1,
"spawn_zombies":"list", "spawn_zombies":"list",
"zombie_list":[ "zombie_list":[
{"time":0, "map_y":4, "name":"ScreenDoorZombie"}, {"time":0, "map_y":5, "name":"Zomboni"},
{"time":1000, "map_y":4, "name":"ScreenDoorZombie"}, {"time":1000, "map_y":4, "name":"ScreenDoorZombie"},
{"time":2000, "map_y":4, "name":"ScreenDoorZombie"}, {"time":2000, "map_y":4, "name":"ScreenDoorZombie"},
{"time":3100, "map_y":4, "name":"ScreenDoorZombie"}, {"time":3100, "map_y":4, "name":"ScreenDoorZombie"},

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@ -842,9 +842,18 @@ class Spikeweed(Plant):
self.hit_timer = self.current_time - 500 self.hit_timer = self.current_time - 500
elif (self.current_time - self.attack_timer) >= 700: elif (self.current_time - self.attack_timer) >= 700:
self.attack_timer = self.current_time self.attack_timer = self.current_time
# 最后再来判断攻击是否要杀死自己
killSelf = False
for zombie in self.zombie_group: for zombie in self.zombie_group:
if self.canAttack(zombie): if self.canAttack(zombie):
# 有车的僵尸
if zombie.name in {c.ZOMBONI}:
zombie.health = 0
killSelf = True
else:
zombie.setDamage(20, damageType=c.ZOMBIE_COMMON_DAMAGE) zombie.setDamage(20, damageType=c.ZOMBIE_COMMON_DAMAGE)
if killSelf:
self.health = 0
# 播放攻击音效,同子弹打击 # 播放攻击音效,同子弹打击
pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "bulletExplode.ogg")).play() pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "bulletExplode.ogg")).play()
@ -1704,3 +1713,6 @@ class FumeShroom(Plant):
else: else:
self.image.set_alpha(255) self.image.set_alpha(255)
class IceFrozenPlot(Plant):
def __init__(self, x, y):
Plant.__init__(self, x, y, c.ICE_FROZEN_PLOT, c.INF, None)

View File

@ -930,3 +930,82 @@ class PoleVaultingZombie(Zombie):
self.image.set_alpha(255) self.image.set_alpha(255)
else: else:
self.image.set_alpha(192) self.image.set_alpha(192)
# 注意:冰车僵尸移动变速
class Zomboni(Zombie):
def __init__(self, x, y, plant_group, map, IceFrozenPlot):
Zombie.__init__(self, x, y, c.ZOMBONI, bodyHealth=c.ZOMBONI_HEALTH)
self.plant_group = plant_group
self.map = map
self.IceFrozenPlot = IceFrozenPlot
def loadImages(self):
self.walk_frames = []
self.walk_damaged1_frames = []
self.walk_damaged2_frames = []
self.losthead_walk_frames = []
self.die_frames = []
self.boomdie_frames = []
walk_name = self.name
walk_damaged1_name = self.name + 'Damaged1'
walk_damaged2_name = self.name + 'Damaged2'
losthead_walk_name = self.name + 'Damaged2'
die_name = self.name + 'Die'
boomdie_name = self.name + 'BoomDie'
frame_list = [ self.walk_frames, self.walk_damaged1_frames,
self.walk_damaged2_frames, self.losthead_walk_frames,
self.die_frames, self.boomdie_frames]
name_list = [ walk_name, walk_damaged1_name,
walk_damaged2_name, losthead_walk_name,
die_name, boomdie_name]
for i, name in enumerate(name_list):
self.loadFrames(frame_list[i], name)
self.frames = self.walk_frames
def updateIceSlow(self):
# 冰车僵尸不可冰冻
self.ice_slow_ratio = 1
def freezing(self):
# 冰车僵尸不可冰冻
pass
def walking(self):
if self.checkToDie(self.losthead_walk_frames):
return
if self.health <= c.ZOMBONI_DAMAGED2_HEALTH:
self.changeFrames(self.walk_damaged2_frames)
elif self.health <= c.ZOMBONI_DAMAGED1_HEALTH:
self.changeFrames(self.walk_damaged1_frames)
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 += 1
else:
self.rect.x -= 1
# 行进时碾压
for plant in self.plant_group:
# 地刺和地刺王不用检验
if ((plant.name not in {c.SPIKEWEED})
and (self.rect.centerx <= plant.rect.right <= self.rect.right)):
# 扣除生命值为可能的最大有限生命值
plant.setDamage(8000, self)
# 造冰
mapX, mapY = self.map.getMapIndex(self.rect.right, self.rect.bottom)
if 0 <= mapX < c.GRID_X_LEN:
if c.ICE_FROZEN_PLOT not in self.map.map[mapY][mapX]:
x, y = self.map.getMapGridPos(mapX, mapY)
self.plant_group.add(self.IceFrozenPlot(x, y))
def handleState(self):
self.walking()

View File

@ -312,6 +312,7 @@ CONEHEAD_DUCKY_TUBE_ZOMBIE = 'ConeheadDuckyTubeZombie'
BUCKETHEAD_DUCKY_TUBE_ZOMBIE = 'BucketheadDuckyTubeZombie' BUCKETHEAD_DUCKY_TUBE_ZOMBIE = 'BucketheadDuckyTubeZombie'
SCREEN_DOOR_ZOMBIE = 'ScreenDoorZombie' SCREEN_DOOR_ZOMBIE = 'ScreenDoorZombie'
POLE_VAULTING_ZOMBIE = 'PoleVaultingZombie' POLE_VAULTING_ZOMBIE = 'PoleVaultingZombie'
ZOMBONI = 'Zomboni'
BOOMDIE = 'BoomDie' BOOMDIE = 'BoomDie'
@ -325,9 +326,14 @@ ZOMBIE_WALLNUT_BOWLING_DANMAGE = 'wallnutBowlingDamage' # 坚果保龄球冲撞
# 僵尸生命值设置 # 僵尸生命值设置
# 有关本体 # 有关本体
LOSTHEAD_HEALTH = 70
NORMAL_HEALTH = 200 # 普通僵尸生命值 NORMAL_HEALTH = 200 # 普通僵尸生命值
POLE_VAULTING_HEALTH = 333 POLE_VAULTING_HEALTH = 333
ZOMBONI_HEALTH = 1280
# 冰车损坏点
ZOMBONI_DAMAGED1_HEALTH = 2 * ZOMBONI_HEALTH // 3 + 70
ZOMBONI_DAMAGED2_HEALTH = ZOMBONI_HEALTH // 3 + 70
# 掉头后僵尸的生命值
LOSTHEAD_HEALTH = 70
POLE_VAULTING_LOSTHEAD_HEALTH = 167 POLE_VAULTING_LOSTHEAD_HEALTH = 167
# 有关一类防具 # 有关一类防具
CONEHEAD_HEALTH = 370 CONEHEAD_HEALTH = 370

View File

@ -838,6 +838,8 @@ class Level(tool.State):
elif name == c.POLE_VAULTING_ZOMBIE: elif name == c.POLE_VAULTING_ZOMBIE:
# 撑杆跳生成位置不同 # 撑杆跳生成位置不同
self.zombie_groups[map_y].add(zombie.PoleVaultingZombie(c.ZOMBIE_START_X + randint(70, 80) + hugeWaveMove, y, self.head_group)) self.zombie_groups[map_y].add(zombie.PoleVaultingZombie(c.ZOMBIE_START_X + randint(70, 80) + hugeWaveMove, y, self.head_group))
elif name == c.ZOMBONI:
self.zombie_groups[map_y].add(zombie.Zomboni(c.ZOMBIE_START_X + randint(0, 20) + hugeWaveMove, y, self.plant_groups[map_y], self.map, plant.IceFrozenPlot))
# 能否种植物的判断: # 能否种植物的判断:
# 先判断位置是否合法 isValid(map_x, map_y) # 先判断位置是否合法 isValid(map_x, map_y)
@ -1035,6 +1037,8 @@ class Level(tool.State):
for i in range(self.map_y_len): for i in range(self.map_y_len):
hypo_zombies = [] hypo_zombies = []
for zombie in self.zombie_groups[i]: for zombie in self.zombie_groups[i]:
if zombie.name == c.ZOMBONI:
continue
if zombie.name in {c.POLE_VAULTING_ZOMBIE} and (not zombie.jumped): if zombie.name in {c.POLE_VAULTING_ZOMBIE} and (not zombie.jumped):
collided_func = pg.sprite.collide_rect_ratio(0.6) collided_func = pg.sprite.collide_rect_ratio(0.6)
else: else:
@ -1104,7 +1108,7 @@ class Level(tool.State):
if zombie.name in {c.POLE_VAULTING_ZOMBIE} and (not zombie.jumped): if zombie.name in {c.POLE_VAULTING_ZOMBIE} and (not zombie.jumped):
if not zombie.jumping: if not zombie.jumping:
zombie.jumpMap_x, zombie.jumpMap_y = self.map.getMapIndex(targetPlant.rect.centerx, targetPlant.rect.centery) zombie.jumpMap_x, zombie.jumpMap_y = self.map.getMapIndex(targetPlant.rect.centerx, targetPlant.rect.centery)
zombie.jumpMap_x, zombie.jumpMap_y = min(c.GRID_X_LEN, zombie.jumpMap_x), min(self.map_y_len, zombie.jumpMap_y) zombie.jumpMap_x, zombie.jumpMap_y = min(c.GRID_X_LEN - 1, zombie.jumpMap_x), min(self.map_y_len - 1, zombie.jumpMap_y)
jumpX = targetPlant.rect.x - c.GRID_X_SIZE * 0.6 jumpX = targetPlant.rect.x - c.GRID_X_SIZE * 0.6
if c.TALLNUT in self.map.map[zombie.jumpMap_y][zombie.jumpMap_x][c.MAP_PLANT]: if c.TALLNUT in self.map.map[zombie.jumpMap_y][zombie.jumpMap_x][c.MAP_PLANT]:
zombie.setJump(False, jumpX) zombie.setJump(False, jumpX)