示例#1
0
class Game:
    def __init__(self, screen):
        self.screen = screen
        self.objects = []
        self.game_messages = []
        self.game_state = Game_States.none
        self.map = []
        self.characters = []
        self.text_background = pygame.Surface((config.screen_width, 180))
        self.scene_surface = pygame.Surface((config.screen_width, config.screen_height))
        self.message_count = 0

        self.grid_index_X = int(config.screen_width / config.scale) - 1
        self.grid_index_Y = int(config.screen_height / config.scale)

        self.main_map = pygame.Surface((config.screen_width, config.screen_height))

        self.game_map = [[Map_Tile(True, False) for y in range(0, config.screen_height)] for x in
                         range(0, config.screen_width)]

        for x in range(5, 12):
            for y in range(5, 7):
                self.game_map[x][y].movement = False
                self.game_map[x][y].movement = False

        self.player = Player(self.screen, self.game_map)  # initialise player

        # initialise first tester npc
        self.tester_npc = CharacterController("NPC1", 7, 8, self.screen, config.NPC01IDLE, self.game_map,
                                              config.NPC01LEFT, config.NPC01RIGHT, config.NPC01BACK,
                                              config.NPC01FRONT, config.NPC01IDLE)
        self.message1 = self.tester_npc.text_to_speak(self.screen, "Hi there! How are you doing?",
                                                      config.game_messages,
                                                      (1 * config.scale, 9 * config.scale),
                                                      config.black)
        self.message2 = self.tester_npc.text_to_speak(self.screen, "I like you very much!", config.game_messages,
                                                      (1 * config.scale, 9 * config.scale),
                                                      config.black)

        self.my_creatures = [creature.charmander]

        # initialise the route creatures

        self.route1 = [creature.bulbasaur, creature.squirtle, creature.charmander]

        # TODO: find out a better way to do this

        # sets the tree objects
        # self.tester_npc2 = CharacterController("NPC2", 3, 3, self.screen, config.NPC02, self.game_map)

        self.treesXb = [Obstacles(config.tree01, x, 11, self.player.group)
                        for x in range(self.grid_index_X)]
        self.treesXt = [Obstacles(config.tree01, x, 0, self.player.group)
                        for x in range(self.grid_index_X)]

        self.treesYl = [Obstacles(config.tree01, 0, y, self.player.group)
                        for y in range(self.grid_index_Y)]
        self.treesYr = [Obstacles(config.tree01, self.grid_index_X, y, self.player.group)
                        for y in range(self.grid_index_Y)]

        self.tall_grass = [[Non_Obstacle_Tiles(config.tallgrass01, x, y, self.player)
                            for x in range(9, self.grid_index_X)] for y in range(1, 4)]

        self.trees = [self.treesXb, self.treesXt, self.treesYl, self.treesYr]

        # adds the tree border to the game

        for x in range(self.grid_index_X):
            self.game_map[x][self.grid_index_Y - 1].blocked = True
            self.game_map[x][0].blocked = True
        for y in range(self.grid_index_Y):
            self.game_map[0][y].blocked = True
            self.game_map[self.grid_index_X][y].blocked = True

        # scene mechanics
        self.scene = Scene(self.scene_surface)
        self.scene.set_background(config.battle_background, self.scene_surface)

    def set_up(self):
        print("setting up")
        self.game_state = Game_States.running

        # self.objects.append(self.tester_npc)
        # self.objects.append(self.tester_npc2)

        self.characters.append(self.tester_npc)
        # self.characters.append(self.tester_npc2)

        # TODO: find out a better way to do this

        for tree_list in self.trees:
            for tree in tree_list:
                self.objects.append(tree)

        self.objects.append(self.player)  # adds player to object list

        for tallgrass in self.tall_grass:
            for i in tallgrass:
                self.objects.append(i)

        self.render_map(self.game_map)
        self.screen.blit(self.main_map, (0, 0))

        pygame.display.flip()  # update screen

    def update(self, clock):

        self.game_messages = [self.message1, self.message2]

        fps_count = Text_Controller(self.screen, "FPS: " + str(int(clock.get_fps())),
                                    config.fps_Counter, (5, 5), config.black)

        self.screen.blit(self.main_map, (0, 0))
        self.render_blocked_tiles(self.game_map)
        self.manage_events()
        self.manage_ais()

        for obj in self.objects:  # draws all objects into the screen
            obj.image.convert()
            obj.draw(self.screen)
            fps_count.draw_text()

        self.player.rect.topleft = self.player.rect.x, self.player.rect.y  # updates player's rect
        self.tester_npc.rect.topleft = self.tester_npc.rect.x, self.tester_npc.rect.y

        for grass in self.tall_grass:
            for i in grass:
                i.check_collide(self)

        for character in self.characters:
            self.player.check_collision(character.group)
            character.check_collision(self.player, self)  # the one that identifies it

        pygame.display.flip()

    def manage_ais(self):
        self.tester_npc.ai_left_right()
        self.tester_npc.play_animation()
        # self.tester_npc2.ai_up_down()

    def manage_events(self):
        rdm_pos = self.random_grass()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.game_state = Game_States.quit

            elif event.type == pygame.KEYDOWN:

                if event.key == pygame.K_ESCAPE:
                    self.game_state = Game_States.quit

                elif event.key == pygame.K_a:  # left
                    self.player.update_position(0, -1)
                    self.player.left = True
                    self.player.right = False
                    self.player.front = False
                    self.player.back = False

                elif event.key == pygame.K_d:  # right
                    self.player.update_position(0, 1)
                    self.player.left = False
                    self.player.right = True
                    self.player.front = False
                    self.player.back = False

                elif event.key == pygame.K_w:  # up
                    self.player.update_position(-1, 0)
                    self.player.front = False
                    self.player.back = True
                    self.player.left = False
                    self.player.right = False

                elif event.key == pygame.K_s:  # down
                    self.player.update_position(1, 0)
                    self.player.front = True
                    self.player.back = False
                    self.player.left = False
                    self.player.right = False

                elif self.player.position == rdm_pos:
                    print(rdm_pos)
                    print("yes")

                else:
                    self.player.left = False
                    self.player.right = False
                    self.player.back = False
                    self.player.front = False
                    self.player.walk_count = 0

                if event.key == pygame.K_p:  # pause
                    self.pause_game()

                if event.key == pygame.K_o:
                    pass

    def render_map(self, drawn_map):

        for x in range(0, config.screen_width):
            for y in range(0, config.screen_height):

                if drawn_map[x][y].movement:
                    self.main_map.blit(config.grass01, (x * config.scale, y * config.scale))

    def render_blocked_tiles(self, drawn_map):
        for x in range(0, config.screen_width):
            for y in range(0, config.screen_height):

                if not drawn_map[x][y].movement:
                    self.screen.blit(config.water01, (x * config.scale, y * config.scale))

    def pause_game(self):
        self.game_state = Game_States.pause
        self.screen.blit(self.scene_surface, (0, 0))
        pygame.display.flip()

        for event in pygame.event.get():  # pause sequence
            if event.type == pygame.QUIT:
                quit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:
                    self.game_state = Game_States.running

                elif event.key == pygame.K_ESCAPE:
                    quit()

    def play_scene(self):
        self.game_state = Game_States.play_scene
        self.screen.blit(self.scene_surface, (0, 0))
        print("displaying scene")

        pygame.display.flip()

    def play_message(self):
        count = 0
        done = False

        self.text_background.blit(config.text_background, (0, 0))
        self.screen.blit(self.text_background, (0, 300))
        self.game_messages[0].draw_text()
        pygame.display.flip()

        while not done:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        quit()

                    elif event.key == pygame.K_SPACE:
                        count += 1
                        print(len(self.game_messages))

                        if count == len(self.game_messages):
                            self.game_state = Game_States.running
                            done = True

                        elif count < len(self.game_messages):
                            self.screen.blit(self.text_background, (0, 300))
                            self.game_messages[count].draw_text()

                            pygame.display.flip()

    def random_grass(self):
        random_list = []
        for tallgrass in self.tall_grass:
            for i in tallgrass:
                position = i.get_position()

                random_list.append((position))
        return random_list[random.randint(0, len(random_list) - 1)]

    @staticmethod
    def button_mechanics(button, mouse):
        for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONDOWN:
                if button.rect.x < mouse[0] < (
                        button.rect.x + button.rect[2]):
                    if button.rect.y < mouse[1] < (
                            button.rect.y + button.rect[3]):
                        # add what happens after fight button is clicked here
                        print("click")
                        ended = True

            elif event.type == pygame.MOUSEMOTION:
                if button.rect.x < mouse[0] < (
                        button.rect.x + button.rect[2]):
                    if button.rect.y < mouse[1] < (
                            button.rect.y + button.rect[3]):
                        # print("hover")
                        button.image = config.fight_button_H
                        button.draw()

                    else:
                        button.image = config.fight_button
                        button.draw()

    def game_mechanics(self):
        self.scene_surface.blit(config.battle_background, (0, 0))
        self.play_scene()