collision tile

This commit is contained in:
2026-04-06 21:51:40 +02:00
parent 98715ef3a7
commit 5393a861d1
11 changed files with 781 additions and 790 deletions

View File

@@ -11,9 +11,9 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## Cambios de diseño previstos respecto al juego original
1. **Habitaciones más grandes** — aprovechar el espacio del marcador (scoreboard) para ampliar el área jugable. Esto implica revisar la resolución de canvas, el layout de la HUD y el tamaño de los tilemaps.
2. **Nueva física del jugador** — menos arcaica, más moderna/fluida. Reemplazar la lógica actual de `Player::update()`.
3. **Motor de colisiones por tiles** — eliminar el sistema actual basado en listas de superficies (`bottom_floors_`, `top_floors_`, `left_walls_`, `right_walls_`, `left_slopes_`, `right_slopes_`, `conveyor_belt_floors_` en `Room`). Sustituir por detección de colisiones tile-based directa sobre el mapa.
4. **Transición de pantalla animada** — al cambiar de habitación, en lugar de warpear al jugador del borde opuesto, mostrar una animación/transición de cambio de pantalla.
2. ~~**Nueva física del jugador**~~**HECHO** — Player reescrito con pipeline de 6 fases, colisiones tile-based, ~20 métodos eliminados.
3. ~~**Motor de colisiones por tiles**~~**HECHO**`TileCollider` con queries directas al grid. Collision tilemap editado desde el editor (tecla 7). Sistema antiguo de superficies preservado pero no usado. Pendiente: tiles kill (5) y conveyor (6).
4. ~~**Transición de pantalla animada**~~**HECHO** — Scroll con easing `cubicInOut` (0.5s), ambas rooms visibles, enemigos activos, jugador puede moverse durante la transición.
5. **Paleta Amstrad CPC** — subir de la paleta actual (8-bit indexada limitada) a la paleta del Amstrad CPC (27 colores / más colores que la actual). Afecta a `PaletteManager` y a todos los assets de color.
## Estado del renombrado
@@ -49,6 +49,43 @@ Se han renombrado las referencias de `JailDoctor's Dilemma` → `Projecte 2026`
### Otros
- Añadidos `desktop.ini` y `Thumbs.db` al `.gitignore`.
### Transiciones de pantalla (sesión abril 2026)
- **Cambio de pantalla por punto central:** `Player::handleBorders()` usa el centro del rectángulo del jugador para detectar cambio de pantalla (antes usaba bordes).
- **Conservación de momento:** `Player::switchBorders()` conserva velocidad y estado al cambiar de pantalla (antes forzaba ON_GROUND y reseteaba vy_).
- **Transición animada con scroll:** Al cambiar de habitación, ambas rooms se desplazan con easing `cubicInOut` durante 0.5s.
- Render offset global añadido a `Screen` (`setRenderOffset`) aplicado en los 6 métodos de `Surface::render()`.
- Enemigos de ambas habitaciones se actualizan durante la transición.
- El jugador puede moverse durante la transición.
- Estado en `Game`: `transitioning_`, `transition_timer_`, `transition_old_room_`, `transition_direction_`.
- Ficheros: `screen.hpp/cpp`, `surface.cpp`, `game.hpp/cpp`.
### Impulso de salto
- `JUMP_VELOCITY` incrementado 5%: de -170.0 a -178.5.
### Collision tilemap (sesión abril 2026)
- **Formato YAML nuevo:** `tilemap:` tiene dos sub-mapas: `draw:` (tilemap de dibujo, el original) y `collision:` (mapa de colisiones). `RoomLoader::parseTilemap()` lee ambos con fallback al formato antiguo.
- **`Room::Data::collision_tile_map`** — vector<int> con tipos: 0=vacío, 1=muro, 2=plataforma, 3=slope_l, 4=slope_r, 5=kill, 6=conveyor.
- **CollisionMap migrado:** `getTile()` lee directamente del `collision_tile_map` (antes deducía el tipo por rangos de índice del tileset de dibujo). Constructor ya no necesita `tile_set_width`.
- **Editor de colisiones:** Tecla 7 o `EDIT DRAW`/`EDIT COLLISION` alterna entre editar el tilemap de dibujo y el de colisiones. En modo collision se superpone el `collision.gif` (7 tiles) sobre el mapa de dibujo. Right-click abre el tile picker del tileset correspondiente. `RoomSaver` guarda ambos sub-mapas.
- **`collision.gif`** registrado en `assets.yaml` (7 tiles: vacío, muro, plataforma, slope_l, slope_r, kill, conveyor).
### Nuevo motor de colisiones tile-based (sesión abril 2026)
- **Clase `TileCollider`** (`source/game/gameplay/tile_collider.hpp/cpp`): queries directas contra el grid de tiles sin listas de superficies intermedias. API: `checkWallLeft/Right`, `checkCeiling`, `checkFloor` (con FloorHit struct), `hasGroundBelow`, `checkSlopeBelow` (con SlopeInfo struct), `getSlopeY`.
- Integrado en `CollisionMap` (miembro + getter) y expuesto via `Room::getTileCollider()`.
- **Player reescrito** con pipeline de 6 fases claras:
1. `handleInput()` — leer input
2. `updateVelocity()` + `applyGravity()` — calcular velocidades
3. `handleJumpAndDrop()` — salto + drop-through (plataformas y slopes con DOWN)
4. `moveHorizontal()` + `moveVertical()` — movimiento con colisión tile-based
5. `checkFalling()` — detectar caída
6. `syncSpriteAndCollider()` + `animate()` + `handleBorders()`
- **~20 métodos eliminados** del Player antiguo. Slopes gestionadas por tile (slope_tile_x/y/type) en vez de puntero a LineDiagonal.
- **Sistema antiguo de superficies preservado** en CollisionMap (no eliminado), simplemente ya no usado por Player.
- **Pendiente:** tiles 5 (kill) y 6 (conveyor) no soportados aún en el nuevo motor.
### Otros
- Añadidos `desktop.ini` y `Thumbs.db` al `.gitignore`.
---
## Overview (legacy)