# code import pygame class Player(pygame.sprite.Sprite): def __init__(self, color, size, pos, walls): super().__init__() self.image = pygame.Surface(size) self.image.fill(color) self.rect = self.image.get_rect(center=pos) self.foot_size = 15 self.dt = 0 self.weight = 2500 self.speed_x = 0 self.max_speed_x = 700 self.speed_y = 0 self.max_speed_y = 1500 self.is_jumping = False self.jumping_time = 0 self.walls = walls def gravity(self, dt): self.speed_y += self.weight * dt if self.speed_y > self.max_speed_y: self.speed_y = self.max_speed_y self.rect.y += self.speed_y * dt def jump(self): if not self.is_jumping: self.is_jumping = True self.jumping_time = 0 self.speed_y = -1500 def move_x(self, dt): if abs(self.speed_x) > self.max_speed_x: self.speed_x = self.max_speed_x * (self.speed_x / abs(self.speed_x)) self.rect.x += self.speed_x * dt def collision(self): collisions = pygame.sprite.spritecollide(self, self.walls, False) if collisions: for wall in collisions: if abs(self.rect.bottom - wall.rect.top) < self.foot_size: self.rect.bottom = wall.rect.top self.speed_y = 0 self.jumping_time = 0 self.is_jumping = False elif abs(self.rect.top - wall.rect.bottom) < self.foot_size: self.rect.top = wall.rect.bottom self.speed_y = 0 elif abs(self.rect.right - wall.rect.left) < self.foot_size: self.rect.right = wall.rect.left self.speed_x = 0 elif abs(self.rect.left - wall.rect.right) < self.foot_size: self.rect.left = wall.rect.right self.speed_x = 0 def player_input(self, dt): keys = pygame.key.get_pressed() move_direction = 0 if keys[pygame.K_w]: self.jump() elif keys[pygame.K_SPACE]: self.jump() if keys[pygame.K_a]: self.speed_x -= self.max_speed_x * 3 * dt move_direction = -1 if keys[pygame.K_d]: self.speed_x += self.max_speed_x * 3 * dt move_direction = 1 + move_direction if (move_direction == 0 or (self.speed_x * move_direction < 0)) and not self.is_jumping: self.speed_x -= self.speed_x * 5 * dt elif self.is_jumping: self.speed_x -= self.speed_x * dt if abs(self.speed_x) < 5: self.speed_x = 0 def update(self, dt): self.player_input(dt) self.gravity(dt) self.move_x(dt) self.collision() class Camera: def __init__(self, player, size=(400, 300)): self.player = player self.center = pygame.display.get_surface().get_rect().center self.size = size self.player_size = self.player.rect.size self.speed_x = 0 self.speed_y = 0 def update(self, dt, sprites): x_move = abs(self.player.rect.centerx - self.center[0]) > self.size[0] // 2 y_move = abs(self.player.rect.centery - self.center[1]) > self.size[1] // 2 if x_move or y_move: for sprite in sprites: if x_move: self.speed_x = (self.player.rect.centerx - self.center[0]) * 2 * dt sprite.rect.x -= self.speed_x if y_move: self.speed_y = (self.player.rect.centery - self.center[1]) * 2 * dt sprite.rect.y -= self.speed_y class Wall(pygame.sprite.Sprite): def __init__(self, color, size, pos): super().__init__() self.image = pygame.Surface(size) self.image.fill(color) self.rect = self.image.get_rect(center=pos) class Button: def __init__(self, up_image_path, over_image_path, position): self.up_image = pygame.image.load(up_image_path) self.over_image = pygame.image.load(over_image_path) self.image = self.up_image self.rect = self.image.get_rect(topleft=position) self.mask = pygame.mask.from_surface(self.image) def is_hovered(self, mouse_pos): return self.rect.collidepoint(mouse_pos) and self.mask.get_at((mouse_pos[0] - self.rect.x, mouse_pos[1] - self.rect.y)) def update(self, mouse_pos): if self.is_hovered(mouse_pos): self.image = self.over_image else: self.image = self.up_image pygame.init() FPS = 60 BACKGROUND_IMAGE = "background.png" FONT, SIZE = 'comicsansms', 14 programIcon = pygame.image.load('icon.png') pygame.display.set_icon(programIcon) pygame.display.set_caption('Hell Circus') font = pygame.font.SysFont(FONT, SIZE) screen_info = pygame.display.Info() screen = pygame.display.set_mode((1920, 1080), vsync=1) pygame.display.set_caption("Simple platformer") clock = pygame.time.Clock() deltatime = 0 running = True # Buttons play_button = Button("close_up.png", "close_over.png", (125, 3)) continue_button = Button("shuffle_up.png", "shuffle_over.png", (110, 3)) menu_button = Button("hint_up.png", "hint_over.png", (95, 3)) walls = pygame.sprite.Group(Wall("white", (1280, 20), (640, 0)), Wall("white", (1280, 20), (640, 720)), Wall("white", (20, 720), (0, 360)), Wall("white", (1280, 20), (1280, 720)), Wall("white", (200, 20), (640, 360)), Wall("white", (20, 200), (640, 360)), Wall("white", (1280, 20), (1280, 320))) player_group = pygame.sprite.GroupSingle(Player("red", (100, 100), (200, 600), walls)) camera = Camera(player_group.sprite, (300, 200)) all_sprites = pygame.sprite.Group() all_sprites.add(player_group, walls) while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False screen.fill("black") camera.update(deltatime, all_sprites) player_group.update(deltatime) all_sprites.draw(screen) pygame.display.flip() deltatime = clock.tick(FPS) / 1000 pygame.quit() while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False background_img_image = pygame.image.load(BACKGROUND_IMAGE).convert_alpha() screen.blit(background_img_image, (0, 0)) mouse_pos = pygame.mouse.get_pos() play_button.update(mouse_pos) continue_button.update(mouse_pos) menu_button.update(mouse_pos) screen.blit(play_button.image, play_button.rect) screen.blit(continue_button.image, continue_button.rect) screen.blit(menu_button.image, menu_button.rect)