import pygame import sys pygame.init() CLOCK = pygame.time.Clock() SCREEN = pygame.display.set_mode((1000, 800)) BLACK = (0,0,0) BACKGROUND = pygame.image.load("images/back.png") BACK_MAIN = pygame.image.load("images/back_main.jpg") BACK_MAIN = pygame.transform.scale(BACK_MAIN, (1000, 800)).convert_alpha() level = 0 class Goblin: def __init__(self): self.x = 100 self.y = 800 self.gravity = 1 self.jump_height = 20 self.y_velocity = 20 self.jumping = False self.start_x = 100 self.start_y = 800 def reset_position(self): self.x = self.start_x self.y = self.start_y g_facing_right = True class Knight: def __init__(self): self.x = 300 self.y = 700 self.gravity = 1 self.jump_height = 20 self.y_velocity = 20 self.jumping = False self.start_x = 300 self.start_y = 700 def reset_position(self): self.x = self.start_x self.y = self.start_y k_facing_right = True def get_image(sheet,frame_w, frame_h, width, height, scale, color): image = pygame.Surface((width, height)).convert_alpha() image.blit(sheet, (0,0),((frame_w*width),(frame_h*height), width, height)) image = pygame.transform.scale(image, (width*scale, height*scale)).convert_alpha() if color is not None: image.set_colorkey(color) return image # GOBLIN goblin = pygame.image.load("images/GoblinWorker/GoblinWorker.png").convert_alpha() STANDING_SURFACE = get_image(goblin, 1, 1, 48, 48, 3, BLACK) frame_0 = get_image(goblin, 0,0, 48, 48, 3, BLACK) frame_1 = get_image(goblin, 4,2 , 48, 48, 3, BLACK) walk_a = get_image(goblin, 5, 1, 48, 48, 3, BLACK) walk_b = get_image(goblin, 0, 2, 48, 48, 3, BLACK) # KNIGHT knight = pygame.image.load("images/sprites/knight.png").convert_alpha() K_STAND = get_image(knight, 2, 0, 32, 32, 3, BLACK) k_walk_a = get_image(knight, 1, 2, 32, 32, 3, BLACK) k_walk_b = get_image(knight, 5, 2, 32, 32, 3, BLACK) k_jump_start = get_image(knight, 3, 5, 32, 32, 3, BLACK) k_jump_apex = get_image(knight, 4, 5, 32, 32, 3, BLACK) k_jump_fall = get_image(knight, 5, 5, 32, 32, 3, BLACK) # SPRITES / WORLD door_image = pygame.image.load("images/door.png") door_rect = door_image.get_rect(center = (800, 700)) wall_image = pygame.image.load("images/wall.png") wall_right = pygame.Rect(1000, 0, 1, 800) wall_left = pygame.Rect(0, 0, 1, 800) wall_bottom = pygame.Rect(0, 800, 1000, 1) wall_up = pygame.Rect(0, 0, 1000, 1) #BUTTONS button_play = pygame.image.load("images/play_button.png") button_play_rect = button_play.get_rect(center=(500, 400)) #PLATFORM platform_image = pygame.image.load("images/sprites/platforms.png") platform = get_image(platform_image, 0, 0, 16, 9, 3, BLACK) platform_rect = platform.get_rect(topleft=(400, 700)) # ANIMATION g_anim_counter = 0 k_anim_counter = 0 ANIM_SPEED = 8 # GAME LOOP while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() keys_pressed = pygame.key.get_pressed() mouse_pos = pygame.mouse.get_pos() SCREEN.fill((0,0,0)) g_moving = False if keys_pressed[pygame.K_d]: G_X += 5 g_facing_right = True g_moving = True if keys_pressed[pygame.K_a]: G_X -= 5 g_facing_right = False g_moving = True if keys_pressed[pygame.K_SPACE] and not g_jumping: g_jumping = True g_y_velocity = G_JUMP_HEIGHT k_moving = False if keys_pressed[pygame.K_KP6]: K_X += 5 k_facing_right = True k_moving = True if keys_pressed[pygame.K_KP4]: K_X -= 5 k_facing_right = False k_moving = True if keys_pressed[pygame.K_KP8] and not k_jumping: k_jumping = True k_y_velocity = K_JUMP_HEIGHT # Goblin g_y_velocity -= G_GRAVITY G_Y -= g_y_velocity # Knight k_y_velocity -= K_GRAVITY K_Y -= k_y_velocity if G_X < 0: G_X = 0 if G_X > 1000: G_X = 1000 if K_X < 0: K_X = 0 if K_X > 1000: K_X = 1000 # Пол if G_Y >= 800: G_Y = 800 g_y_velocity = 0 g_jumping = False if K_Y >= 800: K_Y = 800 k_y_velocity = 0 k_jumping = False g_anim_counter = g_anim_counter + 1 if g_moving else 0 k_anim_counter = k_anim_counter + 1 if k_moving else 0 if g_jumping: g_surface = frame_1 elif g_moving: g_frame_index = (g_anim_counter // ANIM_SPEED) % 2 g_surface = walk_a if g_frame_index == 0 else walk_b else: g_surface = STANDING_SURFACE if not g_facing_right: g_surface = pygame.transform.flip(g_surface, True, False) g_surface.set_colorkey(BLACK) g_rect = g_surface.get_rect(center=(G_X, G_Y)) if k_jumping: up_thresh = K_JUMP_HEIGHT // 3 down_thresh = -up_thresh if k_y_velocity > up_thresh: k_surface = k_jump_start elif k_y_velocity > down_thresh: k_surface = k_jump_apex else: k_surface = k_jump_fall elif k_moving: k_frame_index = (k_anim_counter // ANIM_SPEED) % 2 k_surface = k_walk_a if k_frame_index == 0 else k_walk_b else: k_surface = K_STAND if not k_facing_right: k_surface = pygame.transform.flip(k_surface, True, False) k_surface.set_colorkey(BLACK) k_rect = k_surface.get_rect(center=(K_X, K_Y)) if level == 0: SCREEN.blit(BACK_MAIN, (0, 0)) SCREEN.blit(button_play, button_play_rect) if button_play_rect.collidepoint(mouse_pos) and pygame.mouse.get_pressed()[0]: level = 1 if level == 1: SCREEN.blit(BACKGROUND, (0, 0)) SCREEN.blit(door_image, door_rect) SCREEN.blit(platform, platform_rect) SCREEN.blit(g_surface, g_rect) SCREEN.blit(k_surface, k_rect) # Goblin if g_rect.colliderect(platform_rect) and g_y_velocity <= 0: G_Y = platform_rect.top - g_rect.height / 2 g_y_velocity = 0 g_jumping = False # Knight if k_rect.colliderect(platform_rect) and k_y_velocity <= 0: K_Y = platform_rect.top - k_rect.height / 2 k_y_velocity = 0 k_jumping = False if g_rect.colliderect(door_rect) and keys_pressed[pygame.K_e]: print("Goblin wins!") level = 0 if k_rect.colliderect(door_rect) and keys_pressed[pygame.K_KP5]: print("Knight wins!") level = 0 pygame.display.update() pygame.display.update() CLOCK.tick(60)