Exemple #1
0
    def __init__(self,
                 screen: pygame.Surface,
                 x=0,
                 y=0,
                 h_fov=pi / 2,
                 distance=15):
        # Экран, на который будет выводиться изображение
        self.screen = screen
        # Временная поверхность для рисования, потом блитится на экран
        self.temp_surface = pygame.Surface(screen.get_rect().size)

        # Далее физические характеристики камеры
        # Физические координаты центра камеры
        self.__position = np.array([float(x), float(y)])
        # Горизонтальный угол обзора камеры
        self.h_fov = h_fov
        # Расстояние от камеры до поверхности экрана
        self.__distance = distance
        # Физическая ширина области вилимости камеры
        self.window_width = 2 * self.__distance * tan(self.h_fov / 2)
        # Физическая высота области вилимости камеры
        self.window_height = self.window_width * SCREEN_HEIGHT / SCREEN_WIDTH
        # Вертикальный угол обзора камеры
        self.v_fov = atan(self.window_height / self.__distance / 2)
        # Физическая область видимости камеры
        self.camera_rect = PhysicalRect(
            self.__position[0] - self.window_width / 2,
            self.__position[1] - self.window_height / 2, self.window_width,
            self.window_height)

        # Коэффициент, на который умножаются координаты, чтобы отрисовать объекты на экране на экране
        self.scale_factor = SCREEN_WIDTH / self.window_width
        self.dev_font = pygame.font.SysFont(pygame.font.get_fonts()[0], 50)
    def __init__(self, x, y, width=0.3, height=0.3, sprite=None):
        self._position = Vec2d(x, y)
        self.width = width
        self.height = height
        self.sprite = sprite
        if self.sprite is not None:
            # Переворачиваем спрайт
            self.sprite = pygame.transform.flip(self.sprite, False, True)

        self.body_rect = PhysicalRect(x, y, width, height)

        self.scaled_sprite = self.sprite
        self.last_camera_distance = -1
Exemple #3
0
 def position(self, new_position):
     """
     Устанавливает новые физические координаты центра обзора
     :param new_position: новые физические координаты центра камеры
     :return: физические координаты центра камеры
     """
     # Изменение позиции
     self.__position = new_position
     # Пересчёт физической области видимости
     self.camera_rect = PhysicalRect(
         self.__position[0] - self.window_width / 2,
         self.__position[1] - self.window_height / 2, self.window_width,
         self.window_height)
Exemple #4
0
    def __init__(self, game_app):
        super(TestLevel, self).__init__(game_app,
                                        PhysicalRect(-16, -9, 32, 18))
        self.bg = SunnyField()

        self.player = Player(
            self.physical_space,
            0,
            0.1,
            img=pygame.image.load('src/Levels/Boxer2_Idle_000.png'))

        self.entities.append(self.player)

        ball_moment = pymunk.moment_for_circle(10, 0, 0.4)
        self.ball = pymunk.Body(10, ball_moment)
        self.ball.position = -1, 1

        self.ball_shape = pymunk.Circle(self.ball, 0.4)
        self.ball_shape.elasticity = 0
        self.ball_shape.friction = 1
        self.physical_space.add(self.ball, self.ball_shape)

        hl = pymunk.Segment(self.physical_space.static_body,
                            (self.border.x, 0),
                            (self.border.x + self.border.width, 0), 0)
        hl.friction = 1
        self.physical_space.add(hl)

        self.objects.append(
            GameObject(1,
                       1,
                       sprite=pygame.image.load('src/Levels/monalisa.jpg')))
        self.objects.append(
            StaticRectangularObject(
                2,
                0,
                1,
                0.7,
                sprite=pygame.image.load('src/Levels/monalisa.jpg'),
                physical_space=self.physical_space))
Exemple #5
0
    def __init__(self, game_app, border=PhysicalRect(-10, -5, 20, 10)):
        """
        :param game_app: приложение игры, нужно для управления сценой
        """
        self.game_app = game_app
        # Игровые события
        self.game_events: list[GameEvent] = []
        # Предметы на игровом поле, например летающие ножи, частицы и т.д.
        self.objects = []
        # Живые сущности, например враги
        self.entities = []
        # Задний фон
        self.bg = SunnyField()

        # Сама физика
        # физическое пространство
        self.physical_space = pymunk.Space()
        self.physical_space.gravity = GRAVITY

        # Граница уровня
        self.border = border
        top = pymunk.Segment(self.physical_space.static_body,
                             self.border.topleft, self.border.topright, 0)
        bottom = pymunk.Segment(self.physical_space.static_body,
                                self.border.bottomright,
                                self.border.bottomleft, 0)
        right = pymunk.Segment(self.physical_space.static_body,
                               self.border.topright, self.border.bottomright,
                               0)
        left = pymunk.Segment(self.physical_space.static_body,
                              self.border.bottomleft, self.border.topleft, 0)

        bottom.friction = 1  # трение на полу

        self.physical_space.add(top)
        self.physical_space.add(bottom)
        self.physical_space.add(right)
        self.physical_space.add(left)
Exemple #6
0
    def distance(self, new_distance):
        """
        Возращает физическое расстояние от камеры до сцены
        :return:
        """
        if new_distance <= 0:
            # raise CameraError("Distance became negative")
            return

        # Расстояние от камеры до поверхности экрана
        self.__distance = new_distance
        # Физическая ширина области вилимости камеры
        self.window_width = 2 * self.__distance * tan(self.h_fov / 2)
        # Физическая высота области вилимости камеры
        self.window_height = self.window_width * SCREEN_HEIGHT / SCREEN_WIDTH
        # Вертикальный угол обзора камеры
        self.v_fov = atan(self.window_height / self.__distance / 2)
        # Физическая область видимости камеры
        self.camera_rect = PhysicalRect(
            self.__position[0] - self.window_width / 2,
            self.__position[1] - self.window_height / 2, self.window_width,
            self.window_height)
        # Коэффициент, на который умножаются координаты, чтобы отрисовать объекты на экране на экране
        self.scale_factor = SCREEN_WIDTH / self.window_width
 def step(self, dt):
     self.body_rect = PhysicalRect(
         *(self.body.position - (self.width / 2, self.height / 2)),
         self.width, self.height)