feat(effects): polvet transitori al despegue i a l'aterratge
This commit is contained in:
1 parent
c38c80753a
commit
3e379ce129
11 files changed
+209
-1
No files matched your search
@@ -26,7 +26,9 @@
|
||||
#include "core/system/event_buffer.hpp"
|
||||
#include "core/ui/ui_config.hpp"
|
||||
#include "external/fkyaml_node.hpp"
|
||||
#include "game/entities/concrete/dust.hpp"
|
||||
#include "game/entities/entity.hpp"
|
||||
#include "game/entities/entity_loader.hpp"
|
||||
#include "game/entities/event_bus.hpp"
|
||||
#include "game/entities/player.hpp"
|
||||
#include "game/map/map.hpp"
|
||||
@@ -273,6 +275,21 @@ GameScene::GameScene(Config config)
|
||||
<< " dmg=" << (dmg != nullptr ? *dmg : 0) << '\n';
|
||||
});
|
||||
|
||||
// Polvet: precarreguem el surface del Dust una sola vegada perquè
|
||||
// els spawns runtime de l'entitat no facin disc al primer salt.
|
||||
// També ens subscrivim a `player_jumped` i `player_landed` per
|
||||
// spawnejar el polvet de despegue / aterratge a la posició dels
|
||||
// peus que el Player ens dóna al payload.
|
||||
Resource::Cache::get().loadSurface("dust.gif", "data/entities/dust/dust.gif");
|
||||
entity_manager_.getBus().subscribe("player_jumped", [this](const Event& ev) {
|
||||
const auto* pos = std::get_if<WorldPos>(&ev.payload);
|
||||
if (pos != nullptr) { spawnDust(pos->x, pos->y, false); }
|
||||
});
|
||||
entity_manager_.getBus().subscribe("player_landed", [this](const Event& ev) {
|
||||
const auto* pos = std::get_if<WorldPos>(&ev.payload);
|
||||
if (pos != nullptr) { spawnDust(pos->x, pos->y, true); }
|
||||
});
|
||||
|
||||
// Controls per jugador: P1 amb fletxes, P2 amb WASD. Cada Player
|
||||
// escolta les seues pròpies tecles dins del seu `update`, no hi ha
|
||||
// estat global d'input.
|
||||
@@ -382,6 +399,30 @@ GameScene::GameScene(Config config)
|
||||
|
||||
GameScene::~GameScene() = default;
|
||||
|
||||
void GameScene::spawnDust(float feet_x_center, float feet_y, bool is_landing) {
|
||||
// Mida del sprite de Dust llegida del seu YAML. Hardcoded per
|
||||
// simplificar — si canvia, només cal tocar dust.yaml + aquesta
|
||||
// constant. La caixa de render es centra horitzontalment al peu i
|
||||
// s'alinea al sòl amb un pixel de marge cap amunt perquè la sombra
|
||||
// quede pintada per davant del polvet i el polvet, en l'y-sort,
|
||||
// entre per davant del jugador (mateixa lògica que la sombra).
|
||||
constexpr float DUST_W = 40.0F;
|
||||
constexpr float DUST_H = 16.0F;
|
||||
auto dust = std::make_unique<Dust>(EntityLoader::loadTemplate("dust"));
|
||||
dust->setVariant(is_landing ? Dust::Variant::LAND : Dust::Variant::JUMP);
|
||||
dust->setSurface(Resource::Cache::get().getSurface("dust.gif"));
|
||||
// Recolzat al sòl, amb la base del rect 1 px per sobre del peu del
|
||||
// jugador → en l'y-sort surt amb feet_y un pèl menor i, per
|
||||
// estabilitat de stable_sort, queda darrere del jugador.
|
||||
dust->setPixelRect({
|
||||
.x = feet_x_center - (DUST_W * 0.5F),
|
||||
.y = feet_y - DUST_H - 1.0F,
|
||||
.w = DUST_W,
|
||||
.h = DUST_H,
|
||||
});
|
||||
entity_manager_.add(std::move(dust));
|
||||
}
|
||||
|
||||
void GameScene::handlePauseInput() {
|
||||
#ifdef _DEBUG
|
||||
// Mutex amb l'editor: si està actiu, ignorem la tecla de pausa.
|
||||
|
||||
Reference in new issue
Block a user