main.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import random
  2. import pygame
  3. from utils import get_empty_cells, get_cell_center, draw_arrow
  4. from maze import generate_maze, get_meteor_rects, draw_maze
  5. from rocket import load_rocket, rescale_rocket
  6. # --- pygame setup ---
  7. pygame.init()
  8. screen = pygame.display.set_mode((1280, 720))
  9. clock = pygame.time.Clock()
  10. running = True
  11. dt = 0
  12. # --- physics constants ---
  13. force_coef = 20
  14. player_mass = 1
  15. # --- maze setup ---
  16. maze_grid = generate_maze(width=7, height=4)
  17. # --- player spawn ---
  18. empty_cells = get_empty_cells(maze_grid)
  19. spawn_x, spawn_y = random.choice(empty_cells)
  20. player_pos = get_cell_center(spawn_x, spawn_y)
  21. player_speed = pygame.Vector2(0, 0)
  22. player_applied_force = pygame.Vector2(0, 0)
  23. # --- assets ---
  24. raketa = load_rocket()
  25. meteor_img = pygame.image.load("meteor.png").convert_alpha()
  26. meteor_scaled = pygame.transform.scale(meteor_img, (80, 80))
  27. meteor_mask = pygame.mask.from_surface(meteor_scaled)
  28. # --- game loop ---
  29. while running:
  30. for event in pygame.event.get():
  31. if event.type == pygame.QUIT:
  32. running = False
  33. screen.fill("purple")
  34. # Input
  35. player_applied_force = pygame.Vector2(0, 0)
  36. keys = pygame.key.get_pressed()
  37. if keys[pygame.K_w]:
  38. player_applied_force.y -= force_coef
  39. if keys[pygame.K_s]:
  40. player_applied_force.y += force_coef
  41. if keys[pygame.K_a]:
  42. player_applied_force.x -= force_coef
  43. if keys[pygame.K_d]:
  44. player_applied_force.x += force_coef
  45. if player_applied_force.length() > 0:
  46. player_applied_force.scale_to_length(force_coef)
  47. # Physics
  48. acceleration = player_applied_force / player_mass
  49. player_speed += acceleration * dt
  50. player_pos += player_speed * dt
  51. # Collision detection
  52. scaled_raketa = rescale_rocket(raketa, player_speed)
  53. angle = player_speed.angle_to(pygame.Vector2(0, -1))
  54. rotated_raketa = pygame.transform.rotate(scaled_raketa, angle)
  55. raketa_rect = rotated_raketa.get_rect(center=player_pos)
  56. raketa_mask = pygame.mask.from_surface(rotated_raketa)
  57. for meteor_rect in get_meteor_rects(maze_grid):
  58. if raketa_rect.colliderect(meteor_rect):
  59. offset = (meteor_rect.x - raketa_rect.x, meteor_rect.y - raketa_rect.y)
  60. if raketa_mask.overlap(meteor_mask, offset):
  61. player_speed = pygame.Vector2(0, 0)
  62. break
  63. # Draw
  64. screen.blit(rotated_raketa, raketa_rect)
  65. if player_applied_force.length() > 0:
  66. draw_arrow(screen, "yellow", player_pos, player_pos + player_applied_force * 2)
  67. if player_speed.length() > 0:
  68. draw_arrow(screen, "cyan", player_pos, player_pos + player_speed * 2)
  69. draw_maze(screen, maze_grid, meteor_img)
  70. pygame.display.flip()
  71. dt = clock.tick(60) / 1000
  72. pygame.quit()