feat(editor): mode mà — selecció, mou, borra i marc d'entitats

This commit is contained in:
JailDesigner committed 2026-05-02 11:28:41 +02:00
1 parent 9b09ccb765
commit b4e36944d7
5 files changed
+182 -9

No files matched your search

+28 -2
View File
@@ -7,6 +7,7 @@
#include <string>
#include <vector>
class Entity;
class EntityManager;
class Surface;
class Tilemap;
@@ -56,7 +57,9 @@ class Editor {
// Pinta el border blau i, segons mode i picker, brush preview, marc
// d'entitat seleccionada o el picker. No-op si no actiu.
void render(const Tilemap& tilemap) const;
// `entities` és necessari per al marc d'entitat hovered/seleccionada
// en Mode::HAND; en altres modes no s'usa.
void render(const Tilemap& tilemap, const EntityManager& entities) const;
private:
// Mode del cursor: determina què fa el clic esquerre sobre el mapa.
@@ -95,6 +98,24 @@ class Editor {
// o el snap no és vàlid. Retorna true si s'ha col·locat.
auto tryPlaceEntity(EntityManager& entities) -> bool;
// Mou l'entitat seleccionada a la cel·la del cursor: borra l'antiga
// i crida `addSpawn` amb la nova posició. Reusa la mateixa lògica
// de snap/solapament que la col·locació nova, excloent l'entitat
// que es mou del check de solapament.
auto tryMoveSelected(EntityManager& entities) const -> bool;
// Sub-handlers de `updateHand`. Aïllats per mantenir baixa la
// complexitat cognitiva del bucle d'esdeveniments.
void handleHandLeftClick(EntityManager& entities);
void handleHandRightClick();
// Borra l'entitat seleccionada. La validació de constraints
// (1 puerta, ≥1 sarc) es fa al pas 8.
void deleteSelected(EntityManager& entities);
// Render del marc d'una entitat: 1 px sobre el seu pixel_rect.
static void renderEntityFrame(const Entity& e, std::uint32_t argb);
void renderTilePicker(const Tilemap& tilemap) const;
void renderEntityPicker(const Tilemap& tilemap) const;
@@ -137,7 +158,12 @@ class Editor {
std::vector<EditableEntity> editable_entities_;
// Selecció en Mode::HAND (índex dins de l'EntityManager; -1 = cap).
// Selecció en Mode::HAND. Treballem amb índexs sobre el snapshot de
// `EntityManager::getEntities()` perquè és el que ens dóna l'API
// pública. Després de cada mutació (move/delete) ho recalculem; com
// que l'editor congela el joc, el snapshot només canvia per accions
// pròpies.
int hand_hover_idx_{-1};
int hand_selected_idx_{-1};
};