增加向日葵奖杯获得界面

This commit is contained in:
星外之神 2022-07-29 14:54:53 +08:00
parent c80df793c4
commit 14f485e8f5
5 changed files with 78 additions and 52 deletions

View File

@ -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()

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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()