增加向日葵奖杯获得界面
This commit is contained in:
parent
c80df793c4
commit
14f485e8f5
2
pypvz.py
2
pypvz.py
@ -16,7 +16,7 @@ if __name__=="__main__":
|
|||||||
if not os.path.exists(os.path.dirname(c.USERLOG_PATH)):
|
if not os.path.exists(os.path.dirname(c.USERLOG_PATH)):
|
||||||
os.makedirs(os.path.dirname(c.USERLOG_PATH))
|
os.makedirs(os.path.dirname(c.USERLOG_PATH))
|
||||||
logger = logging.getLogger("main")
|
logger = logging.getLogger("main")
|
||||||
formatter = logging.Formatter("%(asctime)s: %(message)s")
|
formatter = logging.Formatter("%(asctime)s - %(levelname)s: %(message)s")
|
||||||
fileHandler = RotatingFileHandler(c.USERLOG_PATH, "a", 1024*1024, 0, "utf-8")
|
fileHandler = RotatingFileHandler(c.USERLOG_PATH, "a", 1024*1024, 0, "utf-8")
|
||||||
fileHandler.setFormatter(formatter)
|
fileHandler.setFormatter(formatter)
|
||||||
streamHandler = logging.StreamHandler()
|
streamHandler = logging.StreamHandler()
|
||||||
|
|||||||
@ -95,6 +95,7 @@ LEVEL_PROGRESS_FLAG = "LevelProgressFlag"
|
|||||||
|
|
||||||
# GAME INFO字典键值
|
# GAME INFO字典键值
|
||||||
CURRENT_TIME = "current time"
|
CURRENT_TIME = "current time"
|
||||||
|
PASSED_ALL = "passed all" # 已完成该模式下的所有游戏,应当显示向日葵奖杯获得界面
|
||||||
LEVEL_NUM = "level num"
|
LEVEL_NUM = "level num"
|
||||||
LITTLEGAME_NUM = "littleGame num"
|
LITTLEGAME_NUM = "littleGame num"
|
||||||
LEVEL_COMPLETIONS = "level completions"
|
LEVEL_COMPLETIONS = "level completions"
|
||||||
|
|||||||
@ -25,8 +25,7 @@ class Level(tool.State):
|
|||||||
self.showLittleMenu = False
|
self.showLittleMenu = False
|
||||||
|
|
||||||
# 导入地图参数
|
# 导入地图参数
|
||||||
# 采用了容错设计,如果没有导入成功就不执行
|
self.loadMap()
|
||||||
if self.loadMap(): # 表示导入成功
|
|
||||||
self.map = map.Map(self.map_data[c.BACKGROUND_TYPE])
|
self.map = map.Map(self.map_data[c.BACKGROUND_TYPE])
|
||||||
self.map_y_len = self.map.height
|
self.map_y_len = self.map.height
|
||||||
self.setupBackground()
|
self.setupBackground()
|
||||||
@ -47,25 +46,19 @@ class Level(tool.State):
|
|||||||
if 0 <= self.game_info[c.LEVEL_NUM] < map.TOTAL_LEVEL:
|
if 0 <= self.game_info[c.LEVEL_NUM] < map.TOTAL_LEVEL:
|
||||||
self.map_data = map.LEVEL_MAP_DATA[self.game_info[c.LEVEL_NUM]]
|
self.map_data = map.LEVEL_MAP_DATA[self.game_info[c.LEVEL_NUM]]
|
||||||
else:
|
else:
|
||||||
print("成功通关冒险模式!")
|
|
||||||
self.game_info[c.LEVEL_NUM] = 1
|
self.game_info[c.LEVEL_NUM] = 1
|
||||||
self.game_info[c.LEVEL_COMPLETIONS] += 1
|
|
||||||
self.done = True
|
|
||||||
self.next = c.LEVEL
|
|
||||||
self.saveUserData()
|
self.saveUserData()
|
||||||
return
|
self.map_data = map.LEVEL_MAP_DATA[self.game_info[c.LEVEL_NUM]]
|
||||||
|
logger.warning("关卡数设定错误!进入默认的第一关!")
|
||||||
# 小游戏模式
|
# 小游戏模式
|
||||||
elif self.game_info[c.GAME_MODE] == c.MODE_LITTLEGAME:
|
elif self.game_info[c.GAME_MODE] == c.MODE_LITTLEGAME:
|
||||||
if 0 <= self.game_info[c.LITTLEGAME_NUM] < map.TOTAL_LITTLE_GAME:
|
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]]
|
self.map_data = map.LITTLE_GAME_MAP_DATA[self.game_info[c.LITTLEGAME_NUM]]
|
||||||
else:
|
else:
|
||||||
print("成功通关玩玩小游戏!")
|
|
||||||
self.game_info[c.LITTLEGAME_NUM] = 1
|
self.game_info[c.LITTLEGAME_NUM] = 1
|
||||||
self.game_info[c.LITTLEGAME_COMPLETIONS] += 1
|
|
||||||
self.done = True
|
|
||||||
self.next = c.MAIN_MENU
|
|
||||||
self.saveUserData()
|
self.saveUserData()
|
||||||
return
|
self.map_data = map.LITTLE_GAME_MAP_DATA[self.game_info[c.LITTLEGAME_NUM]]
|
||||||
|
logger.warning("关卡数设定错误!进入默认的第一关!")
|
||||||
# 是否有铲子的信息:无铲子时为0,有铲子时为1,故直接赋值即可
|
# 是否有铲子的信息:无铲子时为0,有铲子时为1,故直接赋值即可
|
||||||
self.hasShovel = self.map_data[c.SHOVEL]
|
self.hasShovel = self.map_data[c.SHOVEL]
|
||||||
|
|
||||||
@ -90,8 +83,6 @@ class Level(tool.State):
|
|||||||
# 浓雾
|
# 浓雾
|
||||||
elif self.map_data[c.BACKGROUND_TYPE] == c.BACKGROUND_FOG:
|
elif self.map_data[c.BACKGROUND_TYPE] == c.BACKGROUND_FOG:
|
||||||
self.bgm = 'fogLevel.opus'
|
self.bgm = 'fogLevel.opus'
|
||||||
# 表示成功加载地图
|
|
||||||
return True
|
|
||||||
|
|
||||||
def setupBackground(self):
|
def setupBackground(self):
|
||||||
img_index = self.map_data[c.BACKGROUND_TYPE]
|
img_index = self.map_data[c.BACKGROUND_TYPE]
|
||||||
@ -152,7 +143,7 @@ class Level(tool.State):
|
|||||||
zombieList.append(newZombie)
|
zombieList.append(newZombie)
|
||||||
volume -= c.CREATE_ZOMBIE_DICT[newZombie][0]
|
volume -= c.CREATE_ZOMBIE_DICT[newZombie][0]
|
||||||
if volume < 0:
|
if volume < 0:
|
||||||
logger.warning(f'警告:第{wave}波中手动设置的僵尸级别总数超过上限!')
|
logger.warning(f'第{wave}波中手动设置的僵尸级别总数超过上限!')
|
||||||
|
|
||||||
# 防止因为僵尸最小等级过大,使得总容量无法完全利用,造成死循环的检查机制
|
# 防止因为僵尸最小等级过大,使得总容量无法完全利用,造成死循环的检查机制
|
||||||
minCost = c.CREATE_ZOMBIE_DICT[min(useableZombies, key=lambda x:c.CREATE_ZOMBIE_DICT[x][0])][0]
|
minCost = c.CREATE_ZOMBIE_DICT[min(useableZombies, key=lambda x:c.CREATE_ZOMBIE_DICT[x][0])][0]
|
||||||
@ -333,9 +324,6 @@ class Level(tool.State):
|
|||||||
|
|
||||||
# 更新函数每帧被调用,将鼠标事件传入给状态处理函数
|
# 更新函数每帧被调用,将鼠标事件传入给状态处理函数
|
||||||
def update(self, surface, current_time, mouse_pos, mouse_click):
|
def update(self, surface, current_time, mouse_pos, mouse_click):
|
||||||
# 这些内容是将来增加通过界面后的容错设计,以保证直接通关时不会闪退
|
|
||||||
if self.done:
|
|
||||||
return
|
|
||||||
self.current_time = self.game_info[c.CURRENT_TIME] = self.pvzTime(current_time)
|
self.current_time = self.game_info[c.CURRENT_TIME] = self.pvzTime(current_time)
|
||||||
if self.state == c.CHOOSE:
|
if self.state == c.CHOOSE:
|
||||||
self.choose(mouse_pos, mouse_click)
|
self.choose(mouse_pos, mouse_click)
|
||||||
@ -1433,14 +1421,30 @@ class Level(tool.State):
|
|||||||
|
|
||||||
def checkGameState(self):
|
def checkGameState(self):
|
||||||
if self.checkVictory():
|
if self.checkVictory():
|
||||||
if self.game_info[c.GAME_MODE] == c.MODE_LITTLEGAME:
|
# 播放胜利音效
|
||||||
self.game_info[c.LITTLEGAME_NUM] += 1
|
c.SOUND_WIN.play()
|
||||||
elif self.game_info[c.GAME_MODE] == c.MODE_ADVENTURE:
|
if self.game_info[c.GAME_MODE] == c.MODE_ADVENTURE:
|
||||||
self.game_info[c.LEVEL_NUM] += 1
|
self.game_info[c.LEVEL_NUM] += 1
|
||||||
|
if self.game_info[c.LEVEL_NUM] >= map.TOTAL_LEVEL:
|
||||||
|
self.game_info[c.LEVEL_COMPLETIONS] += 1
|
||||||
|
self.game_info[c.LEVEL_NUM] = 1
|
||||||
|
self.next = c.AWARD_SCREEN
|
||||||
|
else:
|
||||||
|
self.next = c.GAME_VICTORY
|
||||||
|
elif self.game_info[c.GAME_MODE] == c.MODE_LITTLEGAME:
|
||||||
|
self.game_info[c.LITTLEGAME_NUM] += 1
|
||||||
|
if self.game_info[c.LITTLEGAME_NUM] > map.TOTAL_LITTLE_GAME:
|
||||||
|
self.game_info[c.LITTLEGAME_COMPLETIONS] += 1
|
||||||
|
self.game_info[c.LITTLEGAME_NUM] = 1
|
||||||
|
self.next = c.AWARD_SCREEN
|
||||||
|
else:
|
||||||
self.next = c.GAME_VICTORY
|
self.next = c.GAME_VICTORY
|
||||||
self.done = True
|
self.done = True
|
||||||
self.saveUserData()
|
self.saveUserData()
|
||||||
elif self.checkLose():
|
elif self.checkLose():
|
||||||
|
# 播放失败音效
|
||||||
|
c.SOUND_LOSE.play()
|
||||||
|
c.SOUND_SCREAM.play()
|
||||||
self.next = c.GAME_LOSE
|
self.next = c.GAME_LOSE
|
||||||
self.done = True
|
self.done = True
|
||||||
|
|
||||||
|
|||||||
@ -48,8 +48,6 @@ class GameVictoryScreen(Screen):
|
|||||||
self.setupImage(name)
|
self.setupImage(name)
|
||||||
self.next = self.set_next_state()
|
self.next = self.set_next_state()
|
||||||
pg.display.set_caption("pypvz: 战斗胜利!")
|
pg.display.set_caption("pypvz: 战斗胜利!")
|
||||||
# 播放胜利音效
|
|
||||||
c.SOUND_WIN.play()
|
|
||||||
|
|
||||||
class GameLoseScreen(Screen):
|
class GameLoseScreen(Screen):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@ -70,15 +68,12 @@ class GameLoseScreen(Screen):
|
|||||||
self.setupImage(name, (-15, 0, 800, 600))
|
self.setupImage(name, (-15, 0, 800, 600))
|
||||||
self.next = self.set_next_state()
|
self.next = self.set_next_state()
|
||||||
pg.display.set_caption("pypvz: 战斗失败!")
|
pg.display.set_caption("pypvz: 战斗失败!")
|
||||||
# 播放失败音效
|
|
||||||
c.SOUND_LOSE.play()
|
|
||||||
c.SOUND_SCREAM.play()
|
|
||||||
|
|
||||||
class AwardScreen(tool.State):
|
class AwardScreen(tool.State):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
tool.State.__init__(self)
|
tool.State.__init__(self)
|
||||||
|
|
||||||
def setupImage(self, gainedTrophy=True):
|
def setupImage(self):
|
||||||
# 主体
|
# 主体
|
||||||
frame_rect = (0, 0, 800, 600)
|
frame_rect = (0, 0, 800, 600)
|
||||||
self.image = tool.get_image(tool.GFX[c.AWARD_SCREEN_IMAGE], *frame_rect)
|
self.image = tool.get_image(tool.GFX[c.AWARD_SCREEN_IMAGE], *frame_rect)
|
||||||
@ -97,53 +92,78 @@ class AwardScreen(tool.State):
|
|||||||
|
|
||||||
# 按钮
|
# 按钮
|
||||||
frame_rect = (0, 0, 111, 26)
|
frame_rect = (0, 0, 111, 26)
|
||||||
if gainedTrophy:
|
if self.show_only_one_option:
|
||||||
## 主菜单按钮
|
## 主菜单按钮
|
||||||
main_menu_button_image = tool.get_image(tool.GFX[c.UNIVERSAL_BUTTON], *frame_rect)
|
self.main_menu_button_image = tool.get_image_menu(tool.GFX[c.UNIVERSAL_BUTTON], *frame_rect)
|
||||||
main_menu_button_image_rect = main_menu_button_image.get_rect()
|
self.main_menu_button_image_rect = self.main_menu_button_image.get_rect()
|
||||||
main_menu_button_image_rect.x = 343
|
self.main_menu_button_image_rect.x = 343
|
||||||
main_menu_button_image_rect.y = 520
|
self.main_menu_button_image_rect.y = 520
|
||||||
### 主菜单按钮上的文字
|
### 主菜单按钮上的文字
|
||||||
font = pg.font.Font(c.FONT_PATH, 18)
|
font = pg.font.Font(c.FONT_PATH, 18)
|
||||||
main_menu_text = font.render("主菜单", True, c.NAVYBLUE)
|
main_menu_text = font.render("主菜单", True, c.NAVYBLUE)
|
||||||
main_menu_text_rect = main_menu_text.get_rect()
|
main_menu_text_rect = main_menu_text.get_rect()
|
||||||
main_menu_text_rect.x = 29
|
main_menu_text_rect.x = 29
|
||||||
main_menu_button_image.blit(main_menu_text, main_menu_text_rect)
|
self.main_menu_button_image.blit(main_menu_text, main_menu_text_rect)
|
||||||
self.image.blit(main_menu_button_image, main_menu_button_image_rect)
|
self.image.blit(self.main_menu_button_image, self.main_menu_button_image_rect)
|
||||||
else:
|
else:
|
||||||
## 继续按钮
|
## 继续按钮
|
||||||
next_button_image = tool.get_image(tool.GFX[c.UNIVERSAL_BUTTON], *frame_rect)
|
self.next_button_image = tool.get_image_menu(tool.GFX[c.UNIVERSAL_BUTTON], *frame_rect)
|
||||||
next_button_image_rect = next_button_image.get_rect()
|
self.next_button_image_rect = self.next_button_image.get_rect()
|
||||||
next_button_image_rect.x = 70
|
self.next_button_image_rect.x = 70
|
||||||
### 继续按钮上的文字
|
### 继续按钮上的文字
|
||||||
font = pg.font.Font(c.FONT_PATH, 18)
|
font = pg.font.Font(c.FONT_PATH, 18)
|
||||||
next_text = font.render("继续", True, c.NAVYBLUE)
|
next_text = font.render("继续", True, c.NAVYBLUE)
|
||||||
next_text_rect = next_text.get_rect()
|
next_text_rect = next_text.get_rect()
|
||||||
next_text_rect.x = 37
|
next_text_rect.x = 37
|
||||||
## 主菜单按钮
|
## 主菜单按钮
|
||||||
main_menu_button_image = tool.get_image(tool.GFX[c.UNIVERSAL_BUTTON], *frame_rect)
|
self.main_menu_button_image = tool.get_image_menu(tool.GFX[c.UNIVERSAL_BUTTON], *frame_rect)
|
||||||
main_menu_button_image_rect = main_menu_button_image.get_rect()
|
self.main_menu_button_image_rect = self.main_menu_button_image.get_rect()
|
||||||
main_menu_button_image_rect.x = 620
|
self.main_menu_button_image_rect.x = 620
|
||||||
next_button_image_rect.y = main_menu_button_image_rect.y = 540
|
self.next_button_image_rect.y = self.main_menu_button_image_rect.y = 540
|
||||||
### 主菜单按钮上的文字
|
### 主菜单按钮上的文字
|
||||||
main_menu_text = font.render("主菜单", True, c.NAVYBLUE)
|
main_menu_text = font.render("主菜单", True, c.NAVYBLUE)
|
||||||
main_menu_text_rect = main_menu_text.get_rect()
|
main_menu_text_rect = main_menu_text.get_rect()
|
||||||
main_menu_text_rect.x = 29
|
main_menu_text_rect.x = 29
|
||||||
next_button_image.blit(next_text, next_text_rect)
|
self.next_button_image.blit(next_text, next_text_rect)
|
||||||
main_menu_button_image.blit(main_menu_text, main_menu_text_rect)
|
self.main_menu_button_image.blit(main_menu_text, main_menu_text_rect)
|
||||||
self.image.blit(next_button_image, next_button_image_rect)
|
self.image.blit(self.next_button_image, self.next_button_image_rect)
|
||||||
self.image.blit(main_menu_button_image, main_menu_button_image_rect)
|
self.image.blit(self.main_menu_button_image, self.main_menu_button_image_rect)
|
||||||
|
|
||||||
|
# 显示向日葵奖杯的情况
|
||||||
|
if self.show_only_one_option:
|
||||||
|
if self.game_info[c.LITTLEGAME_COMPLETIONS]:
|
||||||
|
frame_rect = (157, 0, 157, 269)
|
||||||
|
else:
|
||||||
|
frame_rect = (0, 0, 157, 269)
|
||||||
|
sunflower_trophy_image = tool.get_image_menu(tool.GFX[c.TROPHY_SUNFLOWER], *frame_rect, scale=0.7)
|
||||||
|
sunflower_trophy_rect = sunflower_trophy_image.get_rect()
|
||||||
|
sunflower_trophy_rect.x = 348
|
||||||
|
sunflower_trophy_rect.y = 110
|
||||||
|
self.image.blit(sunflower_trophy_image, sunflower_trophy_rect)
|
||||||
|
|
||||||
def startup(self, current_time, persist):
|
def startup(self, current_time, persist):
|
||||||
self.start_time = current_time
|
self.start_time = current_time
|
||||||
self.persist = persist
|
self.persist = persist
|
||||||
self.game_info = persist
|
self.game_info = persist
|
||||||
|
if (c.PASSED_ALL in self.game_info) and (not self.game_info[c.PASSED_ALL]):
|
||||||
|
self.show_only_one_option = False
|
||||||
|
else:
|
||||||
|
self.show_only_one_option = True
|
||||||
self.setupImage()
|
self.setupImage()
|
||||||
|
pg.display.set_caption("pypvz: 您获得了新的战利品!")
|
||||||
|
|
||||||
def update(self, surface, current_time, mouse_pos, mouse_click):
|
def update(self, surface, current_time, mouse_pos, mouse_click):
|
||||||
surface.fill(c.WHITE)
|
surface.fill(c.WHITE)
|
||||||
surface.blit(self.image, self.rect)
|
surface.blit(self.image, self.rect)
|
||||||
|
if mouse_pos:
|
||||||
|
# 检查主菜单点击
|
||||||
|
if self.inArea(self.main_menu_button_image_rect, *mouse_pos):
|
||||||
|
self.next = c.MAIN_MENU
|
||||||
|
self.done = True
|
||||||
|
elif not self.show_only_one_option:
|
||||||
|
if self.inArea(self.next_button_image_rect, *mouse_pos):
|
||||||
|
self.next = c.LEVEL
|
||||||
|
self.done = True
|
||||||
|
|
||||||
def inArea(self, rect, x, y):
|
def inArea(self, rect, x, y):
|
||||||
if (x >= rect.x and x <= rect.right and
|
if (x >= rect.x and x <= rect.right and
|
||||||
|
|||||||
@ -130,6 +130,7 @@ class Control():
|
|||||||
self.clock.tick(self.fps)
|
self.clock.tick(self.fps)
|
||||||
|
|
||||||
def get_image(sheet, x, y, width, height, colorkey=c.BLACK, scale=1):
|
def get_image(sheet, x, y, width, height, colorkey=c.BLACK, scale=1):
|
||||||
|
# 不保留alpha通道的图片导入
|
||||||
image = pg.Surface([width, height])
|
image = pg.Surface([width, height])
|
||||||
rect = image.get_rect()
|
rect = image.get_rect()
|
||||||
|
|
||||||
@ -142,7 +143,7 @@ def get_image(sheet, x, y, width, height, colorkey=c.BLACK, scale=1):
|
|||||||
return image
|
return image
|
||||||
|
|
||||||
def get_image_menu(sheet, x, y, width, height, colorkey=c.BLACK, scale=1):
|
def get_image_menu(sheet, x, y, width, height, colorkey=c.BLACK, scale=1):
|
||||||
# 一定要保留阿尔法通道,修复主菜单bug,游戏中car显示又有bug
|
# 保留alpha通道的图片导入
|
||||||
image = pg.Surface([width, height], SRCALPHA)
|
image = pg.Surface([width, height], SRCALPHA)
|
||||||
rect = image.get_rect()
|
rect = image.get_rect()
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user