Я хочу создать 2D-сайд-скроллер с игроком, за которым следует камера и масштабирует его. В настоящее время камера не приближается к игроку. Я попробовал поискать на YouTube, но мне не удалось найти подходящего решения.
Я также отредактировал свой код следующим образом: Добавьте прокрутку в платформер в pygame. Прежде чем использовать это, игрок выпадал из фона (ниже). После этого проблема устранена, но я не могу найти способ добавить функцию масштабирования.


вот мой код
main.py
импортировать pygame из импорта pygame Rect из импорта игрока Игрок из импорта камеры CameraAwareLayeredUpdates ###################### Инициализация ##################### pygame.init() ШИРИНА = 1920 ВЫСОТА = 1080 холст = pygame.Surface((ШИРИНА, ВЫСОТА)) окно = pygame.display.set_mode((ШИРИНА, ВЫСОТА), pygame.RESIZABLE | pygame.SCALED) pygame.display.set_caption("Города") часы = pygame.time.Clock() работает = Истина ###################### Загрузка плеера и камеры ##################### защита simple_camera(c, target_rect): l, t, _, _ = target_rect # l = слева, t = сверху _, _, w, h = c # w = ширина, h = высота return Rect(-l + ШИРИНА // 2, -t + ВЫСОТА // 2, w, h) player = Игрок(ШИРИНА, ВЫСОТА) сущности = CameraAwareLayeredUpdates(player, pygame.Rect(0, 0, WIDTH, HEIGHT)) ###################### Игровой цикл ##################### во время бега: для события в pygame.event.get(): если event.type == pygame.QUIT: работает = Ложь player.update( [pygame.Rect(0, ВЫСОТА - 50, ШИРИНА, 50)] ) юридические лица.обновление([pygame.Rect(0, ВЫСОТА - 50, ШИРИНА, 50)]) window.blit(pygame.image.load("assets/bknd.jpg"), (0, 0)) сущности.draw(окно) player.draw(окно) pygame.display.update() часы.тик(60) pygame.quit() camera.py
импортировать pygame.sprite из импорта pygame Rect ШИРИНА = 1920 ВЫСОТА = 1080 класс CameraAwareLayeredUpdates(pygame.sprite.LayeredUpdates): def __init__(self, target, world_size): супер().__init__() self.target = цель self.cam = pygame.Vector2(0, 0) self.world_size = world_size если self.target: self.add(цель) def update(self, *args): супер().обновление(*args) если self.target: x = -self.target.rect.center[0] + ШИРИНА/2 y = -self.target.rect.center[1] + ВЫСОТА/2 self.cam += (pygame.Vector2((x, y)) - self.cam) * 0,05 self.cam.x = max(-(self.world_size.width-WIDTH), min(0, self.cam.x)) self.cam.y = max(-(self.world_size.height-HEIGHT), min(0, self.cam.y)) def draw(сам, поверхность): спрайтдикт = self.spritedict поверхность_блит = поверхность.блит грязный = self.lostsprites self.lostsprites = [] грязное_добавление = грязное.добавление init_rect = self._init_rect для spr в self.sprites(): запись = спрайтдикт[спр] newrect = поверхность_blit(spr.image, spr.rect.move(self.cam)) если запись равна init_rect: грязное_добавление (новоепрямое) еще: если newrect.colliderect(запись): грязный_append(newrect.union(рек)) еще: грязное_добавление (новоепрямое) грязное_добавление (запись) spritedict[spr] = новоепрямое вернуться грязным
Мобильная версия