migrades portes i plataformes a solidActor

This commit is contained in:
2026-04-11 12:54:54 +02:00
parent 49f6ed41e6
commit 5b2f986d32
22 changed files with 686 additions and 286 deletions

View File

@@ -750,16 +750,12 @@ auto MapEditor::commitEntityDrag() -> bool {
break;
case EntityType::DOOR:
if (IDX >= 0 && IDX < static_cast<int>(room_data_.doors.size())) {
// Truco crítico: durante el drag, moveEntityVisual movió el sprite
// pero los WALLs del CollisionMap siguen en la posición antigua. Antes
// de llamar a moveDoor (que limpia los tiles "actuales" y escribe los
// nuevos), restauramos el sprite a su posición vieja para que coincida
// con los tiles. moveDoor luego hace el ciclo limpio y completo.
auto* door_mgr = room_->getDoorManager();
door_mgr->getDoor(IDX)->setPosition(room_data_.doors[IDX].x, room_data_.doors[IDX].y);
// Con el SolidActorManager, moveDoor solo reposiciona el AABB
// del Door (no hay tiles que sincronizar). moveEntityVisual ya
// movió el sprite durante el drag; moveDoor hace el ajuste final.
room_data_.doors[IDX].x = drag_.snap_x;
room_data_.doors[IDX].y = drag_.snap_y;
door_mgr->moveDoor(IDX, drag_.snap_x, drag_.snap_y);
room_->getDoorManager()->moveDoor(IDX, drag_.snap_x, drag_.snap_y);
selection_ = {EntityType::DOOR, IDX};
return true;
}
@@ -2503,11 +2499,12 @@ auto MapEditor::duplicateKey() -> std::string {
// (id, animation) requiere recrear el Door y mantener los tiles sincronizados.
void MapEditor::rebuildDoors() {
auto* door_mgr = room_->getDoorManager();
// Borrar una a una desde el principio: cada removeDoor limpia sus WALLs
// Borrar una a una desde el principio: cada removeDoor desregistra el
// Door del SolidActorManager.
while (door_mgr->getCount() > 0) {
door_mgr->removeDoor(0);
}
// Re-añadir desde room_data_; addDoor reescribe los WALLs si bloquean
// Re-añadir desde room_data_; addDoor las registra como SolidActor.
for (const auto& d : room_data_.doors) {
door_mgr->addDoor(std::make_shared<Door>(d, /*start_opened=*/false));
}
@@ -2584,7 +2581,7 @@ auto MapEditor::deleteDoor() -> std::string {
const int IDX = selection_.index;
// Importante: usar removeDoor del manager (limpia los WALLs antes de borrar)
// Importante: usar removeDoor del manager (desregistra del SolidActorManager)
room_->getDoorManager()->removeDoor(IDX);
room_data_.doors.erase(room_data_.doors.begin() + IDX);