fix(editor): inverteix posició des del collision_rect i restaura mòmies r1
This commit is contained in:
1 parent
d13313503c
commit
c0362abf67
2 files changed
+31
-13
No files matched your search
@@ -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;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user