Exemple #1
0
 def __init__(self, game, name):
     self.objects = []
     self.topobjects = []
     self.toptopobjects = []
     self.ennemies = []
     self.bonuses = []
     self.platforms = []
     self.blocks = []
     self.camera = Camera(0, 0, game.width, game.height)
     self.imageMario = None
     self.imageAssets = None
     self.imageCloud = None
     self.imageBush = None
     self.imageSprites = None
     self.imageTiles = None
     self.state = State()
     self.running = True
     self.fond = None
     self.game = game
     self.name = name
     self.starttime = datetime.utcnow()
     self.timelimit = 100
     self.tilemap = []
     self.sounds = {}
     self.ytile = 0
     self.bgcolor = (0, 0, 0)
     self.lastkeys = None
     self.mario = None
     self.levelState = LevelState.RUNNING
     self.timeevent = pygame.time.get_ticks()
     self.opacityend = 0
Exemple #2
0
 def __init__(self, floor_data, parent_game):
     self._scenario_ = TileMapLayer(floor_data, mask=get_color_mask())
     self._camera_ = Camera(self._scenario_)
     self._game_ = parent_game
     self._game_objects_ = {}
     self._decorations_ = {}
     self.block = self._compute_walls_collisions_()
     self._spawns_ = self._get_spawns_()
class Renderer:

    camera = Camera()
    asset_path = "."

    def __init__(self,
                 window_name,
                 fps=60,
                 size=(800, 600),
                 favicon=None,
                 game_logic: GameLogic = None):
        self.running = True
        self.size = self.width, self.height = size
        self.game_logic = game_logic
        self.fps = fps
        self.clock = pygame.time.Clock()
        pygame.init()

        if favicon is not None:
            logo = pygame.image.load(favicon)
            pygame.display.set_icon(logo)

        pygame.display.set_caption(window_name)

        self._screen = pygame.display.set_mode(
            self.size, pygame.HWSURFACE | pygame.DOUBLEBUF)

    @staticmethod
    def set_asset_path(path):
        Renderer.asset_path = path
        print("Asset directory: " + Renderer.asset_path)

    def update(self):
        dt = self.clock.tick(self.fps) / 1000.0

        for event in pygame.event.get():
            self.running = self.game_logic.process_input(event, dt)

        self.game_logic.process_movement(pygame.key.get_pressed(), self.camera,
                                         dt)

        if self.game_logic is not None:
            self.game_logic.update(dt)

        self.draw()

        pygame.display.update()

    @staticmethod
    def cleanup():
        pygame.quit()

    def draw(self):
        self._screen.fill((255, 255, 255))
        for tile in self.game_logic.tiles:
            tile.draw(self._screen)
            for entity in tile.entities:
                entity.draw(self._screen)
Exemple #4
0
    def __init__(self):
        pg.init()
        pg.mixer.init()
        self.screen = pg.display.set_mode((WIDTH, HEIGHT))
        pg.display.set_caption(TITLE)
        self.clock = pg.time.Clock()
        self.running = True
        self.double_speed = False
        self.number_of_levels = 4

        self.navigator = Navigator(self)
        self.drawer = Drawer(self.screen)
        self.creator = Creator()

        self.init_player()
        self.init_sprite_lists()

        self.camera = Camera(self.player, self.creator.shiftable,
                             self.creator.texts)

        self.is_tutorial = False
        self.current_level = 0
Exemple #5
0
    def __init__(self):
        init()
        font.init()
        display.set_caption(TITLE)
        key.set_repeat()

        self.playing = False

        self.screen = display.set_mode((WIDTH, HEIGHT))

        self.clock = time.Clock()
        self.dt = self.clock.tick(FPS) / 1000

        self.labels = list()
        self.infos = list()

        self.all_sprites = Group()

        self.adventure = Home(self)

        self.camera = Camera(self.adventure.map.width, self.adventure.map.height)
        self.score = Score("Renato")

        self.game_over = False
def main():
    game_config_path, evol_config_path, nn_config_path, do_train = args()

    game_config = load_config(game_config_path)
    evol_config = load_config(evol_config_path)
    nn_config = load_config(nn_config_path)

    player_position_generator = RandomPlayerPositionGenerator()
    game = Game.from_config(game_config, player_position_generator)

    example_model = FeedforwardModel.create("test", nn_config["layer_sizes"],
                                            nn_config["activation"],
                                            game_config["team_size"])
    #Too lazy to do the math manually
    chromosome_length = example_model.get_weights().size

    initial_population = UniformFloatPopulationGenerator(
        -1, 1, chromosome_length).generate(evol_config["population_size"])
    models = create_initial_models(nn_config, initial_population,
                                   game_config["team_size"])

    size = (1400, 800)
    pygame.init()
    screen = pygame.display.set_mode(size)
    pygame.display.set_caption("Test")
    camera = Camera([0, 0], 35, size)

    genetic_alg = create_genetic_algorithm(
        evol_config,
        random_matches_fitness_generator(3, models, game, 1 / 30.0, screen,
                                         camera))

    population, fitness = genetic_alg.run(
        initial_population, generation_count_stopping_criterion(10))

    best_model = max(list(zip(population, fitness)), key=lambda p: p[1])[0]

    best_model.save(f"{best_model.id}.h5")
Exemple #7
0
    def launch_game(self):
        """
            Launch a new game | Create the map, the camera, the player
        """

        # initialize the Flower class which is used for API
        for key in var.flowers_dict:
            name = var.flowers_dict[key]["name"]
            image_path = var.flowers_dict[key]["image_path"]
            var.flowers_objects.append(Flower(name, image_path))
        # Load the Maps
        Map.loader(self)
        # Manage the sprites
        # Create the sprites groups
        self.walls = pygame.sprite.Group()
        self.all_sprites = pygame.sprite.Group()
        self.warpers = pygame.sprite.Group()
        self.pnj = pygame.sprite.Group()
        self.water_sources = pygame.sprite.Group()
        # Generate the player / walls  / warpers
        self.maps["worldmap"]["map"].create_map_objects(
            "worldmap", True, False)

        #########
        # DEBUG #
        #########
        # print(self.walls)
        # print(self.all_sprites)
        # print(self.warpers)
        # for warper in self.warpers:
        #     print(warper.name)

        # Create the camera
        # NEEDS TO BE DELETED AND RECREATED AFTER EACH MAP to NEWMAP TELEPORT
        self.camera = Camera(self.maps["worldmap"]["rect"].width,
                             self.maps["worldmap"]["rect"].height)
Exemple #8
0
class Room:
    '''Container for all in-game elements'''
    def __init__(self, floor_data, parent_game):
        self._scenario_ = TileMapLayer(floor_data, mask=get_color_mask())
        self._camera_ = Camera(self._scenario_)
        self._game_ = parent_game
        self._game_objects_ = {}
        self._decorations_ = {}
        self.block = self._compute_walls_collisions_()
        self._spawns_ = self._get_spawns_()

    @property
    def initial_objects(self):
        '''List of all objects defined in the map initially'''
        return self._scenario_.objects

    @property
    def game_objects(self):
        '''Map of current-living objects'''
        return self._game_objects_

    def _compute_walls_collisions_(self):
        block = []
        for y in range(self._scenario_.map_height):
            row = []
            for x in range(self._scenario_.map_width):
                row.append(self._scenario_.get_cell_at(x, y) in BLOCK_CELLS)
            block.append(row)
        return block

    def _get_spawns_(self):
        spawns = {}
        for candidate in self._game_objects_.values():
            if isinstance(candidate, Spawn):
                spawns[candidate.spawn] = candidate.position
        return spawns

    @property
    def camera(self):
        '''Room camera'''
        return self._camera_

    def set_camera_target(self, game_object):
        '''Change target of the camera'''
        self._camera_.set_target(game_object)

    @property
    def tilemaps(self):
        '''Map layers'''
        return self._scenario_

    def spawn(self, game_object):
        '''Spawn new object at a spawn zone'''
        spawn_zone = game_object.spawn if game_object.spawn in self._spawns_ else DEFAULT_SPAWN
        self.spawn_at(game_object, self._spawns_[spawn_zone])

    def spawn_at(self, game_object, position):
        '''Spawn new object at a given position'''
        self._game_objects_[game_object.identifier] = game_object
        self._game_objects_[game_object.identifier].position = position
        self._game_objects_[game_object.identifier].room = self
        self._spawns_.update(self._get_spawns_())

    def spawn_decoration(self, decoration_id, position):
        '''Spawn decoration'''
        decoration = game.decoration.new(decoration_id, position)
        self._decorations_[decoration.identifier] = decoration
        self._decorations_[decoration.identifier].room = self

    def kill(self, game_object):
        '''Kill an object'''
        identifier = game_object if isinstance(game_object,
                                               str) else game_object.identifier

        if identifier == self._game_.identifier:
            self._game_.player.attribute.update(
                self._game_objects_[identifier].attribute)

        if identifier in self._game_objects_:
            self._game_objects_[identifier].room = None
            del self._game_objects_[identifier]
        elif identifier in self._decorations_:
            self._decorations_[identifier].room = None
            del self._decorations_[identifier]

        if identifier == self._game_.identifier:
            self._game_.end_current_room()

    def open_door(self, door_identifier):
        '''Open a existing door'''
        door_position = self._search_door_(door_identifier)
        if not door_position:
            return
        doors = self._adjacent_doors_(door_position)
        for door in doors:
            self.kill(door)
            self.send_event(('kill_object', door))

    def _search_door_(self, door_identifier):
        if door_identifier not in self._game_objects_:
            return None
        y = 0
        for row in self.block:
            x = 0
            for cell in row:
                if cell == door_identifier:
                    return (x, y)
                x += 1
            y += 1
        return None

    def _adjacent_doors_(self, location, visited=None):
        if not visited:
            visited = []
        x, y = location
        if location in visited:
            return []
        visited.append((x, y))
        if (y not in range(len(self.block))) or (x not in range(
                len(self.block[0]))):
            return []
        identifier = self.block[y][x]
        door = self._game_objects_[identifier]
        if not isinstance(door, Door):
            return []
        doors = [door.identifier]
        door_tile_id = door.attribute[TILE_ID]
        for dir_x, dir_y in _DOOR_DIRECTION_[door_tile_id]:
            doors += self._adjacent_doors_((x + dir_x, y + dir_y), visited)
        return doors

    def update(self):
        '''A game loop iteration'''
        for game_object in list(self._game_objects_.values()):
            game_object.update()
            if not game_object.acting:
                self.kill(game_object)
            if game_object.body:
                self.check_collisions_with(game_object)

    def render(self):
        '''Draw a frame'''
        self._camera_.update()
        self._scenario_.render(*self._camera_.position)

        for game_object in self._game_objects_.values():
            game_object.render(*self._camera_.position)

        for decoration in list(self._decorations_.values()):
            decoration.render(*self._camera_.position)

    def check_collisions_with(self, game_object):
        '''Compute collisions for all game objects'''
        if not game_object.body:
            return
        for other_game_object in list(self._game_objects_.values()):
            if (other_game_object is
                    game_object) or (not other_game_object.body):
                continue
            if game_object.body.collides_with(other_game_object):
                self.send_event(('collision', game_object.identifier,
                                 other_game_object.identifier))

    def send_event(self, event):
        '''Send event to orchestrator'''
        self._game_.send_event(event)
def main():
    size = (1400, 800)
    pygame.init()
    screen = pygame.display.set_mode(size)
    pygame.display.set_caption("Test")

    done = False

    clock = pygame.time.Clock()

    camera = Camera(CAMERA_POS, PIXELS_PER_METER, size)
    # field = Field(FIELD_WIDTH, FIELD_LENGTH, GOAL_WIDTH, GOAL_DEPTH)
    # outer_field = Field(OUTER_FIELD_WIDTH, OUTER_FIELD_LENGTH, 0, 0)
    # ball = Ball(BALL_POS, BALL_RADIUS, BALL_WEIGHT)
    # home_goal = Goal([-FIELD_LENGTH/2 - GOAL_DEPTH/2, 0], GOAL_WIDTH, GOAL_DEPTH)
    # away_goal = Goal([FIELD_LENGTH/2 + GOAL_DEPTH/2, 0], GOAL_WIDTH, GOAL_DEPTH)
    # home_team_players = []
    # away_team_players = []

    # # random.seed(42)

    # for i in range(TEAM_SIZE):
    #     home_team_players.append(Player(
    #         [0, 0],
    #         PLAYER_RADIUS,
    #         PLAYER_WEIGHT,
    #         KICK_RADIUS,
    #         KICK_MAX_MOMENTUM,
    #         KICK_WAIT_TIME,
    #         PLAYER_MAX_VELOCITY))
    #     away_team_players.append(Player(
    #         [0, 0],
    #         PLAYER_RADIUS,
    #         PLAYER_WEIGHT,
    #         KICK_RADIUS,
    #         KICK_MAX_MOMENTUM,
    #         KICK_WAIT_TIME,
    #         PLAYER_MAX_VELOCITY))

    # home_team = Team(home_team_players)
    # away_team = Team(away_team_players)

    # # ball.velocity = away_team_players[0].position
    # game = Game(ball, home_team, away_team, home_goal, away_goal, field, 90, FRICTION)

    if len(sys.argv) < 2:
        config_path = "configs/game/default.json"
    else:
        config_path = sys.argv[1]
    config = load_config(config_path)
    game = Game.from_config(config, RandomPlayerPositionGenerator())

    game.reset()
    game.init_physics()

    # ball.add_velocity(np.array([10, 8]))

    while not done and not game.finished:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True

        # Game logic should go here
        game.update(1 / 30.0)

        screen.fill(BLACK)

        # Drawing code should go here
        game.draw(screen, camera)

        fps = int(clock.get_fps())
        font = pygame.font.SysFont(pygame.font.get_default_font(), 24)
        text_surface = font.render(f"FPS: {fps}", True, (255, 255, 255))
        screen.blit(text_surface, (50, 5))

        pygame.display.flip()

        clock.tick()

    pygame.quit()
Exemple #10
0
    def __init__(self):
        pygame.init()
        os.environ['SDL_VIDEO_CENTERED'] = '1'
        pygame.display.set_caption("Vania")
        world_size = [4096, 4096]
        self.camera = Camera((400, 300), (800, 600), world_size)
        pygame.display.set_icon(pygame.image.load('images/icon.png'))
        self.screen = pygame.display.set_mode(self.camera.dimensions, 0, 0)

        self.fonts = {
            "default_12":
            pygame.font.Font("data/fonts/Pavanam-Regular.ttf", 12),
            "default_12_bold":
            pygame.font.Font("data/fonts/Pavanam-Regular.ttf", 12),
            "default_14":
            pygame.font.Font("data/fonts/Pavanam-Regular.ttf", 14),
            "default_14_bold":
            pygame.font.Font("data/fonts/Pavanam-Regular.ttf", 14),
            "default_16":
            pygame.font.Font("data/fonts/Pavanam-Regular.ttf", 16),
            "default_16_bold":
            pygame.font.Font("data/fonts/Pavanam-Regular.ttf", 16),
            "default_32":
            pygame.font.Font("data/fonts/Pavanam-Regular.ttf", 32),
            "default_64":
            pygame.font.Font("data/fonts/Pavanam-Regular.ttf", 64),
            "julee_128":
            pygame.font.Font(os.path.abspath("data/fonts/Julee-Regular.ttf"),
                             128),
            "roboto_14_bold":
            pygame.font.Font("data/fonts/Roboto-Bold.ttf", 14)
        }

        self.fonts["default_12_bold"].set_bold(True)
        self.fonts["default_14_bold"].set_bold(True)
        self.fonts["default_16_bold"].set_bold(True)

        self.background = pygame.Surface(self.camera.dimensions)
        self.background.fill(pygame.Color("#c4dbf3"))

        grid_square_size = 64

        world_filling_number_of_grid_squares = [
            int(world_size[0] / grid_square_size),
            int(world_size[1] / grid_square_size)
        ]
        self.collision_grid = CollisionGrid(
            world_filling_number_of_grid_squares, grid_square_size)

        self.moving_sprites_group = pygame.sprite.Group()
        self.ui_sprites_group = pygame.sprite.Group()

        self.player = Player(self.moving_sprites_group, self.ui_sprites_group,
                             self.fonts, self.collision_grid, self.camera)
        self.player_health_ui = UIPlayerHealthBar(
            (20, self.camera.dimensions[1] - 30), self.fonts)

        self.tiled_level = TiledLevel(self.collision_grid,
                                      world_filling_number_of_grid_squares,
                                      self.moving_sprites_group,
                                      self.ui_sprites_group)
        self.editor = MapEditor(self.tiled_level, self.fonts,
                                self.collision_grid, self.camera)

        self.main_menu = MainMenu(self.fonts, self.camera)

        self.is_main_menu = True
        self.is_editor = False
        self.start_game = False

        self.gravity = 800.0
        self.clock = pygame.time.Clock()
        self.fps_counter = FPSCounter(self.fonts)
        self.running = True
Exemple #11
0
class VaniaGame:
    """
    An attempt to make a 'Metroidvania' style platform game.
    """
    def __init__(self):
        pygame.init()
        os.environ['SDL_VIDEO_CENTERED'] = '1'
        pygame.display.set_caption("Vania")
        world_size = [4096, 4096]
        self.camera = Camera((400, 300), (800, 600), world_size)
        pygame.display.set_icon(pygame.image.load('images/icon.png'))
        self.screen = pygame.display.set_mode(self.camera.dimensions, 0, 0)

        self.fonts = {
            "default_12":
            pygame.font.Font("data/fonts/Pavanam-Regular.ttf", 12),
            "default_12_bold":
            pygame.font.Font("data/fonts/Pavanam-Regular.ttf", 12),
            "default_14":
            pygame.font.Font("data/fonts/Pavanam-Regular.ttf", 14),
            "default_14_bold":
            pygame.font.Font("data/fonts/Pavanam-Regular.ttf", 14),
            "default_16":
            pygame.font.Font("data/fonts/Pavanam-Regular.ttf", 16),
            "default_16_bold":
            pygame.font.Font("data/fonts/Pavanam-Regular.ttf", 16),
            "default_32":
            pygame.font.Font("data/fonts/Pavanam-Regular.ttf", 32),
            "default_64":
            pygame.font.Font("data/fonts/Pavanam-Regular.ttf", 64),
            "julee_128":
            pygame.font.Font(os.path.abspath("data/fonts/Julee-Regular.ttf"),
                             128),
            "roboto_14_bold":
            pygame.font.Font("data/fonts/Roboto-Bold.ttf", 14)
        }

        self.fonts["default_12_bold"].set_bold(True)
        self.fonts["default_14_bold"].set_bold(True)
        self.fonts["default_16_bold"].set_bold(True)

        self.background = pygame.Surface(self.camera.dimensions)
        self.background.fill(pygame.Color("#c4dbf3"))

        grid_square_size = 64

        world_filling_number_of_grid_squares = [
            int(world_size[0] / grid_square_size),
            int(world_size[1] / grid_square_size)
        ]
        self.collision_grid = CollisionGrid(
            world_filling_number_of_grid_squares, grid_square_size)

        self.moving_sprites_group = pygame.sprite.Group()
        self.ui_sprites_group = pygame.sprite.Group()

        self.player = Player(self.moving_sprites_group, self.ui_sprites_group,
                             self.fonts, self.collision_grid, self.camera)
        self.player_health_ui = UIPlayerHealthBar(
            (20, self.camera.dimensions[1] - 30), self.fonts)

        self.tiled_level = TiledLevel(self.collision_grid,
                                      world_filling_number_of_grid_squares,
                                      self.moving_sprites_group,
                                      self.ui_sprites_group)
        self.editor = MapEditor(self.tiled_level, self.fonts,
                                self.collision_grid, self.camera)

        self.main_menu = MainMenu(self.fonts, self.camera)

        self.is_main_menu = True
        self.is_editor = False
        self.start_game = False

        self.gravity = 800.0
        self.clock = pygame.time.Clock()
        self.fps_counter = FPSCounter(self.fonts)
        self.running = True

    def run(self):
        while self.running:
            frame_time = self.clock.tick(60)
            time_delta = min(0.1, frame_time / 1000.0)

            # TODO: make these three states into state classes and use a state machine dictionary to switch between them
            if self.is_main_menu:
                is_main_menu_and_index = self.main_menu.run(self.screen)
                if is_main_menu_and_index[0] == 0:
                    self.is_main_menu = True
                elif is_main_menu_and_index[0] == 1:
                    self.is_main_menu = False
                    self.start_game = True
                    self.camera.reset_camera_tracking()
                    self.camera.position[0] = 316.0
                    self.camera.position[1] = 596.0
                    self.player.respawn()
                    self.tiled_level.reset_entities()
                elif is_main_menu_and_index[0] == 2:
                    self.is_main_menu = False
                    self.is_editor = True
                elif is_main_menu_and_index[0] == 3:
                    self.running = False

            elif self.is_editor:
                self.is_editor = self.editor.run(self.screen, self.background,
                                                 time_delta)
                if not self.is_editor:
                    self.is_main_menu = True
            else:
                for event in pygame.event.get():
                    if event.type == QUIT:
                        self.is_main_menu = True
                    if event.type == KEYDOWN:
                        if event.key == K_ESCAPE:
                            self.is_main_menu = True

                    self.player.process_events(event)

                if self.player.has_exited_level:
                    self.player.has_exited_level = False
                    self.is_main_menu = True

                self.camera.set_target_position(self.player.world_position)
                self.camera.update(time_delta)

                self.tiled_level.update(time_delta, self.camera)
                self.moving_sprites_group.update(time_delta, self.gravity,
                                                 self.camera)
                self.collision_grid.update_shape_grid_positions()
                self.collision_grid.check_collisions()

                self.screen.blit(self.background, (0, 0))
                self.tiled_level.draw_back_layers(self.screen)
                self.moving_sprites_group.draw(self.screen)
                self.tiled_level.draw_front_layers(self.screen)

                # draw the collision shapes
                # self.tiled_level.draw_collision_shapes(self.screen, self.camera)
                # self.player.draw_collision_shapes(self.screen, self.camera)
                # for sprite in self.moving_sprites_group:
                #    if sprite.type == "enemy":
                #        sprite.draw_debug_info(self.screen, self.camera)

                self.player_health_ui.update(self.player)
                self.player_health_ui.draw(self.screen)

                self.ui_sprites_group.update()
                self.ui_sprites_group.draw(self.screen)

                self.fps_counter.update(time_delta)
                self.fps_counter.draw(self.screen, self.camera)

            pygame.display.flip()
Exemple #12
0
class Level:
    def __init__(self, game, name):
        self.objects = []
        self.topobjects = []
        self.toptopobjects = []
        self.ennemies = []
        self.bonuses = []
        self.platforms = []
        self.blocks = []
        self.camera = Camera(0, 0, game.width, game.height)
        self.imageMario = None
        self.imageAssets = None
        self.imageCloud = None
        self.imageBush = None
        self.imageSprites = None
        self.imageTiles = None
        self.state = State()
        self.running = True
        self.fond = None
        self.game = game
        self.name = name
        self.starttime = datetime.utcnow()
        self.timelimit = 100
        self.tilemap = []
        self.sounds = {}
        self.ytile = 0
        self.bgcolor = (0, 0, 0)
        self.lastkeys = None
        self.mario = None
        self.levelState = LevelState.RUNNING
        self.timeevent = pygame.time.get_ticks()
        self.opacityend = 0

    def playsound(self, key):
        self.sounds[key].play()

    def initmap(self):
        if self.name is not None:
            with open('game\\assets\\levels\\{}.csv'.format(self.name),
                      'rb') as csvfile:
                spamreader = csv.reader(csvfile, delimiter=',')
                for row in spamreader:
                    line = []
                    for i in range(0, len(row)):
                        if len(row[i]) == 0:
                            row[i] = '0'
                        line.append(int(row[i]))
                    self.tilemap.append(line)

    def istileground(self, value):
        grounds = [1, 2, 3, 8, 9, 14, 15, 24, 25, 26, 27]
        return value in grounds

    def istileblock(self, value):
        blocks = [8, 9, 10, 11, 14, 24, 25, 26]
        return value in blocks

    def istilebonus(self, value):
        return -100 <= value < 0

    def istileennemy(self, value):
        return -1000 <= value < -100

    def istileasset(self, value):
        return value < -1000

    def loadimage(self):
        print "Loading Level"

        self.imageSprites = pygame.image.load(
            "game\\assets\\sprites\\sprites.bmp").convert_alpha()
        self.imageSprites.set_alpha(120)

        self.imageTiles = pygame.image.load(
            "game\\assets\\sprites\\tiles.bmp").convert_alpha()
        self.surfacetile = pygame.Surface((16, 16))
        self.surfacetile.set_colorkey(Color(255, 0, 255, 255), RLEACCEL)

    def reset(self):
        self.mario.position.x = 32
        self.mario.position.y = 300
        self.mario.energy = 5
        self.camera.rect.x = 0
        self.camera.rect.y = 0
        self.starttime = datetime.utcnow()

    def unloadcontent(self):
        print "unload"
        del self.objects[:]
        del self.topobjects[:]
        del self.toptopobjects[:]
        del self.ennemies[:]
        del self.blocks[:]
        del self.bonuses[:]
        del self.platforms[:]
        del self.tilemap[:]
        self.sounds.clear()

    def end(self):
        self.running = False

        self.unloadcontent()

    def start(self, mario):
        print "start"
        self.mario = mario
        self.mario.position.left = 32
        self.mario.position.top = 300
        self.initmap()
        self.loadimage()
        self.loadcontent()
        self.starttime = datetime.utcnow()
        self.running = True

    def loadcontent(self):
        print "Load"
        self.loadtilemap()
        self.sounds['yellowcoin'] = pygame.mixer.Sound(
            "game\\assets\\sounds\\coin.wav")
        self.sounds['dragoncoin'] = pygame.mixer.Sound(
            "game\\assets\\sounds\\smw_dragon_coin.wav")
        self.sounds['turtle'] = pygame.mixer.Sound(
            "game\\assets\\sounds\\smw_stomp.wav")
        self.sounds['mariojump'] = pygame.mixer.Sound(
            "game\\assets\\sounds\\smw_jump.wav")
        self.sounds['cough'] = pygame.mixer.Sound(
            "game\\assets\\sounds\\cough.wav")
        self.sounds['block'] = pygame.mixer.Sound(
            "game\\assets\\sounds\\smw_block.wav")
        self.sounds['mushroom'] = pygame.mixer.Sound(
            "game\\assets\\sounds\\smw_mushroom.wav")
        self.sounds['level-complete'] = pygame.mixer.Sound(
            "game\\assets\\sounds\\level-complete.wav")
        self.sounds['level-complete-low'] = pygame.mixer.Sound(
            "game\\assets\\sounds\\level-complete-low.wav")

    def loadtilemap(self):
        f = Factory()
        for row in range(len(self.tilemap)):
            for column in range(len(self.tilemap[0])):
                position = pygame.Rect(column * TILESIZE, row * TILESIZE,
                                       TILESIZE, TILESIZE)
                value = self.tilemap[row][column]
                if self.istileground(value):
                    self.platforms.append(Plateform(position, value))
                if self.istileblock(value):
                    self.blocks.append(position)
                if self.istilebonus(value):
                    obj = f.buildobject(self.imageSprites, value, position.x,
                                        position.y)
                    if obj is not None:
                        self.objects.append(obj)
                        self.bonuses.append(obj)
                if self.istileennemy(value):
                    obj = f.buildobject(self.imageSprites, value, position.x,
                                        position.y)
                    if obj is not None:
                        self.objects.append(obj)
                        self.ennemies.append(obj)
                if self.istileasset(value):
                    obj = f.buildobject(self.imageSprites, value, position.x,
                                        position.y)
                    if obj is not None:
                        self.objects.append(obj)
                if value == -7:
                    obj = BlockCoin(self.imageSprites, position.x, position.y)
                    self.objects.append(obj)
                    self.platforms.append(Plateform(obj.position, 1))
                    self.bonuses.append(obj)
                    self.blocks.append(obj.position)

    def update(self):
        ticks = pygame.time.get_ticks()
        if self.levelState == LevelState.TERMINATING:
            self.mario.frame = 10
            self.opacityend = min(255, self.opacityend + 6)
            pygame.mixer.music.stop()
            if (ticks - self.timeevent) > 2000:
                return Message.TERMINATELEVEL
            return

        for localevent in event.get():
            if localevent.type == pygame.QUIT:
                self.running = False
        keys = pygame.key.get_pressed()
        if keys[K_RETURN] and not self.lastkeys[K_RETURN]:
            self.game.showmenu(True)
        if keys[K_ESCAPE]:
            self.screen = pygame.display.set_mode(
                (self.camera.rect.width, self.camera.rect.height))
        if keys[K_LALT] and keys[K_RETURN]:
            self.screen = pygame.display.set_mode(
                (self.camera.rect.width, self.camera.rect.height), FULLSCREEN)

        self.lastkeys = keys

        for obj in self.objects:
            if not obj.isalive and obj.inscreen(self):
                obj.isalive = True
        for obj in self.topobjects:
            if not obj.isalive and obj.inscreen(self):
                obj.isalive = True

        for obj in self.objects:
            if obj.isalive:
                obj.update(self)

        for obj in self.topobjects:
            if obj.isalive:
                obj.update(self)

        for obj in self.toptopobjects:
            if obj.isalive:
                obj.update(self)

        res = self.mario.update(self)
        if res is Message.TERMINATELEVEL:
            self.levelState = LevelState.TERMINATING
            self.timeevent = pygame.time.get_ticks()

        self.updatecamera()

    def updatecamera(self):
        y = self.mario.position.bottom + self.camera.rect.height / 2
        if y < len(self.tilemap) * TILESIZE:
            self.camera.setcentery(
                max(self.camera.rect.height / 2, self.mario.position.bottom))

        if self.mario.position.left >= self.camera.rect.width / 2 and self.mario.position.right < (
                len(self.tilemap[0]) +
                1) * TILESIZE - self.camera.rect.width / 2:
            x = self.mario.position.left
            self.camera.setcenterx(x)

    def drawtilemap(self, game):
        xcam = self.camera.rect.left
        ycam = self.camera.rect.top
        idxX = xcam / TILESIZE
        idxY = ycam / TILESIZE
        for row in range(idxY, idxY + self.camera.rect.height / TILESIZE + 1):
            if 0 <= row < len(self.tilemap):
                for column in range(
                        idxX, idxX + self.camera.rect.width / TILESIZE + 1):
                    if column < len(self.tilemap[row]):
                        value = self.tilemap[row][column]
                        if value > VOID:
                            position = pygame.Rect(column * TILESIZE,
                                                   row * TILESIZE, TILESIZE,
                                                   TILESIZE)
                            self.surfacetile.blit(
                                self.imageTiles, (0, 0),
                                ((value - 1) * TILESIZE, self.ytile, TILESIZE,
                                 TILESIZE))
                            game.screen.blit(self.surfacetile,
                                             position.move(-xcam, -ycam))

    def draw(self, game):
        if self.running:
            self.drawtilemap(game)
            for obj in self.objects:
                if obj.inscreen(self):
                    obj.draw(self)
            self.mario.draw(self)

            for obj in self.topobjects:
                if obj.inscreen(self):
                    obj.draw(self)

            self.state.draw(self)
            if self.levelState == LevelState.TERMINATING:
                rect = pygame.Surface((640, 480), pygame.SRCALPHA, 32)
                rect.fill((0, 0, 0, self.opacityend))
                screen = pygame.display.get_surface()
                screen.blit(rect, (0, 0))
                self.mario.draw(self)
                for obj in self.toptopobjects:
                    print type(obj)
                    obj.draw(self)

            pygame.display.flip()
Exemple #13
0
 def _update_camera(self):
     self.camera = Camera(self.adventure.map.width, self.adventure.map.height)
Exemple #14
0
class Game:
    def __init__(self):
        init()
        font.init()
        display.set_caption(TITLE)
        key.set_repeat()

        self.playing = False

        self.screen = display.set_mode((WIDTH, HEIGHT))

        self.clock = time.Clock()
        self.dt = self.clock.tick(FPS) / 1000

        self.labels = list()
        self.infos = list()

        self.all_sprites = Group()

        self.adventure = Home(self)

        self.camera = Camera(self.adventure.map.width, self.adventure.map.height)
        self.score = Score("Renato")

        self.game_over = False

    def update_adventure(self, adventure):
        self.show_ended_screen()

        self.adventure.player.kill()
        self.labels = list()
        self.infos = list()

        self.adventure = adventure
        self._update_camera()

        self.show_go_screen()

        self.score.start_adventure(adventure.level.level_score)

    def run(self):
        self.playing = True

        while self.playing:
            self.events()
            self.update()
            self.draw()

            if self.game_over:
                break

            if self.adventure.finish:
                self.show_end_adventure_screen()
                break

    def update(self):
        # update info
        self.infos = list()

        self.adventure.update()
        self.all_sprites.update()

        self.camera.update(self.adventure.player)

    def draw(self):
        if not self.adventure.has_menu:
            self.screen.blit(self.adventure.map_image, self.camera.apply_rect(self.adventure.map_rect))

            for sprite in self.all_sprites:
                self.screen.blit(sprite.image, self.camera.apply(sprite))

            for label in self.labels:
                self.screen.blit(label.surface, self.camera.apply_rect(label.rect))

            for info in self.infos:
                self.screen.blit(info.surface, info.rect)

            for zombie in self.adventure.zombies:
                zombie.draw_health()

        display.flip()

    def events(self):
        events = key_event.get()
        if not self.adventure.has_menu:
            for event in events:
                if event.type == QUIT:
                    self.__quit__()
                if event.type == KEYDOWN:
                    if event.key == K_ESCAPE:
                        self.__quit__()

        self.adventure.events(events)

    def show_start_screen(self):
        pass

    def show_go_screen(self):
        self.update()

        start_display = Surface((WIDTH, HEIGHT), SRCALPHA)
        for alpha in range(255, 0, -1):
            start_display.fill((0, 0, 0, alpha))

            self.screen.blit(self.adventure.map_image, self.camera.apply_rect(self.adventure.map_rect))
            self.screen.blit(start_display, (0, 0))

            display.flip()
            time.delay(10)

    def show_ended_screen(self):
        self.update()

        start_display = Surface((WIDTH, HEIGHT), SRCALPHA)
        for alpha in range(255):
            start_display.fill((0, 0, 0, alpha))

            self.screen.blit(self.adventure.map_image, self.camera.apply_rect(self.adventure.map_rect))
            self.screen.blit(start_display, (0, 0))

            display.flip()
            time.delay(10)

    def show_game_over_screen(self):
        game_over_display = Surface((WIDTH, HEIGHT), SRCALPHA)
        game_over_text = Label('Game Over', 'assets/fonts/blocks.ttf', 20, (HEIGHT / 2) - 100, font_size=72)
        score_text = Label('For save the score you need finish adventure', 'assets/fonts/future_narrow.ttf', 20,
                           (HEIGHT / 2) - 120, font_size=24)

        return_text = Label('You will return to home', 'assets/fonts/future_narrow.ttf', 20, (HEIGHT / 2) - 160,
                            font_size=24)
        for alpha in range(255):
            game_over_display.fill((0, 0, 0, alpha))

            self.screen.blit(game_over_display, (0, 0))

            self.screen.blit(game_over_text.surface, game_over_text.rect)
            self.screen.blit(score_text.surface, score_text.rect)
            self.screen.blit(return_text.surface, return_text.rect)

            display.flip()

            time.delay(10)

    def show_end_adventure_screen(self):
        end_surface = Surface((WIDTH, HEIGHT), SRCALPHA)
        end_text = Label('Good Nice!', 'assets/fonts/blocks.ttf', 20, (HEIGHT / 2) - 100, font_size=72)
        score_text = Label(f'Score: {self.score.calculate_score()}', 'assets/fonts/future_narrow.ttf', 20,
                           (HEIGHT / 2) - 120, font_size=24)

        return_text = Label('You will return to home and see you score ranking', 'assets/fonts/future_narrow.ttf', 20,
                            (HEIGHT / 2) - 160,
                            font_size=24)
        for alpha in range(255):
            end_surface.fill((0, 0, 0, alpha))

            self.screen.blit(end_surface, (0, 0))

            self.screen.blit(end_text.surface, end_text.rect)
            self.screen.blit(score_text.surface, score_text.rect)
            self.screen.blit(return_text.surface, return_text.rect)

            display.flip()

            time.delay(10)

    def _update_camera(self):
        self.camera = Camera(self.adventure.map.width, self.adventure.map.height)

    @staticmethod
    def __quit__():
        quit()
        sys.exit()
Exemple #15
0
class Game:
    def __init__(self):
        pg.init()
        pg.mixer.init()
        self.screen = pg.display.set_mode((WIDTH, HEIGHT))
        pg.display.set_caption(TITLE)
        self.clock = pg.time.Clock()
        self.running = True
        self.double_speed = False
        self.number_of_levels = 4

        self.navigator = Navigator(self)
        self.drawer = Drawer(self.screen)
        self.creator = Creator()

        self.init_player()
        self.init_sprite_lists()

        self.camera = Camera(self.player, self.creator.shiftable,
                             self.creator.texts)

        self.is_tutorial = False
        self.current_level = 0

    def init_sprite_lists(self):
        self.all_sprites = self.creator.all_sprites
        self.platform_list = self.creator.platforms
        self.tile_list = self.creator.tiles
        self.enemy_list = self.creator.enemies
        self.coin_list = self.creator.coins
        self.player.collide_list = self.creator.player_collide_list
        self.bullet_list = self.creator.bullets

    def init_player(self):
        self.player = self.creator.player
        self.player.weapon = Weapon(self.creator)

    def stop(self):
        self.playing = False
        self.running = False

    def new(self, level):
        """ Calls level or final level building and playing loop """
        self.current_level = level
        if level == self.number_of_levels - 1:
            self.creator.build_level_final(self.player)
            self.run()
        elif 0 <= level < self.number_of_levels - 1:
            self.creator.build_level(self.player)
            self.run()
        else:
            return

    def run(self):
        self.playing = True
        while self.playing:
            self.clock.tick(FPS)
            self.events()
            self.update()
            if self.playing:
                self.draw()

    def update(self):
        """ Handles screen updates """

        if self.player.hp <= 0:
            self.player.kill()
            self.navigator.show_go_screen()

        for coin in pg.sprite.spritecollide(self.player, self.coin_list,
                                            False):
            coin.kill()
            self.player.money += 30

        for enemy in pg.sprite.spritecollide(self.player, self.enemy_list,
                                             False):
            if abs(enemy.rect.x - self.player.rect.x) <= self.player.rect.width / 2 \
                    and self.player.rect.bottom == enemy.rect.bottom:
                self.player.receive_damage(1)

            if isinstance(enemy, AirEnemy) \
                    and abs(enemy.rect.x - self.player.rect.x) <= self.player.rect.width / 2 \
                    and abs(enemy.rect.y - self.player.rect.y) <= self.player.rect.height / 2:
                if not self.is_tutorial:
                    self.player.receive_damage(1)

            if isinstance(enemy, SlimeBlock) \
                    and abs(enemy.rect.x - self.player.rect.x) <= self.player.rect.width / 2 \
                    and abs(enemy.rect.y - self.player.rect.y) <= self.player.rect.height / 2:
                if not self.is_tutorial:
                    self.player.receive_damage(1)

        pg.sprite.groupcollide(self.bullet_list, self.platform_list, True,
                               False)
        pg.sprite.groupcollide(self.bullet_list, self.tile_list, True, False)

        collision_dict = pg.sprite.groupcollide(self.bullet_list,
                                                self.enemy_list, True, False)
        for bullet in collision_dict:
            for enemy in collision_dict[bullet]:
                enemy.hp -= bullet.damage

        self.all_sprites.update()
        self.camera.update()

    def events(self):
        """ Handles key events """
        for event in pg.event.get():
            if event.type == pg.QUIT:
                pg.quit()
                sys.exit()

            if event.type == pg.KEYDOWN:
                if event.key == pg.K_SPACE:
                    self.player.fire()

                if event.key == pg.K_LEFT:
                    if self.double_speed:
                        self.player.go_left_fast()
                    else:
                        self.player.go_left()
                if event.key == pg.K_RIGHT:
                    if self.double_speed:
                        self.player.go_right_fast()
                    else:
                        self.player.go_right()
                if event.key == pg.K_LSHIFT:
                    if not self.double_speed:
                        self.double_speed = True
                    else:
                        self.double_speed = False
                if event.key == pg.K_UP:
                    self.player.jump()

            if event.type == pg.KEYUP:
                if event.key == pg.K_LEFT and self.player.vel_x < 0:
                    self.player.stop()
                if event.key == pg.K_RIGHT and self.player.vel_x > 0:
                    self.player.stop()

        self.all_sprites.update()


        if abs((self.creator.right_wall.rect.x -
                self.creator.right_wall.rect.width / 2) -
               (self.player.rect.x + self.player.rect.width / 2)) <= 25:
            if self.is_tutorial:
                self.navigator.show_tutorial_done_screen()
            else:
                if self.current_level < self.number_of_levels - 1:
                    self.navigator.go_to_store()
                elif self.is_boss_level():
                    if not self.creator.boss.alive():
                        self.navigator.show_congrats_screen()

    def draw_stats_bar(self):
        self.drawer.draw_player_stats(self.player)

        if self.is_boss_level():
            self.drawer.draw_health_bar(
                self.creator.boss, 700, 20, 5)

    def draw(self):
        self.screen.fill(RED)
        self.draw_stats_bar()
        self.all_sprites.draw(self.screen)
        if self.is_tutorial:
            self.blit_texts()
        pg.display.flip()

    def blit_texts(self):
        for sf, rect in self.creator.texts:
            self.screen.blit(sf, rect.midtop)

    def reset(self):
        self.player.hp = 15
        self.player.money = 0
        self.running = True
        self.playing = True
        pass

    def tutorial(self):
        self.is_tutorial = True
        self.creator.build_tutorial_level(self.player, self.screen)
        self.run()

    def is_boss_level(self):
        if self.is_tutorial:
            return False
        return self.current_level == self.number_of_levels - 1
Exemple #16
0
def main():

    pygame.init()
    pygame.key.set_repeat()
    x_screen_size = 1024
    y_screen_size = 600
    screen_data = ScreenData([x_screen_size, 0], [x_screen_size, 184],
                             [x_screen_size, y_screen_size])
    camera = Camera((512, 300), (x_screen_size, y_screen_size),
                    (16 * 64, 128 * 64))
    screen = pygame.display.set_mode(screen_data.screenSize)
    pygame.display.set_caption('Maximum Gunishment')
    background = pygame.Surface(screen.get_size())
    background = background.convert()
    background.fill((95, 140, 95))

    player_sprites = pygame.sprite.OrderedUpdates()
    all_tile_sprites = pygame.sprite.Group()
    all_monster_sprites = pygame.sprite.OrderedUpdates()
    all_pick_up_sprites = pygame.sprite.Group()
    all_explosion_sprites = pygame.sprite.Group()
    all_projectile_sprites = pygame.sprite.Group()

    fonts = {}
    small_font = pygame.font.Font(None, 16)
    font = pygame.font.Font("data/BOD_PSTC.TTF", 32)
    large_font = pygame.font.Font("data/BOD_PSTC.TTF", 150)

    fonts["default_14"] = pygame.font.Font(None, 14)
    fonts["default_32"] = pygame.font.Font(None, 32)
    fonts["default_16"] = small_font
    fonts["bod_pstc_32"] = font
    fonts["bod_pstc_150"] = large_font

    fps_counter = FPSCounter(fonts)

    explosions_sprite_sheet = pygame.image.load(
        "images/explosions.png").convert_alpha()

    players = []
    monsters = []
    pick_ups = []
    projectiles = []
    explosions = []
    new_explosions = []

    tiled_level = TiledLevel([16, 128], all_monster_sprites, monsters,
                             screen_data, explosions_sprite_sheet)

    tiled_level.load_tiles()
    tiled_level.reset_guards()
    main_menu = MainMenu(fonts)

    editor_hud_rect = pygame.Rect(
        0, screen_data.screenSize[1] - screen_data.editorHudDimensions[1],
        screen_data.editorHudDimensions[0], screen_data.editorHudDimensions[1])
    editor = MapEditor(tiled_level, editor_hud_rect, fonts)

    health_bar = HealthBar([50, 25], 100, 16)

    pick_up_spawner = PickUpSpawner(pick_ups, all_pick_up_sprites)

    player = None

    clock = pygame.time.Clock()

    time_multiplier = 1.0
    running = True

    is_main_menu = True
    is_editor = False

    is_game_over = False
    restart_game = False
    win_message = ""

    spawn_monsters(monsters, all_monster_sprites, screen_data, tiled_level,
                   explosions_sprite_sheet)

    while running:
        frame_time = clock.tick(60)
        time_delta = frame_time / 1000.0

        if is_main_menu:
            is_main_menu_and_index = main_menu.run(screen, fonts, screen_data)
            if is_main_menu_and_index[0] == 0:
                is_main_menu = True
            elif is_main_menu_and_index[0] == 1:
                is_main_menu = False
            elif is_main_menu_and_index[0] == 2:
                is_main_menu = False
                is_editor = True
            elif is_main_menu_and_index[0] == 3:
                running = False
            if not is_main_menu and not is_editor:
                # spawn player
                default_scheme = ControlScheme()
                player = Player(tiled_level.find_player_start(), tiled_level,
                                default_scheme, explosions_sprite_sheet)
                players.append(player)

        elif is_editor:
            screen_data.set_editor_active()
            running = editor.run(screen, background, all_tile_sprites,
                                 editor_hud_rect, time_delta)

        else:

            if restart_game:
                restart_game = False

                # clear all stuff
                players[:] = []
                monsters[:] = []
                pick_ups[:] = []
                projectiles[:] = []
                explosions[:] = []
                new_explosions[:] = []
                all_monster_sprites.empty()
                all_pick_up_sprites.empty()

                is_game_over = False

                tiled_level.reset_guards()
                default_scheme = ControlScheme()
                player = Player(tiled_level.find_player_start(), tiled_level,
                                default_scheme, explosions_sprite_sheet)
                players.append(player)

                spawn_monsters(monsters, all_monster_sprites, screen_data,
                               tiled_level, explosions_sprite_sheet)

            elif is_game_over:
                pass
            else:
                pass

            if player is not None:
                if player.health <= 0 or player.position[1] < 0 < player.health:
                    if player.health <= 0:
                        is_game_over = True
                        win_message = "You have been defeated!"
                    if player.position[1] < 0 < player.health:
                        is_game_over = True
                        win_message = "You are victorious!"

                    win_message_bg_text_render = large_font.render(
                        win_message.upper(), True, pygame.Color("#444444"))
                    win_message_text_render = large_font.render(
                        win_message.upper(), True, pygame.Color("#FFFFFF"))
                    win_message_text_render_rect = win_message_text_render.get_rect(
                        centerx=x_screen_size / 2,
                        centery=(y_screen_size / 2) - 128)
                    play_again_text_render = font.render(
                        "Play Again? Press 'Y' to restart".upper(), True,
                        pygame.Color("#FFFFFF"))
                    play_again_bg_text_render = font.render(
                        "Play Again? Press 'Y' to restart".upper(), True,
                        pygame.Color("#444444"))
                    play_again_text_render_rect = play_again_text_render.get_rect(
                        centerx=x_screen_size / 2, centery=(y_screen_size / 2))

            all_projectile_sprites.empty()
            all_explosion_sprites.empty()
            player_sprites.empty()

            # handle UI and inout events
            for event in pygame.event.get():
                if event.type == QUIT:
                    running = False

                if event.type == KEYDOWN:
                    if event.key == K_ESCAPE:
                        running = False
                    if is_game_over:
                        if event.key == K_y:
                            restart_game = True

                for player in players:
                    player.process_event(event)

            if player is not None:
                health_bar.update(player.health, player.maxHealth)

            offset_position = [player.position[0], player.position[1] - 268]
            tiled_level.update_offset_position(offset_position,
                                               all_tile_sprites)

            for pick_up in pick_ups:
                pick_up.update_movement_and_collision(player, time_delta,
                                                      tiled_level)
            pick_ups[:] = [
                pick_up for pick_up in pick_ups if not pick_up.shouldDie
            ]

            for player in players:
                player.update_movement_and_collision(time_delta, projectiles,
                                                     tiled_level,
                                                     new_explosions)
                player_sprites = player.update_sprite(player_sprites,
                                                      time_delta)
                time_multiplier = 1.0
            players[:] = [player for player in players if not player.shouldDie]

            for monster in monsters:
                monster.update_movement_and_collision(time_delta,
                                                      time_multiplier, player,
                                                      new_explosions,
                                                      tiled_level, projectiles,
                                                      pick_up_spawner)
                monster.update_sprite(time_delta, time_multiplier)
            monsters[:] = [
                monster for monster in monsters if not monster.shouldDie
            ]
            new_explosions[:] = []

            for projectile in projectiles:
                projectile.update_movement_and_collision(
                    tiled_level, tiled_level.collidableTiles, players,
                    monsters, time_delta, new_explosions, explosions)
                all_projectile_sprites = projectile.update_sprite(
                    all_projectile_sprites)
            projectiles[:] = [
                projectile for projectile in projectiles
                if not projectile.shouldDie
            ]

            for explosion in explosions:
                all_explosion_sprites = explosion.update_sprite(
                    all_explosion_sprites, time_delta, time_multiplier,
                    tiled_level)
            explosions[:] = [
                explosion for explosion in explosions
                if not explosion.shouldDie
            ]

            screen.blit(background, (0, 0))  # draw the background

            all_tile_sprites.draw(screen)
            all_pick_up_sprites.draw(screen)
            all_monster_sprites.draw(screen)
            player_sprites.draw(screen)
            all_explosion_sprites.draw(screen)
            all_projectile_sprites.draw(screen)

            health_bar.draw(screen, small_font)

            fps_counter.update(time_delta)
            fps_counter.draw(screen, camera)

            if is_game_over:
                center = (win_message_text_render_rect.centerx,
                          win_message_text_render_rect.centery)
                screen.blit(
                    win_message_bg_text_render,
                    win_message_bg_text_render.get_rect(centerx=center[0] - 2,
                                                        centery=center[1]))
                screen.blit(
                    win_message_bg_text_render,
                    win_message_bg_text_render.get_rect(centerx=center[0] + 2,
                                                        centery=center[1]))
                screen.blit(
                    win_message_bg_text_render,
                    win_message_bg_text_render.get_rect(centerx=center[0],
                                                        centery=center[1] - 2))
                screen.blit(
                    win_message_bg_text_render,
                    win_message_bg_text_render.get_rect(centerx=center[0],
                                                        centery=center[1] + 2))
                screen.blit(win_message_text_render,
                            win_message_text_render_rect)

                center = (play_again_text_render_rect.centerx,
                          play_again_text_render_rect.centery)
                screen.blit(
                    play_again_bg_text_render,
                    play_again_bg_text_render.get_rect(centerx=center[0] - 2,
                                                       centery=center[1]))
                screen.blit(
                    play_again_bg_text_render,
                    play_again_bg_text_render.get_rect(centerx=center[0] + 2,
                                                       centery=center[1]))
                screen.blit(
                    play_again_bg_text_render,
                    play_again_bg_text_render.get_rect(centerx=center[0],
                                                       centery=center[1] - 2))
                screen.blit(
                    play_again_bg_text_render,
                    play_again_bg_text_render.get_rect(centerx=center[0],
                                                       centery=center[1] + 2))

                screen.blit(play_again_text_render,
                            play_again_text_render_rect)

        pygame.display.flip()  # flip all our drawn stuff onto the screen

    pygame.quit()  # exited game loop so quit pygame