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)
Пример #2
0
    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)
Пример #4
0
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
Пример #6
0
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