217 lines
9.5 KiB
Python
217 lines
9.5 KiB
Python
import os
|
|
import pygame as pg
|
|
from .. import tool
|
|
from .. import constants as c
|
|
|
|
class Screen(tool.State):
|
|
def __init__(self):
|
|
tool.State.__init__(self)
|
|
|
|
def startup(self, current_time, persist):
|
|
pass
|
|
|
|
def setupImage(self, name, frame_rect=(0, 0, 800, 600), color_key=c.BLACK):
|
|
# 背景图本身
|
|
self.image = tool.get_image(tool.GFX[name], *frame_rect, colorkey=color_key)
|
|
self.rect = self.image.get_rect()
|
|
self.rect.x = 0
|
|
self.rect.y = 0
|
|
|
|
# 按钮
|
|
frame_rect = (0, 0, 111, 26)
|
|
## 主菜单按钮
|
|
self.main_menu_button_image = tool.get_image_menu(tool.GFX[c.UNIVERSAL_BUTTON], *frame_rect)
|
|
self.main_menu_button_image_rect = self.main_menu_button_image.get_rect()
|
|
self.main_menu_button_image_rect.x = 620
|
|
### 主菜单按钮上的文字
|
|
font = pg.font.Font(c.FONT_PATH, 18)
|
|
main_menu_text = font.render("主菜单", True, c.NAVYBLUE)
|
|
main_menu_text_rect = main_menu_text.get_rect()
|
|
main_menu_text_rect.x = 29
|
|
## 继续按钮
|
|
self.next_button_image = tool.get_image_menu(tool.GFX[c.UNIVERSAL_BUTTON], *frame_rect)
|
|
self.next_button_image_rect = self.next_button_image.get_rect()
|
|
self.next_button_image_rect.x = 70
|
|
### 继续按钮上的文字
|
|
if name == c.GAME_VICTORY_IMAGE:
|
|
next_text = font.render("下一关", True, c.NAVYBLUE)
|
|
next_text_rect = next_text.get_rect()
|
|
next_text_rect.x = 29
|
|
self.next_button_image_rect.y = self.main_menu_button_image_rect.y = 555
|
|
else:
|
|
next_text = font.render("重新开始", True, c.NAVYBLUE)
|
|
next_text_rect = next_text.get_rect()
|
|
next_text_rect.x = 21
|
|
self.next_button_image_rect.y = self.main_menu_button_image_rect.y = 530
|
|
self.next_button_image.blit(next_text, next_text_rect)
|
|
self.main_menu_button_image.blit(main_menu_text, main_menu_text_rect)
|
|
self.image.blit(self.next_button_image, self.next_button_image_rect)
|
|
self.image.blit(self.main_menu_button_image, self.main_menu_button_image_rect)
|
|
|
|
def update(self, surface, current_time, mouse_pos, mouse_click):
|
|
surface.fill(c.WHITE)
|
|
surface.blit(self.image, self.rect)
|
|
if mouse_pos:
|
|
# 点到继续
|
|
if self.inArea(self.next_button_image_rect, *mouse_pos):
|
|
self.next = c.LEVEL
|
|
self.done = True
|
|
# 点到主菜单
|
|
elif self.inArea(self.main_menu_button_image_rect, *mouse_pos):
|
|
self.next = c.MAIN_MENU
|
|
self.done = True
|
|
|
|
class GameVictoryScreen(Screen):
|
|
def __init__(self):
|
|
Screen.__init__(self)
|
|
self.image_name = c.GAME_VICTORY_IMAGE
|
|
|
|
def startup(self, current_time, persist):
|
|
self.start_time = current_time
|
|
self.persist = persist
|
|
self.game_info = persist
|
|
self.setupImage(self.image_name)
|
|
pg.display.set_caption("pypvz: 战斗胜利!")
|
|
pg.mixer.music.stop()
|
|
pg.mixer.music.load(os.path.join(c.PATH_MUSIC_DIR, "zenGarden.opus"))
|
|
pg.mixer.music.play(-1, 0)
|
|
pg.mixer.music.set_volume(self.game_info[c.SOUND_VOLUME])
|
|
|
|
class GameLoseScreen(Screen):
|
|
def __init__(self):
|
|
Screen.__init__(self)
|
|
self.image_name = c.GAME_LOSE_IMAGE
|
|
|
|
def startup(self, current_time, persist):
|
|
self.start_time = current_time
|
|
self.persist = persist
|
|
self.game_info = persist
|
|
self.setupImage(self.image_name, (-118, -40, 800, 600), c.WHITE)
|
|
pg.display.set_caption("pypvz: 战斗失败!")
|
|
# 停止播放原来关卡中的音乐
|
|
pg.mixer.music.stop()
|
|
|
|
class AwardScreen(tool.State):
|
|
def __init__(self):
|
|
tool.State.__init__(self)
|
|
|
|
def setupImage(self):
|
|
# 主体
|
|
frame_rect = (0, 0, 800, 600)
|
|
self.image = tool.get_image(tool.GFX[c.AWARD_SCREEN_IMAGE], *frame_rect)
|
|
self.rect = self.image.get_rect()
|
|
self.rect.x = 0
|
|
self.rect.y = 0
|
|
|
|
# 文字
|
|
# 标题处文字
|
|
font = pg.font.Font(c.FONT_PATH, 37)
|
|
title_text = font.render("您获得了新的战利品!", True, c.PARCHMENT_YELLOW)
|
|
title_text_rect = title_text.get_rect()
|
|
title_text_rect.x = 220
|
|
title_text_rect.y = 23
|
|
self.image.blit(title_text, title_text_rect)
|
|
|
|
# 按钮
|
|
frame_rect = (0, 0, 111, 26)
|
|
if self.show_only_one_option:
|
|
## 主菜单按钮
|
|
self.main_menu_button_image = tool.get_image_menu(tool.GFX[c.UNIVERSAL_BUTTON], *frame_rect)
|
|
self.main_menu_button_image_rect = self.main_menu_button_image.get_rect()
|
|
self.main_menu_button_image_rect.x = 343
|
|
self.main_menu_button_image_rect.y = 520
|
|
### 主菜单按钮上的文字
|
|
font = pg.font.Font(c.FONT_PATH, 18)
|
|
main_menu_text = font.render("主菜单", True, c.NAVYBLUE)
|
|
main_menu_text_rect = main_menu_text.get_rect()
|
|
main_menu_text_rect.x = 29
|
|
self.main_menu_button_image.blit(main_menu_text, main_menu_text_rect)
|
|
self.image.blit(self.main_menu_button_image, self.main_menu_button_image_rect)
|
|
else:
|
|
## 继续按钮
|
|
self.next_button_image = tool.get_image_menu(tool.GFX[c.UNIVERSAL_BUTTON], *frame_rect)
|
|
self.next_button_image_rect = self.next_button_image.get_rect()
|
|
self.next_button_image_rect.x = 70
|
|
### 继续按钮上的文字
|
|
font = pg.font.Font(c.FONT_PATH, 18)
|
|
next_text = font.render("继续", True, c.NAVYBLUE)
|
|
next_text_rect = next_text.get_rect()
|
|
next_text_rect.x = 37
|
|
## 主菜单按钮
|
|
self.main_menu_button_image = tool.get_image_menu(tool.GFX[c.UNIVERSAL_BUTTON], *frame_rect)
|
|
self.main_menu_button_image_rect = self.main_menu_button_image.get_rect()
|
|
self.main_menu_button_image_rect.x = 620
|
|
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_rect = main_menu_text.get_rect()
|
|
main_menu_text_rect.x = 29
|
|
self.next_button_image.blit(next_text, next_text_rect)
|
|
self.main_menu_button_image.blit(main_menu_text, main_menu_text_rect)
|
|
self.image.blit(self.next_button_image, self.next_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.LEVEL_COMPLETIONS] and self.game_info[c.LITTLEGAME_COMPLETIONS]):
|
|
frame_rect = (157, 0, 157, 269)
|
|
intro_title = "金向日葵奖杯"
|
|
intro_content = "您已通过所有关卡,获得此奖励!"
|
|
else:
|
|
frame_rect = (0, 0, 157, 269)
|
|
intro_title = "银向日葵奖杯"
|
|
if self.game_info[c.LEVEL_COMPLETIONS]:
|
|
intro_content = "您已完成冒险模式,获得此奖励!"
|
|
else:
|
|
intro_content = "您已完成玩玩小游戏,获得此奖励!"
|
|
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 = 108
|
|
self.image.blit(sunflower_trophy_image, sunflower_trophy_rect)
|
|
|
|
# 绘制介绍标题
|
|
font = pg.font.Font(c.FONT_PATH, 22)
|
|
intro_title_img = font.render(intro_title, True, c.PARCHMENT_YELLOW)
|
|
intro_title_rect = intro_title_img.get_rect()
|
|
intro_title_rect.x = 333
|
|
intro_title_rect.y = 305
|
|
self.image.blit(intro_title_img, intro_title_rect)
|
|
|
|
# 绘制介绍内容
|
|
font = pg.font.Font(c.FONT_PATH, 15)
|
|
intro_content_img = font.render(intro_content, True, c.NAVYBLUE)
|
|
intro_content_rect = intro_content_img.get_rect()
|
|
intro_content_rect.x = 290
|
|
intro_content_rect.y = 370
|
|
self.image.blit(intro_content_img, intro_content_rect)
|
|
|
|
|
|
def startup(self, current_time, persist):
|
|
self.start_time = current_time
|
|
self.persist = 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()
|
|
pg.display.set_caption("pypvz: 您获得了新的战利品!")
|
|
pg.mixer.music.stop()
|
|
pg.mixer.music.load(os.path.join(c.PATH_MUSIC_DIR, "zenGarden.opus"))
|
|
pg.mixer.music.play(-1, 0)
|
|
pg.mixer.music.set_volume(self.game_info[c.SOUND_VOLUME])
|
|
|
|
def update(self, surface, current_time, mouse_pos, mouse_click):
|
|
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
|