| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- import random
- import pygame
- from utils import get_empty_cells, get_cell_center, draw_arrow
- from maze import generate_maze, get_meteor_rects, draw_maze
- from rocket import load_rocket, rescale_rocket
- # --- pygame setup ---
- pygame.init()
- screen = pygame.display.set_mode((1280, 720))
- clock = pygame.time.Clock()
- running = True
- dt = 0
- # --- physics constants ---
- force_coef = 20
- player_mass = 1
- # --- maze setup ---
- maze_grid = generate_maze(width=7, height=4)
- # --- player spawn ---
- empty_cells = get_empty_cells(maze_grid)
- spawn_x, spawn_y = random.choice(empty_cells)
- player_pos = get_cell_center(spawn_x, spawn_y)
- player_speed = pygame.Vector2(0, 0)
- player_applied_force = pygame.Vector2(0, 0)
- # --- assets ---
- raketa = load_rocket()
- meteor_img = pygame.image.load("meteor.png").convert_alpha()
- meteor_scaled = pygame.transform.scale(meteor_img, (80, 80))
- meteor_mask = pygame.mask.from_surface(meteor_scaled)
- # --- game loop ---
- while running:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- running = False
- screen.fill("purple")
- # Input
- player_applied_force = pygame.Vector2(0, 0)
- keys = pygame.key.get_pressed()
- if keys[pygame.K_w]:
- player_applied_force.y -= force_coef
- if keys[pygame.K_s]:
- player_applied_force.y += force_coef
- if keys[pygame.K_a]:
- player_applied_force.x -= force_coef
- if keys[pygame.K_d]:
- player_applied_force.x += force_coef
- if player_applied_force.length() > 0:
- player_applied_force.scale_to_length(force_coef)
- # Physics
- acceleration = player_applied_force / player_mass
- player_speed += acceleration * dt
- player_pos += player_speed * dt
- # Collision detection
- scaled_raketa = rescale_rocket(raketa, player_speed)
- angle = player_speed.angle_to(pygame.Vector2(0, -1))
- rotated_raketa = pygame.transform.rotate(scaled_raketa, angle)
- raketa_rect = rotated_raketa.get_rect(center=player_pos)
- raketa_mask = pygame.mask.from_surface(rotated_raketa)
- for meteor_rect in get_meteor_rects(maze_grid):
- if raketa_rect.colliderect(meteor_rect):
- offset = (meteor_rect.x - raketa_rect.x, meteor_rect.y - raketa_rect.y)
- if raketa_mask.overlap(meteor_mask, offset):
- player_speed = pygame.Vector2(0, 0)
- break
- # Draw
- screen.blit(rotated_raketa, raketa_rect)
- if player_applied_force.length() > 0:
- draw_arrow(screen, "yellow", player_pos, player_pos + player_applied_force * 2)
- if player_speed.length() > 0:
- draw_arrow(screen, "cyan", player_pos, player_pos + player_speed * 2)
- draw_maze(screen, maze_grid, meteor_img)
- pygame.display.flip()
- dt = clock.tick(60) / 1000
- pygame.quit()
|