Explorar el Código

maze and colision

michal.korcak hace 6 días
padre
commit
f209ac14ce
Se han modificado 2 ficheros con 81 adiciones y 4 borrados
  1. 81 4
      main.py
  2. BIN
      meteor.png

+ 81 - 4
main.py

@@ -1,3 +1,5 @@
+
+import random
 import pygame
 
 # pygame setup
@@ -10,12 +12,75 @@ dt = 0
 force_coef = 20
 player_applied_force = pygame.Vector2(0, 0)
 player_mass = 1
-player_pos = pygame.Vector2(screen.get_width() / 2, screen.get_height() / 2)
+
+
+# Helper to find all empty cells in the maze
+def get_empty_cells(grid):
+    empty = []
+    for y, row in enumerate(grid):
+        for x, cell in enumerate(row):
+            if cell == 0:
+                empty.append((x, y))
+    return empty
+
+# Set player_pos to a random empty cell
+def get_cell_center(x, y, cell_size=80):
+    return pygame.Vector2(x * cell_size + cell_size / 2, y * cell_size + cell_size / 2)
+
+from mazelib import Maze
+from mazelib.generate.Prims import Prims
+
+maze_width = 7
+maze_height = 4
+
+m = Maze()
+m.generator = Prims(maze_height, maze_width)
+m.generate()
+maze_grid = m.grid
+
+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)
 
 raketa_original = pygame.image.load("raketa.png").convert_alpha()
 raketa = pygame.transform.scale(raketa_original, (raketa_original.get_width() // 3, raketa_original.get_height() // 3))
 
+# Function to get all meteor rectangles for collision detection
+def get_meteor_rects(grid, cell_size=80):
+    meteor_rects = []
+    for y, row in enumerate(grid):
+        for x, cell in enumerate(row):
+            if cell == 1:
+                rect = pygame.Rect(x * cell_size, y * cell_size, cell_size, cell_size)
+                meteor_rects.append(rect)
+    return meteor_rects
+
+from mazelib import Maze
+from mazelib.generate.Prims import Prims
+
+maze_width = 7
+maze_height = 4
+
+m = Maze()
+m.generator = Prims(maze_height, maze_width)
+m.generate()
+maze_grid = m.grid
+
+
+def draw_maze(
+    surface,
+    grid,
+    meteor_img=pygame.image.load("meteor.png").convert_alpha(),
+    cell_size=80,
+):
+    for y, row in enumerate(grid):
+        for x, cell in enumerate(row):
+            if cell == 1:
+                meteor_img = pygame.transform.scale(meteor_img, (cell_size, cell_size))
+                rect = pygame.Rect(x * cell_size, y * cell_size, cell_size, cell_size)
+                surface.blit(meteor_img, rect)
+
 
 def draw_arrow(surface, color, start, end, width=3):
     pygame.draw.line(surface, color, start, end, width)
@@ -44,11 +109,8 @@ while running:
     angle = player_speed.angle_to(pygame.Vector2(0, -1))
 
     scaled_raketa = rescale_rocket(raketa, player_speed)
-
     rotated_raketa = pygame.transform.rotate(scaled_raketa, angle)
-
     raketa_rect = rotated_raketa.get_rect(center=player_pos)
-    screen.blit(rotated_raketa, raketa_rect)
 
     player_applied_force = pygame.Vector2(0, 0)
 
@@ -69,6 +131,19 @@ while running:
     player_speed += acceleration * dt
     player_pos += player_speed * dt
 
+    # Collision detection
+    meteor_rects = get_meteor_rects(maze_grid)
+    raketa_rect = rotated_raketa.get_rect(center=player_pos)
+    for meteor_rect in meteor_rects:
+        if raketa_rect.colliderect(meteor_rect):
+            # Collision detected: reset position and speed
+            player_speed = pygame.Vector2(0, 0)
+            break
+
+    # Draw rocket
+    raketa_rect = rotated_raketa.get_rect(center=player_pos)
+    screen.blit(rotated_raketa, raketa_rect)
+
     # Draw force arrow
     if player_applied_force.length() > 0:
         arrow_end = player_pos + player_applied_force * 2
@@ -79,6 +154,8 @@ while running:
         arrow_end = player_pos + player_speed * 2
         draw_arrow(screen, "cyan", player_pos, arrow_end)
 
+    draw_maze(screen, maze_grid)
+
     pygame.display.flip()
     dt = clock.tick(60) / 1000
 

BIN
meteor.png