Esempio n. 1
0
class Game:
    def __init__(self):
        self.__level = None

        # lists of game objects
        self.__player: Player = self.__get_player()
        self.__blocks = None
        self.__entities = None
        self.__camera = None

        # pygame props
        self.__running: bool = True
        self.__clock = pygame.time.Clock()
        self.__screen = SCREEN
        self.__bg = None

    def load_level(self, path) -> None:
        if self.__level:
            self.__screen.blit(self.__bg, (0, 0))

        self.__level = LevelManager.load_level(path)
        self.__blocks = self.__level.get_blocks()
        self.__entities = self.__get_entities_group()
        self.__camera = Camera(self.__player, self.__level)
        self.__bg = self.__get_bg()
        self.__player.set_spawn_point(self.__level.get_player_spawn())

        self.__player.respawn()

    def __get_entities_group(self) -> pygame.sprite.Group:
        g = self.__blocks.copy()
        g.add(self.__player)
        return g

    def __get_bg(self) -> pygame.Surface:
        s = pygame.Surface(self.__camera.get_size())
        s.fill(COL_BG)
        return s

    def mainloop(self) -> None:
        if not self.__level:
            raise ApplicationError(
                'Please load a level before starting the mainloop')

        while self.__running:
            self.__clock.tick(60)

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.__running = False
                elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                    self.__running = False

            # update
            self.__entities.update()
            self.__camera.update()

            # render
            self.__entities.clear(self.__camera, self.__bg)
            if DEBUG:
                self.__camera.blit(self.__player.render_player_debug_info(),
                                   (self.__camera.get_pos_inverted()))
            self.__entities.draw(self.__camera)

            self.__screen.blit(self.__camera, self.__camera.get_pos())

            pygame.display.flip()

        pygame.display.quit()
        pygame.quit()
        sys.exit()

    def get_blocks(self) -> pygame.sprite.Group:
        return self.__blocks

    def __get_player(self) -> Player:
        player_image = pygame.Surface((PLAYER_WIDTH, PLAYER_HEIGHT))
        player_image.fill(COL_PLAYER)
        player_rect = pygame.Rect(0, 0, PLAYER_WIDTH, PLAYER_HEIGHT)
        player_keys = Keys(PLAYER1_KEY_LEFT, PLAYER1_KEY_RIGHT,
                           PLAYER1_KEY_JUMP, PLAYER1_KEY_RUN)
        player = Player(self, player_keys, player_rect, player_image)
        player.respawn()
        return player
Esempio n. 2
0
    # Update objects
    camera_position_text.set_string("camera position = " + str(camera.get_position()))
    angle_value_text.set_string("angle = " + str(raymarch.get_angle()))
    distance_to_object_text.set_string("distance to object = " + str(raymarch.get_distance_to_object()))
    fps_text.set_string("FPS = " + str(int(fps)))
    camera.update(mouse_position)

    main_surface.fill((255, 255, 255))
    camera_position_text.blit()
    angle_value_text.blit()
    distance_to_object_text.blit()
    fps_text.blit()
    # Draw axes
    pygame.draw.line(main_surface, (0, 0, 0), (0, SCREEN_HEIGHT // 2), (SCREEN_WIDTH, SCREEN_HEIGHT // 2))
    pygame.draw.line(main_surface, (0, 0, 0), (SCREEN_WIDTH // 2, 0), (SCREEN_WIDTH // 2, SCREEN_HEIGHT))
    for obj in objects:
        obj.blit()
    camera.blit()
    raymarch.blit()
    if raymarch_process:
        raymarch.calculate(main_surface, mouse_position, camera.get_position(), objects)

    pygame.display.update()

    try:
        frame_processing_time.append(round(1 / (time() - start_frame_time)))
    except ZeroDivisionError:
        frame_processing_time.append(0)

    frame_count += 1