fix(editor): inverteix posició des del collision_rect i restaura mòmies r1

This commit is contained in:
JailDesigner committed 2026-05-02 12:22:14 +02:00
1 parent d13313503c
commit c0362abf67
2 files changed
+31 -13

No files matched your search

+29 -6
View File
@@ -5,6 +5,7 @@
#include <SDL3/SDL.h>
#include <algorithm>
#include <filesystem>
#include <sstream>
#include "core/input/key_config.hpp"
@@ -223,16 +224,31 @@ void Editor::ensureEditableEntities() {
const auto& sp = tmpl["sprite"];
if (!sp.contains("path") || !sp.contains("size")) { continue; }
const auto SPRITE_PATH = "data/entities/" + name + "/" + sp["path"].get_value<std::string>();
// Mateixa convenció de claus que `entity_manager_loadlevel.cpp`:
// la key del cache és el basename del fitxer (p.ex. "door.gif"),
// i el full_path només s'usa per a `loadSurface`. `getSurface`
// llança si no troba — provem primer i, en cas de miss, carreguem.
const auto REL = sp["path"].get_value<std::string>();
const std::string KEY = std::filesystem::path(REL).filename().string();
std::string full = "data/entities/";
full += name;
full += '/';
full += REL;
const auto SIZE = sp["size"];
if (!SIZE.is_sequence() || SIZE.size() < 2) { continue; }
const int FRAME_W = SIZE[0].get_value<int>();
const int FRAME_H = SIZE[1].get_value<int>();
auto surface = cache.getSurface(SPRITE_PATH);
if (surface == nullptr) {
cache.loadSurface(SPRITE_PATH, SPRITE_PATH);
surface = cache.getSurface(SPRITE_PATH);
std::shared_ptr<Surface> surface;
try {
surface = cache.getSurface(KEY);
} catch (const std::exception&) {
try {
cache.loadSurface(KEY, full);
surface = cache.getSurface(KEY);
} catch (const std::exception&) {
continue;
}
}
if (surface == nullptr) { continue; }
@@ -269,8 +285,15 @@ namespace {
s.sarc_row = (static_cast<int>(LOGICAL.y) - Map::origin_y) / Map::pitch_y;
}
} else if (s.type != "door") {
// Invertir des del rect de col·lisió, no del pixel_rect:
// amb anchor=feet (típic d'actors com la mòmia) el
// pixel_rect està desplaçat verticalment respecte a la
// cel·la-pivot, perquè el sprite sobresurt cap amunt amb
// falsa perspectiva. La caixa de col·lisió, en canvi, ja
// està alineada amb la cel·la del tilemap, i això és el
// que el `position: [col, row]` del YAML representa.
if (Map::tile_size > 0) {
const auto R = e->getPixelRect();
const auto R = e->getCollisionRect();
s.col = (static_cast<int>(R.x) - Map::tilemap_origin_x) / Map::tile_size;
s.row = (static_cast<int>(R.y) - Map::tilemap_origin_y) / Map::tile_size;
}