用很粗略的方式实现撑杆跳僵尸
This commit is contained in:
parent
235b467205
commit
fc89acd3a1
@ -5,7 +5,7 @@
|
|||||||
**本项目为个人python语言学习的练习项目,仅供个人学习和研究使用,不得用于其他用途。如果这个游戏侵犯了版权,请联系我删除**
|
**本项目为个人python语言学习的练习项目,仅供个人学习和研究使用,不得用于其他用途。如果这个游戏侵犯了版权,请联系我删除**
|
||||||
|
|
||||||
* 已有的植物:向日葵,豌豆射手,坚果墙,寒冰射手,樱桃炸弹,双发射手,三线射手,大嘴花,小喷菇,土豆雷,地刺,胆小菇,倭瓜,火爆辣椒,阳光菇,寒冰菇,魅惑菇,火炬树桩,睡莲,杨桃,咖啡豆,海蘑菇,高坚果,缠绕水草,毁灭菇,墓碑吞噬者,大喷菇
|
* 已有的植物:向日葵,豌豆射手,坚果墙,寒冰射手,樱桃炸弹,双发射手,三线射手,大嘴花,小喷菇,土豆雷,地刺,胆小菇,倭瓜,火爆辣椒,阳光菇,寒冰菇,魅惑菇,火炬树桩,睡莲,杨桃,咖啡豆,海蘑菇,高坚果,缠绕水草,毁灭菇,墓碑吞噬者,大喷菇
|
||||||
* 已有的僵尸:普通僵尸,旗帜僵尸,路障僵尸,铁桶僵尸,读报僵尸,橄榄球僵尸,鸭子救生圈僵尸,铁门僵尸
|
* 已有的僵尸:普通僵尸,旗帜僵尸,路障僵尸,铁桶僵尸,读报僵尸,橄榄球僵尸,鸭子救生圈僵尸,铁门僵尸,撑杆跳僵尸
|
||||||
* 使用 JSON 文件记录关卡信息数据
|
* 使用 JSON 文件记录关卡信息数据
|
||||||
* 支持选择植物卡片
|
* 支持选择植物卡片
|
||||||
* 支持白昼模式,夜晚模式,泳池模式,传送带模式和坚果保龄球模式
|
* 支持白昼模式,夜晚模式,泳池模式,传送带模式和坚果保龄球模式
|
||||||
|
|||||||
@ -3,6 +3,6 @@
|
|||||||
"init_sun_value":50,
|
"init_sun_value":50,
|
||||||
"shovel":1,
|
"shovel":1,
|
||||||
"spawn_zombies":"auto",
|
"spawn_zombies":"auto",
|
||||||
"included_zombies":["Zombie", "ConeheadZombie"],
|
"included_zombies":["Zombie", "ConeheadZombie", "PoleVaultingZombie"],
|
||||||
"num_flags":3
|
"num_flags":3
|
||||||
}
|
}
|
||||||
@ -237,8 +237,6 @@ class Plant(pg.sprite.Sprite):
|
|||||||
self.hit_timer = 0
|
self.hit_timer = 0
|
||||||
# 被铲子指向时间
|
# 被铲子指向时间
|
||||||
self.highlightTime = 0
|
self.highlightTime = 0
|
||||||
# 是否能被越过
|
|
||||||
self.skipable = True
|
|
||||||
|
|
||||||
def loadFrames(self, frames, name, scale, color=c.BLACK):
|
def loadFrames(self, frames, name, scale, color=c.BLACK):
|
||||||
frame_list = tool.GFX[name]
|
frame_list = tool.GFX[name]
|
||||||
@ -1362,8 +1360,6 @@ class TallNut(Plant):
|
|||||||
self.load_images()
|
self.load_images()
|
||||||
self.cracked1 = False
|
self.cracked1 = False
|
||||||
self.cracked2 = False
|
self.cracked2 = False
|
||||||
# 高坚果不能被撑杆跳僵尸和海豚骑士僵尸跳过,虽然目前还没有引入撑杆跳僵尸和海豚骑士僵尸
|
|
||||||
self.skipable = False
|
|
||||||
|
|
||||||
def load_images(self):
|
def load_images(self):
|
||||||
self.cracked1_frames = []
|
self.cracked1_frames = []
|
||||||
|
|||||||
@ -851,6 +851,7 @@ class PoleVaultingZombie(Zombie):
|
|||||||
Zombie.__init__(self, x, y, c.POLE_VAULTING_ZOMBIE, head_group=head_group)
|
Zombie.__init__(self, x, y, c.POLE_VAULTING_ZOMBIE, head_group=head_group)
|
||||||
self.speed = 1.88
|
self.speed = 1.88
|
||||||
self.jumped = False
|
self.jumped = False
|
||||||
|
self.jumping = False
|
||||||
|
|
||||||
def loadImages(self):
|
def loadImages(self):
|
||||||
self.walk_frames = []
|
self.walk_frames = []
|
||||||
@ -859,29 +860,62 @@ class PoleVaultingZombie(Zombie):
|
|||||||
self.losthead_attack_frames = []
|
self.losthead_attack_frames = []
|
||||||
self.die_frames = []
|
self.die_frames = []
|
||||||
self.boomdie_frames = []
|
self.boomdie_frames = []
|
||||||
self.walk_after_jump_frames = []
|
self.walk_before_jump_frames = []
|
||||||
self.jump_frames = []
|
self.jump_frames = []
|
||||||
|
|
||||||
walk_name = self.name
|
walk_name = self.name + 'WalkAfterJump'
|
||||||
attack_name = self.name + 'Attack'
|
attack_name = self.name + 'Attack'
|
||||||
losthead_walk_name = self.name + 'LostHead'
|
losthead_walk_name = self.name + 'LostHead'
|
||||||
losthead_attack_name = self.name + 'LostHeadAttack'
|
losthead_attack_name = self.name + 'LostHeadAttack'
|
||||||
die_name = self.name + 'Die'
|
die_name = self.name + 'Die'
|
||||||
boomdie_name = c.BOOMDIE
|
boomdie_name = c.BOOMDIE
|
||||||
walk_after_jump_name = self.name + 'WalkAfterJump'
|
walk_before_jump_name = self.name
|
||||||
jump_name = self.name + 'Jump'
|
jump_name = self.name + 'Jump'
|
||||||
|
|
||||||
frame_list = [self.walk_frames, self.attack_frames, self.losthead_walk_frames,
|
frame_list = [self.walk_frames, self.attack_frames, self.losthead_walk_frames,
|
||||||
self.losthead_attack_frames, self.die_frames, self.boomdie_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,
|
name_list = [walk_name, attack_name, losthead_walk_name,
|
||||||
losthead_attack_name, die_name, boomdie_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):
|
for i, name in enumerate(name_list):
|
||||||
self.loadFrames(frame_list[i], name)
|
self.loadFrames(frame_list[i], name)
|
||||||
|
|
||||||
self.frames = self.walk_frames
|
self.frames = self.walk_before_jump_frames
|
||||||
|
|
||||||
def setJump(self):
|
def setJump(self, successfullyJumped):
|
||||||
|
if not self.jumping:
|
||||||
|
self.jumping = True
|
||||||
self.changeFrames(self.jump_frames)
|
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)
|
||||||
|
|||||||
@ -166,7 +166,7 @@ PANEL_Y_INTERNAL = 73
|
|||||||
PANEL_X_INTERNAL = 53
|
PANEL_X_INTERNAL = 53
|
||||||
BAR_CARD_X_INTERNAL = 51
|
BAR_CARD_X_INTERNAL = 51
|
||||||
CARD_MAX_NUM = 10 # 这里以后可以增加解锁功能,从最初的6格逐渐解锁到10格
|
CARD_MAX_NUM = 10 # 这里以后可以增加解锁功能,从最初的6格逐渐解锁到10格
|
||||||
CARD_LIST_NUM = CARD_MAX_NUM
|
CARD_LIST_NUM = 0#CARD_MAX_NUM
|
||||||
|
|
||||||
# 所选植物信息索引
|
# 所选植物信息索引
|
||||||
PLANT_NAME_INDEX = 0
|
PLANT_NAME_INDEX = 0
|
||||||
|
|||||||
@ -418,6 +418,7 @@ class Level(tool.State):
|
|||||||
c.CONEHEAD_DUCKY_TUBE_ZOMBIE:(2, 0), # 作为变种,不主动生成
|
c.CONEHEAD_DUCKY_TUBE_ZOMBIE:(2, 0), # 作为变种,不主动生成
|
||||||
c.BUCKETHEAD_DUCKY_TUBE_ZOMBIE:(4, 0), # 作为变种,不主动生成
|
c.BUCKETHEAD_DUCKY_TUBE_ZOMBIE:(4, 0), # 作为变种,不主动生成
|
||||||
c.SCREEN_DOOR_ZOMBIE:(4, 3500),
|
c.SCREEN_DOOR_ZOMBIE:(4, 3500),
|
||||||
|
c.POLE_VAULTING_ZOMBIE:(2, 2000),
|
||||||
}
|
}
|
||||||
# 将僵尸与水上变种对应
|
# 将僵尸与水上变种对应
|
||||||
self.convertZombieInPool = {c.NORMAL_ZOMBIE:c.DUCKY_TUBE_ZOMBIE,
|
self.convertZombieInPool = {c.NORMAL_ZOMBIE:c.DUCKY_TUBE_ZOMBIE,
|
||||||
@ -1067,8 +1068,12 @@ class Level(tool.State):
|
|||||||
|
|
||||||
if targetPlant:
|
if targetPlant:
|
||||||
# 撑杆跳的特殊情况
|
# 撑杆跳的特殊情况
|
||||||
if zombie.name == c.POLE_VAULTING_ZOMBIE and (not zombie.jumped):
|
if zombie.name in {c.POLE_VAULTING_ZOMBIE} and (not zombie.jumped):
|
||||||
zombie.setJump()
|
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
|
continue
|
||||||
|
|
||||||
if targetPlant.name == c.WALLNUTBOWLING:
|
if targetPlant.name == c.WALLNUTBOWLING:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user