203 lines
6.7 KiB
Python
203 lines
6.7 KiB
Python
# 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)
|