From fb017330c225d37a103f5a8a6a6de788bcc3d13d Mon Sep 17 00:00:00 2001 From: luisgulo Date: Sun, 4 Oct 2026 16:01:06 +0200 Subject: [PATCH] Marcamos Zona 0 con rayas amarillas-negras --- highway_vector.py | 62 ++++++++++++++++++++--------- img-versiones/version_final_04.png | Bin 0 -> 17567 bytes 2 files changed, 44 insertions(+), 18 deletions(-) create mode 100644 img-versiones/version_final_04.png diff --git a/highway_vector.py b/highway_vector.py index 297474e..028912e 100644 --- a/highway_vector.py +++ b/highway_vector.py @@ -41,7 +41,6 @@ def generate_sound(sound_type): buffer = array.array("h") if sound_type == "shoot": - # Disparo: Tono descendente agudo rápido duration = 0.1 total_samples = int(sample_rate * duration) for i in range(total_samples): @@ -53,7 +52,6 @@ def generate_sound(sound_type): buffer.append(sample) elif sound_type == "hit": - # Choque: Golpe sordo de baja frecuencia duration = 0.15 total_samples = int(sample_rate * duration) for i in range(total_samples): @@ -66,7 +64,6 @@ def generate_sound(sound_type): buffer.append(max(-32768, min(32767, sample))) elif sound_type == "destroy": - # Destrucción: Ruido de explosión corta duration = 0.2 total_samples = int(sample_rate * duration) for i in range(total_samples): @@ -92,6 +89,39 @@ def grid_to_iso(gx, gy, gz=0): return iso_x, iso_y +def draw_hazard_tile(surface, pts): + """Dibuja una casilla isométrica con patrón de franjas amarillas y negras.""" + polygon_surf = pygame.Surface((TILE_WIDTH, TILE_HEIGHT), pygame.SRCALPHA) + + min_x = min(p[0] for p in pts) + min_y = min(p[1] for p in pts) + local_pts = [(p[0] - min_x, p[1] - min_y) for p in pts] + + # Fondo base amarillo + pygame.draw.polygon(polygon_surf, (255, 200, 0), local_pts) + + # Franjas diagonales negras + stripe_width = 8 + for offset in range(-TILE_WIDTH, TILE_WIDTH * 2, stripe_width * 2): + stripe_pts = [ + (offset, 0), + (offset + stripe_width, 0), + (offset + stripe_width - TILE_HEIGHT, TILE_HEIGHT), + (offset - TILE_HEIGHT, TILE_HEIGHT) + ] + pygame.draw.polygon(polygon_surf, (20, 20, 20), stripe_pts) + + # Máscara para recortar al rombo isométrico + mask_surf = pygame.Surface((TILE_WIDTH, TILE_HEIGHT), pygame.SRCALPHA) + pygame.draw.polygon(mask_surf, (255, 255, 255, 255), local_pts) + polygon_surf.blit(mask_surf, (0, 0), special_flags=pygame.BLEND_RGBA_MIN) + + # Borde de la casilla + pygame.draw.polygon(polygon_surf, (10, 10, 10), local_pts, 1) + + surface.blit(polygon_surf, (min_x, min_y)) + + def draw_isometric_prism(surface, color, width=40, height=35): """Genera una superficie isométrica con forma de prisma o cubo.""" surf = pygame.Surface((64, 64), pygame.SRCALPHA) @@ -158,7 +188,6 @@ def create_placeholder_sprites(): pygame.draw.circle(surf_vortex, (0, 0, 0), (32, 12), 8, 1) sprites["vortex"] = surf_vortex - # Bloques sprites["block_white"] = draw_isometric_prism( None, COLOR_WHITE, width=40, height=25 ) @@ -166,7 +195,6 @@ def create_placeholder_sprites(): None, COLOR_PURPLE, width=40, height=25 ) - # Enemigos sprites["enemy_indestructible"] = draw_isometric_prism( None, COLOR_WHITE, width=32, height=35 ) @@ -370,8 +398,8 @@ class DiagonalEnemy(Enemy): def __init__(self, gx, gy): super().__init__(gx, gy, destructible=False) self.sprite_name = "enemy_diagonal" - self.speed_x = 0.02 # Cambiado de 0.035 a 0.02 - self.speed_y = 0.02 # Cambiado de 0.035 a 0.02 + self.speed_x = 0.02 + self.speed_y = 0.02 self.dir_x = 1 self.dir_y = 1 self.min_y = gy - 6 @@ -500,7 +528,7 @@ class Game: def __init__(self): self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) - pygame.display.set_caption("Highway Vector - Edición Isométrica") + pygame.display.set_caption("Highway Vector") self.clock = pygame.time.Clock() self.font = pygame.font.SysFont("monospace", 14, bold=True) self.big_font = pygame.font.SysFont("monospace", 28, bold=True) @@ -515,7 +543,6 @@ class Game: self.reset_level() def show_opening_screen(self): - """Muestra la pantalla explicativa inicial al ejecutar el juego.""" while self.in_opening: self.clock.tick(FPS) for event in pygame.event.get(): @@ -528,7 +555,6 @@ class Game: self.screen.fill((10, 10, 20)) - # Título principal title_surf = self.title_font.render( "HIGHWAY VECTOR", True, COLOR_YELLOW ) @@ -537,7 +563,6 @@ class Game: (SCREEN_WIDTH // 2 - title_surf.get_width() // 2, 20), ) - # Lista de elementos a mostrar items = [ ( "player", @@ -572,17 +597,14 @@ class Game: for idx, (sprite_key, desc_text) in enumerate(items): y_pos = start_y + idx * spacing_y - # Dibujar imagen del elemento sprite = self.sprite_mgr.get_sprite(sprite_key) img_x = 60 - sprite.get_width() // 2 img_y = y_pos + 12 - sprite.get_height() // 2 self.screen.blit(sprite, (img_x, img_y)) - # Dibujar texto descriptivo text_surf = self.font.render(desc_text, True, (230, 230, 230)) self.screen.blit(text_surf, (110, y_pos + 4)) - # Línea divisoria discreta entre filas if idx < len(items) - 1: pygame.draw.line( self.screen, @@ -591,7 +613,6 @@ class Game: (SCREEN_WIDTH - 40, y_pos + spacing_y - 8), ) - # Mensaje para comenzar con efecto de parpadeo suave blink = (pygame.time.get_ticks() // 400) % 2 == 0 start_color = (0, 255, 200) if blink else (0, 150, 120) start_surf = self.big_font.render( @@ -716,7 +737,7 @@ class Game: if self.lives <= 0: self.screen.fill((0, 0, 0)) msg = self.font.render( - "GAME OVER - Pulsa R para Reiniciar", True, (255, 50, 50) + "GAME OVER - Press R to Restart", True, (255, 50, 50) ) self.screen.blit( msg, (SCREEN_WIDTH // 2 - 150, SCREEN_HEIGHT // 2) @@ -783,8 +804,13 @@ class Game: draw_y + TILE_HEIGHT // 2, ), ] - pygame.draw.polygon(self.screen, COLOR_ROAD, pts) - pygame.draw.polygon(self.screen, COLOR_GRID, pts, 1) + + # Fila de meta (Zona 0) con señalización de peligro + if gy == 0: + draw_hazard_tile(self.screen, pts) + else: + pygame.draw.polygon(self.screen, COLOR_ROAD, pts) + pygame.draw.polygon(self.screen, COLOR_GRID, pts, 1) all_drawables = self.entities + self.bullets + self.spares sorted_entities = sorted(all_drawables, key=lambda e: e.gy + e.gx) diff --git a/img-versiones/version_final_04.png b/img-versiones/version_final_04.png new file mode 100644 index 0000000000000000000000000000000000000000..ac795544ccb70b6a8a45993df52c9c552189f2bb GIT binary patch literal 17567 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 lpa%%V49)#u_mQ(|m7KkS>|FIL@as|7S#7i literal 0 HcmV?d00001