220 lines
7.1 KiB
Python
220 lines
7.1 KiB
Python
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()
|