Hell_Circus/main.py

220 lines
7.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import pygame
# Загрузка спрайтов движения
def load_movement_sprites(prefix, num_sprites):
sprite_list = []
for i in range(1, num_sprites + 1):
filename = f"{prefix}{i}.png"
sprite = pygame.image.load(filename)
sprite_list.append(sprite)
return sprite_list
# Спрайты игрока
player_image = pygame.image.load("player.png")
forward_sprites = load_movement_sprites("forward", 5)
backward_sprites = load_movement_sprites("backward", 5)
left_sprites = load_movement_sprites("left", 5)
right_sprites = load_movement_sprites("right", 5)
# Игрок
class Player:
def __init__(self, x, y):
self.x = x
self.y = y
self.image = player_image
self.movement_sprites = {
'forward': forward_sprites,
'backward': backward_sprites,
'left': left_sprites,
'right': right_sprites
}
self.current_sprite_index = 0
self.current_movement = 'forward'
def update_position(self, dx, dy):
self.x += dx
self.y += dy
def change_movement(self, direction):
self.current_movement = direction
def draw(self):
screen.blit(self.movement_sprites[self.current_movement][self.current_sprite_index], (self.x, self.y))
# Камера
class Camera:
def __init__(self, width, height):
self.width = width
self.height = height
self.x = 0
self.y = 0
self.follow_player = True
def apply(self, target_rect):
return target_rect.move(self.x, self.y)
def update(self, target):
if self.follow_player:
self.x = -target.x + self.width // 2
self.y = -target.y + self.height // 2
# Стена
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
# Класс игрового состояния
class GameState:
MENU = 0
GAMEPLAY = 1
# Инициализация Pygame
pygame.init()
# Настройки
FPS = 60
BACKGROUND_IMAGE = "background.png"
FONT, SIZE = 'comicsansms', 14
# Информация о экране
screen_info = pygame.display.Info()
screen = pygame.display.set_mode((1920, 1080), pygame.FULLSCREEN)
pygame.display.set_caption('Hell Circus')
programIcon = pygame.image.load('icon.png')
pygame.display.set_icon(programIcon)
# Шрифт
font = pygame.font.SysFont(FONT, SIZE)
# Часы и время
clock = pygame.time.Clock()
deltatime = 0
running = True
# Кнопки
play_button = Button("play1.png", "play2.png", (125, 3))
continue_button = Button("continue1.png", "continue2.png", (110, 3))
menu_button = Button("menu1.png", "menu2.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)))
# Класс персонажа
class Character(pygame.sprite.Sprite):
def __init__(self, x, y, width, height, color, name):
super().__init__()
self.image = pygame.Surface((width, height))
self.image.fill(color)
self.rect = self.image.get_rect(topleft=(x, y))
self.name = name
# Класс игрока
class Player(pygame.sprite.Sprite):
def __init__(self, x, y, width, height, color):
super().__init__()
self.image = pygame.Surface((width, height))
self.image.fill(color)
self.rect = self.image.get_rect(topleft=(x, y))
# Камера
camera = Camera(1920, 1080)
player = Player(200, 200, 50, 50, (255, 0, 0))
character1 = Character(200, 200, 50, 50, "red", "Character 1")
character2 = Character(400, 300, 50, 50, "blue", "Character 2")
# Группы спрайтов
character_sprites = pygame.sprite.Group(character1, character2)
player_sprite = pygame.sprite.Group(player)
# Игровое состояние
current_state = GameState.MENU
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
if current_state == GameState.MENU:
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
mouse_x, mouse_y = pygame.mouse.get_pos()
if play_button.is_hovered((mouse_x, mouse_y)):
# Переход в игровой режим
current_state = GameState.GAMEPLAY
elif current_state == GameState.GAMEPLAY:
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_e:
nearest_character = min(character_sprites, key=lambda c: pygame.math.Vector2(c.rect.center).distance_to(player.rect.center))
distance = pygame.math.Vector2(nearest_character.rect.center).distance_to(player.rect.center)
if distance < 100:
print(f"Interacted with {nearest_character.name}")
keys = pygame.key.get_pressed()
if keys[pygame.K_e]:
camera.follow_player = not camera.follow_player
if camera.follow_player:
camera.update(player.rect)
background_img_image = pygame.image.load(BACKGROUND_IMAGE).convert_alpha()
screen.blit(background_img_image, (0, 0))
if current_state == GameState.MENU:
screen.blit(play_button.image, play_button.rect)
screen.blit(continue_button.image, continue_button.rect)
screen.blit(menu_button.image, menu_button.rect)
mouse_pos = pygame.mouse.get_pos()
play_button.update(mouse_pos)
continue_button.update(mouse_pos)
menu_button.update(mouse_pos)
elif current_state == GameState.GAMEPLAY:
# Обновить игрока
player.update_position(5, 0)
player.change_movement('right')
player.draw()
for sprite in character_sprites:
screen.blit(sprite.image, camera.apply(sprite.rect))
for sprite in player_sprite:
screen.blit(sprite.image, camera.apply(sprite.rect))
pygame.display.flip()
deltatime = clock.tick(FPS) / 1000
screen.fill("black")
pygame.quit()