改进日志;初步引入新界面

This commit is contained in:
星外之神 2022-07-29 14:01:32 +08:00
parent 698f2cbae9
commit c80df793c4
5 changed files with 99 additions and 24 deletions

View File

@ -79,17 +79,17 @@ python pypvz.py
* 使用鼠标收集阳光,种植植物 * 使用鼠标收集阳光,种植植物
* 对于已经存在存档的用户,可以在`~\AppData\Roaming\wszqkzqk.dev\pypvz\userdata.json`Windows`~/.config/wszqkzqk.dev/pypvz/userdata.json`(其他操作系统)中修改当前关卡: * 对于已经存在存档的用户,可以在`~\AppData\Roaming\wszqkzqk.dev\pypvz\userdata.json`Windows`~/.config/wszqkzqk.dev/pypvz/userdata.json`(其他操作系统)中修改当前关卡:
* 冒险模式: * 冒险模式:
* 1——引入白昼模式——单行草皮 * 白昼模式——单行草皮1
* 2——引入白昼模式——三行草皮 * 白昼模式——三行草皮2
* 3和4白昼模式 * 白昼模式3~5
* 5和6夜晚模式 * 夜晚模式6~8
* 7、8和9泳池模式 * 泳池模式9~11
* 10: 浓雾模式(暂时没有雾) * 浓雾模式(暂时没有雾)12
* 小游戏模式: * 小游戏模式:
* 1坚果保龄球模式 * 坚果保龄球模式1
* 2传送带模式(白天) * 传送带模式(白天)2
* 3传送带模式(黑夜) * 传送带模式(黑夜)3
* 4传送带模式(泳池) * 传送带模式(泳池)4
* 目前暂时按照以上设定,未与原版相符 * 目前暂时按照以上设定,未与原版相符
* 可以通过修改存档JSON文件中的`game rate`值来调节游戏速度倍率 * 可以通过修改存档JSON文件中的`game rate`值来调节游戏速度倍率

View File

@ -15,7 +15,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() logger = logging.getLogger("main")
formatter = logging.Formatter("%(asctime)s: %(message)s") formatter = logging.Formatter("%(asctime)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)
@ -30,7 +30,8 @@ if __name__=="__main__":
state_dict = { c.MAIN_MENU: mainmenu.Menu(), state_dict = { c.MAIN_MENU: mainmenu.Menu(),
c.GAME_VICTORY: screen.GameVictoryScreen(), c.GAME_VICTORY: screen.GameVictoryScreen(),
c.GAME_LOSE: screen.GameLoseScreen(), c.GAME_LOSE: screen.GameLoseScreen(),
c.LEVEL: level.Level() c.LEVEL: level.Level(),
c.AWARD_SCREEN: screen.AwardScreen(),
} }
game.setup_states(state_dict, c.MAIN_MENU) game.setup_states(state_dict, c.MAIN_MENU)
game.run() game.run()

View File

@ -67,6 +67,7 @@ GOLD = (255, 215, 0)
GREEN = ( 0, 255, 0) GREEN = ( 0, 255, 0)
YELLOWGREEN = ( 55, 200, 0) YELLOWGREEN = ( 55, 200, 0)
LIGHTGRAY = (107, 108, 145) LIGHTGRAY = (107, 108, 145)
PARCHMENT_YELLOW = (207, 146, 83)
# 退出游戏按钮 # 退出游戏按钮
EXIT = "exit" EXIT = "exit"
@ -78,6 +79,7 @@ MAINMENU_BUTTON = "mainMenuButton"
LITTLEGAME_BUTTON = "littleGameButton" LITTLEGAME_BUTTON = "littleGameButton"
OPTION_BUTTON = "optionButton" OPTION_BUTTON = "optionButton"
SOUND_VOLUME_BUTTON = "volumeButton" SOUND_VOLUME_BUTTON = "volumeButton"
UNIVERSAL_BUTTON = "universalButton"
# 金银向日葵奖杯 # 金银向日葵奖杯
TROPHY_SUNFLOWER = "sunflowerTrophy" TROPHY_SUNFLOWER = "sunflowerTrophy"
# 小铲子 # 小铲子
@ -103,9 +105,10 @@ SOUND_VOLUME = "volume"
# 整个游戏的状态 # 整个游戏的状态
MAIN_MENU = "main menu" MAIN_MENU = "main menu"
LOAD_SCREEN = "load screen" LOAD_SCREEN = "load screen"
GAME_LOSE = "game los" GAME_LOSE = "game lose"
GAME_VICTORY = "game victory" GAME_VICTORY = "game victory"
LEVEL = "level" LEVEL = "level"
AWARD_SCREEN = "award screen"
# 界面图片文件名 # 界面图片文件名
MAIN_MENU_IMAGE = "MainMenu" MAIN_MENU_IMAGE = "MainMenu"

View File

@ -2,9 +2,11 @@ import os
import json import json
import pygame as pg import pygame as pg
import random import random
import logging
from .. import tool from .. import tool
from .. import constants as c from .. import constants as c
from ..component import map, plant, zombie, menubar from ..component import map, plant, zombie, menubar
logger = logging.getLogger("main")
class Level(tool.State): class Level(tool.State):
def __init__(self): def __init__(self):
@ -42,19 +44,19 @@ class Level(tool.State):
def loadMap(self): def loadMap(self):
# 冒险模式 # 冒险模式
if self.game_info[c.GAME_MODE] == c.MODE_ADVENTURE: if self.game_info[c.GAME_MODE] == c.MODE_ADVENTURE:
if 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("成功通关冒险模式!") print("成功通关冒险模式!")
self.game_info[c.LEVEL_NUM] = 1 self.game_info[c.LEVEL_NUM] = 1
self.game_info[c.LEVEL_COMPLETIONS] += 1 self.game_info[c.LEVEL_COMPLETIONS] += 1
self.done = True self.done = True
self.next = c.MAIN_MENU self.next = c.LEVEL
self.saveUserData() self.saveUserData()
return return
# 小游戏模式 # 小游戏模式
elif self.game_info[c.GAME_MODE] == c.MODE_LITTLEGAME: elif self.game_info[c.GAME_MODE] == c.MODE_LITTLEGAME:
if 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("成功通关玩玩小游戏!") print("成功通关玩玩小游戏!")
@ -150,7 +152,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:
print(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]

View File

@ -16,8 +16,7 @@ class Screen(tool.State):
def set_next_state(self): def set_next_state(self):
pass pass
def setupImage(self, name): def setupImage(self, name, frame_rect=(0, 0, 800, 600)):
frame_rect = [0, 0, 800, 600]
self.image = tool.get_image(tool.GFX[name], *frame_rect) self.image = tool.get_image(tool.GFX[name], *frame_rect)
self.rect = self.image.get_rect() self.rect = self.image.get_rect()
self.rect.x = 0 self.rect.x = 0
@ -68,17 +67,87 @@ class GameLoseScreen(Screen):
self.persist = persist self.persist = persist
self.game_info = persist self.game_info = persist
name = self.getImageName() name = self.getImageName()
self.setupImage(name) 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_LOSE.play()
c.SOUND_SCREAM.play() c.SOUND_SCREAM.play()
class AwardScreen(Screen): class AwardScreen(tool.State):
def __init__(self): def __init__(self):
Screen.__init__() tool.State.__init__(self)
def getImageName(self): def setupImage(self, gainedTrophy=True):
return c.AWARD_SCREEN_IMAGE # 主体
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 gainedTrophy:
## 主菜单按钮
main_menu_button_image = tool.get_image(tool.GFX[c.UNIVERSAL_BUTTON], *frame_rect)
main_menu_button_image_rect = main_menu_button_image.get_rect()
main_menu_button_image_rect.x = 343
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
main_menu_button_image.blit(main_menu_text, main_menu_text_rect)
self.image.blit(main_menu_button_image, main_menu_button_image_rect)
else:
## 继续按钮
next_button_image = tool.get_image(tool.GFX[c.UNIVERSAL_BUTTON], *frame_rect)
next_button_image_rect = next_button_image.get_rect()
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
## 主菜单按钮
main_menu_button_image = tool.get_image(tool.GFX[c.UNIVERSAL_BUTTON], *frame_rect)
main_menu_button_image_rect = main_menu_button_image.get_rect()
main_menu_button_image_rect.x = 620
next_button_image_rect.y = 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
next_button_image.blit(next_text, next_text_rect)
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(main_menu_button_image, main_menu_button_image_rect)
def startup(self, current_time, persist):
self.start_time = current_time
self.persist = persist
self.game_info = persist
self.setupImage()
def update(self, surface, current_time, mouse_pos, mouse_click):
surface.fill(c.WHITE)
surface.blit(self.image, self.rect)
def inArea(self, rect, x, y):
if (x >= rect.x and x <= rect.right and
y >= rect.y and y <= rect.bottom):
return True
else:
return False