def __init__(self, surface: pygame.Surface, researcher): """ 实验室场景的初始化 :param surface: 窗口绘制的surface """ self.surface = surface tiled_path = os.path.join('resource1/resource2/laboratory.tmx') self.tiled = TiledScene(tiled_path) # 渐变对象 self.fade = FadeScene(self.tiled.surface) # 创建一个人物 self.transitional = None self.dialog_Init_show = True self.dialog_Init = InitGameDialog(1) self.researcher = researcher self.pos_x = 0 self.pos_y = 0 self.obstacle_group = pygame.sprite.Group() # 障碍物 self.professor = None # self.init_actor() self.temp_surface = pygame.Surface((800, 600)) # 打斗场景改为空 # self.battle_dialog = None # 打斗 self.scene_result = SceneResult.Ongoing sound_path = os.path.join('resource1', 'music', '久石让 - going out.wav') pygame.mixer.music.load(sound_path) pygame.mixer.music.play(-1)
def __init__(self, surface: pygame.Surface, researcher): """ 墓穴场景的初始化 :param surface: 窗口绘制的surface """ self.surface = surface tiled_path = os.path.join('resource1/resource2/tomb.tmx') self.tiled = TiledScene(tiled_path) # 渐变对象 self.fade = FadeScene(self.tiled.surface) # 创建一个人物 self.door = None self.penglai_door_dialog = None self.transitional = None self.letter_dialog_show = True self.letter_dialog = None self.letter_group = pygame.sprite.Group() self.researcher = researcher self.pos_x = 0 self.pos_y = 0 self.obstacle_group = pygame.sprite.Group() # 障碍物 # self.init_actor() self.temp_surface = pygame.Surface((800, 600)) # 打斗场景改为空 # self.battle_dialog = None # 打斗 self.scene_result = SceneResult.Ongoing pygame.mixer.music.unload() sound_path = os.path.join('resource1', 'music', 'tomb.wav') pygame.mixer.music.load(sound_path) pygame.mixer.music.play(-1)
def __init__(self, surface: pygame.Surface, researcher): """ 宫殿场景的初始化 :param surface: 窗口绘制的surface """ self.surface = surface tiled_path = os.path.join('resource1/resource2/ palace.tmx') self.tiled = TiledScene(tiled_path) # 渐变对象 self.fade = FadeScene(self.tiled.surface) # 创建一个人物 self.transitional = None self.researcher = researcher self.pos_x = 0 self.pos_y = 0 self.obstacle_group = pygame.sprite.Group() # 障碍物 self.maid = None self.maid2 = None # self.init_actor() self.temp_surface = pygame.Surface((800, 600)) # 打斗场景改为空 # self.battle_dialog = None # 打斗 self.scene_result = SceneResult.Ongoing pygame.mixer.music.unload() sound_path = os.path.join('resource1', 'music', 'palace.wav') pygame.mixer.music.load(sound_path) pygame.mixer.music.set_volume(0.5) pygame.mixer.music.play(-1)
class PenglaiScene: """ 实验室场景 """ def __init__(self, surface: pygame.Surface, researcher): """ 实验室场景的初始化 :param surface: 窗口绘制的surface """ self.surface = surface tiled_path = os.path.join('resource1/resource2/Penglai.tmx') self.tiled = TiledScene(tiled_path) # 渐变对象 self.fade = FadeScene(self.tiled.surface) # 创建一个人物 self.tree_dialog_show = True self.door_tree = None self.door_house = None self.door_house_dialog = None self.door_tree_dialog1 = None self.door_tree_dialog2 = None self.transitional = None self.collide_list = None self.collide_list1 = None self.researcher = researcher self.pos_x = 0 self.pos_y = 0 self.obstacle_group = pygame.sprite.Group() # 障碍物 # self.professor = None # self.init_actor() self.temp_surface = pygame.Surface((800, 600)) # 打斗场景改为空 # self.battle_dialog = None # 打斗 self.scene_result = SceneResult.Ongoing pygame.mixer.music.unload() sound_path = os.path.join('resource1', 'music', 'penglai.wav') pygame.mixer.music.load(sound_path) pygame.mixer.music.play(-1) def init_actor(self): """ 9.6初始化角色和人物 :return: """ pygame.key.set_repeat(10, 10) # 长按 for group in self.tiled.tiled.tmx_data.objectgroups: if isinstance(group, pytmx.TiledObjectGroup): if group.name == "obstacle": for obj in group: obstacle = pygame.sprite.Sprite() obstacle.rect = pygame.Rect(obj.x, obj.y, obj.width, obj.height) self.obstacle_group.add(obstacle) if group.name == "actor": for obj in group: if obj.name == "researcher": self.researcher.reset_pos(obj.x, obj.y) # 设置窗口位置(子图的初始位置) self.pos_x = obj.x - 400 self.pos_y = obj.y - 300 if group.name == "door": for obj in group: if obj.name == "tree": self.door_tree = pygame.sprite.Sprite() self.door_tree.rect = pygame.Rect( obj.x, obj.y, obj.width, obj.height) if obj.name == "house": print("house is a sprite") self.door_house = pygame.sprite.Sprite() self.door_house.rect = pygame.Rect( obj.x, obj.y, obj.width, obj.height) def get_current_surface(self) -> pygame.Surface: """ 获取当前显示场景的surface :return: 当前显示场景的surface """ # 获取子图 sub_surface = self.fade.get_back_image(self.pos_x, self.pos_y) self.temp_surface.blit(sub_surface, (0, 0)) self.researcher.draw(self.temp_surface, self.pos_x, self.pos_y) if self.door_tree_dialog1 and self.tree_dialog_show: self.door_tree_dialog1.draw(self.temp_surface) if self.door_tree_dialog2: self.door_tree_dialog2.draw(self.temp_surface) if self.door_house_dialog: self.door_house_dialog.draw(self.temp_surface) return self.temp_surface def run(self): """ 场景的运行 :return: """ scene_exit = False clock = pygame.time.Clock() while not scene_exit: Key_down = False pressed_key = None for event in pygame.event.get(): if event.type == QUIT: scene_exit = True self.scene_result = SceneResult.Fail if event.type == KEYDOWN: Key_down = True pressed_key = event.key if self.tree_dialog_show: self.create_door_dialog(1) self.create_door_house_dialog() # 与障碍物碰撞 if Key_down: temp_pos1 = self.researcher.key_move(pressed_key, self.obstacle_group) if temp_pos1: self.pos_x += temp_pos1[0] self.pos_y += temp_pos1[1] if self.collide_list and pressed_key == K_a: self.create_door_dialog(2) self.scene_result = SceneResult.Fail self.fade.set_status(SceneStatus.Out) elif self.collide_list and pressed_key == K_b: self.tree_dialog_show = False if self.collide_list1 and pressed_key == K_y: if self.researcher.scene_tomb and self.researcher.scene_palace: self.scene_result = SceneResult.Fail self.fade.set_status(SceneStatus.Out) print("out 执行") else: print("穿越执行") self.transitional = 'newlabscene' self.fade.set_status(SceneStatus.Out) if self.fade.get_out(): scene_exit = True current_screen = self.get_current_surface() self.surface.blit(current_screen, (0, 0)) pygame.display.update() clock.tick(10) # 动画片帧数 return scene_exit def create_door_dialog(self, textnumber: int): self.collide_list = pygame.sprite.collide_rect(self.researcher, self.door_tree) if self.collide_list and textnumber == 1: self.door_tree_dialog1 = TreeDoorDialog(textnumber) elif textnumber == 2: self.door_tree_dialog2 = TreeDoorDialog(textnumber) def create_door_house_dialog(self): self.collide_list1 = pygame.sprite.collide_rect( self.researcher, self.door_house) if self.collide_list1: if self.researcher.scene_palace and self.researcher.scene_tomb: self.door_house_dialog = HouseDoorDialog(2) print("失败框显示") else: self.door_house_dialog = HouseDoorDialog(1)
class LabScene: """ 实验室场景 """ def __init__(self, surface: pygame.Surface, researcher): """ 实验室场景的初始化 :param surface: 窗口绘制的surface """ self.surface = surface tiled_path = os.path.join('resource1/resource2/laboratory.tmx') self.tiled = TiledScene(tiled_path) # 渐变对象 self.fade = FadeScene(self.tiled.surface) # 创建一个人物 self.transitional = None self.dialog_Init_show = True self.dialog_Init = InitGameDialog(1) self.researcher = researcher self.pos_x = 0 self.pos_y = 0 self.obstacle_group = pygame.sprite.Group() # 障碍物 self.professor = None # self.init_actor() self.temp_surface = pygame.Surface((800, 600)) # 打斗场景改为空 # self.battle_dialog = None # 打斗 self.scene_result = SceneResult.Ongoing sound_path = os.path.join('resource1', 'music', '久石让 - going out.wav') pygame.mixer.music.load(sound_path) pygame.mixer.music.play(-1) def init_actor(self): """ 9.6初始化角色和人物 :return: """ pygame.key.set_repeat(50, 50) #长按 for group in self.tiled.tiled.tmx_data.objectgroups: if isinstance(group, pytmx.TiledObjectGroup): if group.name == "obstacle": for obj in group: obstacle = pygame.sprite.Sprite() obstacle.rect = pygame.Rect(obj.x, obj.y, obj.width, obj.height) self.obstacle_group.add(obstacle) if group.name == "actor": for obj in group: if obj.name == "researcher": self.researcher.reset_pos(obj.x, obj.y) # 设置窗口位置(子图的初始位置) self.pos_x = obj.x - 400 self.pos_y = obj.y - 300 if group.name == "npc": for obj in group: if obj.name == "professor": self.professor = Professor(obj.x, obj.y, self.researcher) def get_current_surface(self) -> pygame.Surface: """ 获取当前显示场景的surface :return: 当前显示场景的surface """ # 获取子图 sub_surface = self.fade.get_back_image(self.pos_x, self.pos_y) self.temp_surface.blit(sub_surface, (0, 0)) self.researcher.draw(self.temp_surface, self.pos_x, self.pos_y) self.professor.draw(self.temp_surface, self.pos_x, self.pos_y) if self.dialog_Init_show: self.dialog_Init.draw(self.temp_surface) return self.temp_surface def run(self): """ 场景的运行 :return: """ scene_exit = False clock = pygame.time.Clock() while not scene_exit: Key_down = False pressed_key = None for event in pygame.event.get(): if event.type == QUIT: self.fade.set_status(SceneStatus.Out) self.scene_result = SceneResult.Fail scene_exit = True if event.type == KEYDOWN: Key_down = True pressed_key = event.key # 与障碍物碰撞 if Key_down: temp_pos1 = self.researcher.key_move(pressed_key, self.obstacle_group) if temp_pos1: self.pos_x += temp_pos1[0] self.pos_y += temp_pos1[1] if self.professor.stop and pressed_key == K_y: self.fade.set_status(SceneStatus.Out) self.professor.stop = False if self.professor.stop and pressed_key == K_n: self.fade.set_status(SceneStatus.Out) self.scene_result = SceneResult.Fail self.professor.stop = False if pressed_key == K_y: self.dialog_Init_show = False if self.fade.get_out(): scene_exit = True if self.fade.status != SceneStatus.Out: # 如果运动距离台下,又碰撞,则对话框会再次显示,所以只有在不退出时才做碰撞判断 self.professor.collide(self.researcher) current_screen = self.get_current_surface() self.surface.blit(current_screen, (0, 0)) pygame.display.update() clock.tick(10) # 动画片帧数 return scene_exit
class TombScene: """ 墓穴场景 """ def __init__(self, surface: pygame.Surface, researcher): """ 墓穴场景的初始化 :param surface: 窗口绘制的surface """ self.surface = surface tiled_path = os.path.join('resource1/resource2/tomb.tmx') self.tiled = TiledScene(tiled_path) # 渐变对象 self.fade = FadeScene(self.tiled.surface) # 创建一个人物 self.door = None self.penglai_door_dialog = None self.transitional = None self.letter_dialog_show = True self.letter_dialog = None self.letter_group = pygame.sprite.Group() self.researcher = researcher self.pos_x = 0 self.pos_y = 0 self.obstacle_group = pygame.sprite.Group() # 障碍物 # self.init_actor() self.temp_surface = pygame.Surface((800, 600)) # 打斗场景改为空 # self.battle_dialog = None # 打斗 self.scene_result = SceneResult.Ongoing pygame.mixer.music.unload() sound_path = os.path.join('resource1', 'music', 'tomb.wav') pygame.mixer.music.load(sound_path) pygame.mixer.music.play(-1) def init_actor(self): """ 9.6初始化角色和人物 :return: """ for group in self.tiled.tiled.tmx_data.objectgroups: if isinstance(group, pytmx.TiledObjectGroup): if group.name == "obstacle": for obj in group: obstacle = pygame.sprite.Sprite() obstacle.rect = pygame.Rect(obj.x, obj.y, obj.width, obj.height) self.obstacle_group.add(obstacle) if group.name == "actor": for obj in group: if obj.name == "researcher": self.researcher.reset_pos(obj.x, obj.y) # 设置窗口位置(子图的初始位置) self.pos_x = obj.x - 400 self.pos_y = obj.y - 300 if group.name == "npc": for obj in group: if obj.name == "letter": monster = pygame.sprite.Sprite() monster.rect = pygame.Rect(obj.x, obj.y, obj.width, obj.height) self.letter_group.add(monster) if group.name == "door": for obj in group: if obj.name == "door": self.door = pygame.sprite.Sprite() self.door.rect = pygame.Rect( obj.x, obj.y, obj.width, obj.height) def get_current_surface(self) -> pygame.Surface: """ 获取当前显示场景的surface :return: 当前显示场景的surface """ # 获取子图 sub_surface = self.fade.get_back_image(self.pos_x, self.pos_y) self.temp_surface.blit(sub_surface, (0, 0)) self.researcher.draw(self.temp_surface, self.pos_x, self.pos_y) if self.letter_dialog and self.letter_dialog_show: self.letter_dialog.draw(self.temp_surface) # self.professor.draw(self.temp_surface, self.pos_x, self.pos_y) if self.penglai_door_dialog: self.penglai_door_dialog.draw(self.temp_surface) return self.temp_surface def run(self): """ 场景的运行 :return: """ scene_exit = False # 场景最开始不退出 clock = pygame.time.Clock() while not scene_exit: Key_down = False pressed_key = None for event in pygame.event.get(): if event.type == QUIT: scene_exit = True self.scene_result = SceneResult.Fail if event.type == KEYDOWN: Key_down = True pressed_key = event.key self.create_letter_dialog() # 与障碍物碰撞 self.create_door_dialog() if Key_down: temp_pos1 = self.researcher.key_move(pressed_key, self.obstacle_group) if temp_pos1: self.pos_x += temp_pos1[0] self.pos_y += temp_pos1[1] if self.letter_dialog and pressed_key == K_y: self.letter_dialog_show = False self.researcher.pick_letter = 2 else: self.researcher.pick_letter = 3 if self.penglai_door_dialog and pressed_key == K_y: self.transitional = "penglai" self.researcher.scene_tomb = True print("self.researcher.scene_tomb ") print(self.researcher.scene_tomb) print("self.scene_palace") print(self.researcher.scene_palace) self.fade.set_status(SceneStatus.Out) if self.fade.get_out(): scene_exit = True # self.professor.collide(self.researcher) current_screen = self.get_current_surface() self.surface.blit(current_screen, (0, 0)) pygame.display.update() clock.tick(10) # 动画帧数 return scene_exit def create_letter_dialog(self): collide_list = pygame.sprite.spritecollide(self.researcher, self.letter_group, False) if collide_list: self.letter_dialog = TombLetterDialog(1) def create_door_dialog(self): collide_list = pygame.sprite.collide_rect(self.researcher, self.door) if collide_list: self.penglai_door_dialog = PenglaiDoorDialog(1)
class PalaceScene: """ 宫殿场景 """ def __init__(self, surface: pygame.Surface, researcher): """ 宫殿场景的初始化 :param surface: 窗口绘制的surface """ self.surface = surface tiled_path = os.path.join('resource1/resource2/ palace.tmx') self.tiled = TiledScene(tiled_path) # 渐变对象 self.fade = FadeScene(self.tiled.surface) # 创建一个人物 self.transitional = None self.researcher = researcher self.pos_x = 0 self.pos_y = 0 self.obstacle_group = pygame.sprite.Group() # 障碍物 self.maid = None self.maid2 = None # self.init_actor() self.temp_surface = pygame.Surface((800, 600)) # 打斗场景改为空 # self.battle_dialog = None # 打斗 self.scene_result = SceneResult.Ongoing pygame.mixer.music.unload() sound_path = os.path.join('resource1', 'music', 'palace.wav') pygame.mixer.music.load(sound_path) pygame.mixer.music.set_volume(0.5) pygame.mixer.music.play(-1) def init_actor(self): """ 9.6初始化角色和人物 :return: """ for group in self.tiled.tiled.tmx_data.objectgroups: if isinstance(group, pytmx.TiledObjectGroup): if group.name == "obstacle": for obj in group: obstacle = pygame.sprite.Sprite() obstacle.rect = pygame.Rect(obj.x, obj.y, obj.width, obj.height) self.obstacle_group.add(obstacle) if group.name == "actor": for obj in group: if obj.name == "researcher": self.researcher.reset_pos(obj.x, obj.y) # 设置窗口位置(子图的初始位置) self.pos_x = obj.x - 400 self.pos_y = obj.y - 300 if group.name == "npc ": for obj in group: if obj.name == "maid": self.maid = Maid(obj.x, obj.y, 1) if obj.name == "maid2": self.maid2 = Maid(obj.x, obj.y, 2) def get_current_surface(self) -> pygame.Surface: """ 获取当前显示场景的surface :return: 当前显示场景的surface """ # 获取子图 sub_surface = self.fade.get_back_image(self.pos_x, self.pos_y) self.temp_surface.blit(sub_surface, (0, 0)) self.researcher.draw(self.temp_surface, self.pos_x, self.pos_y) self.maid.draw(self.temp_surface, self.pos_x, self.pos_y) self.maid2.draw(self.temp_surface, self.pos_x, self.pos_y) return self.temp_surface def run(self): """ 场景的运行 :return: """ scene_exit = False # 场景最开始不退出 clock = pygame.time.Clock() while not scene_exit: Key_down = False pressed_key = None for event in pygame.event.get(): if event.type == QUIT: scene_exit = True self.scene_result = SceneResult.Fail if event.type == KEYDOWN: Key_down = True pressed_key = event.key # 与障碍物碰撞 if Key_down: temp_pos1 = self.researcher.key_move(pressed_key, self.obstacle_group) if temp_pos1: self.pos_x += temp_pos1[0] self.pos_y += temp_pos1[1] if self.maid.stop and pressed_key == K_y: self.transitional = 'flowerplace' self.researcher.scene_palace = True print(self.researcher.scene_palace) self.fade.set_status(SceneStatus.Out) self.maid.stop = False if self.maid2.stop and pressed_key == K_y: self.transitional = 'penglai' self.fade.set_status(SceneStatus.Out) self.maid2.stop = False if self.fade.get_out(): scene_exit = True self.maid.collide(self.researcher) self.maid2.collide(self.researcher) current_screen = self.get_current_surface() self.surface.blit(current_screen, (0, 0)) pygame.display.update() clock.tick(10) # 动画片帧数 return scene_exit