From a5148f5ed5ea4162719d8b8ee20a26276851136e Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 12 Apr 2026 16:05:25 +0200 Subject: [PATCH] editor: posibilitat de pintar en els dos tilemaps a l'hora --- data/input/keys.yaml | 4 ++++ source/game/editor/map_editor.cpp | 29 +++++++++++++++++++++++++++-- source/game/editor/map_editor.hpp | 1 + 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/data/input/keys.yaml b/data/input/keys.yaml index 3662051..9c3f0ee 100644 --- a/data/input/keys.yaml +++ b/data/input/keys.yaml @@ -111,6 +111,10 @@ scopes: key: "8" code: "8" desc: "draw/collision mode" + - id: auto_collision + key: "C" + code: "C" + desc: "cycle auto-collision" - id: tile_picker key: "T" code: "T" diff --git a/source/game/editor/map_editor.cpp b/source/game/editor/map_editor.cpp index 2672e41..a88a58f 100644 --- a/source/game/editor/map_editor.cpp +++ b/source/game/editor/map_editor.cpp @@ -130,7 +130,8 @@ auto MapEditor::showGrid(bool show) -> std::string { auto MapEditor::setEditingCollision(bool collision) -> std::string { editing_collision_ = collision; - brush_.clear(); // Resetear brush al cambiar de modo + brush_.clear(); // Resetear brush al cambiar de modo + if (editing_collision_) { auto_collision_ = -1; } // Desactivar auto-collision en modo colisión puro return editing_collision_ ? "Editing: collision" : "Editing: draw"; } @@ -492,6 +493,18 @@ void MapEditor::handleEvent(const SDL_Event& event) { // NOLINT(readability-fun return; } + // C: ciclar auto-collision (solo en modo draw) + if (event.type == SDL_EVENT_KEY_DOWN && event.key.key == kc->key("EDITOR", "auto_collision") && static_cast(event.key.repeat) == 0 && !editing_collision_) { + if (auto_collision_ == -1) { + auto_collision_ = 1; // WALL + } else if (auto_collision_ == 1) { + auto_collision_ = 2; // PASSABLE + } else { + auto_collision_ = -1; // desactivado + } + return; + } + // Cursores: navegar a habitación adyacente if (event.type == SDL_EVENT_KEY_DOWN && static_cast(event.key.repeat) == 0) { std::string direction; @@ -970,6 +983,14 @@ void MapEditor::stampBrushAt(int tile_x, int tile_y) { room_data_.tile_map[idx] = value; room_->setTile(idx, value); } + // Auto-collision: pintar también en collision tilemap + if (auto_collision_ >= 0) { + int col_value = (value == BrushPattern::ERASE) ? 0 : auto_collision_; + if (idx < static_cast(room_data_.collision_tile_map.size()) && room_data_.collision_tile_map[idx] != col_value) { + room_data_.collision_tile_map[idx] = col_value; + room_->setCollisionTile(idx, col_value); + } + } } } } @@ -1461,7 +1482,7 @@ void MapEditor::updateStatusBarInfo() { // NOLINT(readability-function-cognitiv } } - // Línea 4: brush activo + // Línea 4: brush activo + auto-collision std::string line4; if (!brush_.isEmpty()) { if (brush_.width == 1 && brush_.height == 1) { @@ -1471,6 +1492,10 @@ void MapEditor::updateStatusBarInfo() { // NOLINT(readability-function-cognitiv line4 = "brush: " + std::to_string(brush_.width) + "x" + std::to_string(brush_.height); } } + if (!editing_collision_ && auto_collision_ >= 0) { + const char* col_name = (auto_collision_ == 1) ? "wall" : "pass"; + line4 += (line4.empty() ? "" : " ") + std::string("[col: ") + col_name + "]"; + } statusbar_->setLine2(line2); statusbar_->setLine3(line3); diff --git a/source/game/editor/map_editor.hpp b/source/game/editor/map_editor.hpp index 5a1357d..deddc8d 100644 --- a/source/game/editor/map_editor.hpp +++ b/source/game/editor/map_editor.hpp @@ -231,6 +231,7 @@ class MapEditor { EyedropperState eyedropper_; // Estado del eyedropper (clic derecho) bool painting_{false}; // true mientras se está pintando con click izquierdo mantenido bool editing_collision_{false}; // true = editando collision tilemap, false = editando draw tilemap + int auto_collision_{-1}; // -1 = desactivado, 1 = WALL, 2 = PASSABLE (se aplica al pintar draw tiles) // Datos de la habitación Room::Data room_data_;