refactor(anim): direccions cardinals (north/south/east) en YAML i codi
This commit is contained in:
1 parent
1d43a77800
commit
9dc7ff0da3
9 files changed
+189
-240
No files matched your search
@@ -205,19 +205,19 @@ void Player::readWhipBlock(const fkyaml::node& yaml) {
|
||||
void Player::applyCardinal(Cardinal c) {
|
||||
switch (c) {
|
||||
case Cardinal::NORTH:
|
||||
facing_ = Facing::UP;
|
||||
facing_ = Facing::NORTH;
|
||||
setFlip(SDL_FLIP_NONE);
|
||||
break;
|
||||
case Cardinal::SOUTH:
|
||||
facing_ = Facing::DOWN;
|
||||
facing_ = Facing::SOUTH;
|
||||
setFlip(SDL_FLIP_NONE);
|
||||
break;
|
||||
case Cardinal::EAST:
|
||||
facing_ = Facing::SIDE;
|
||||
facing_ = Facing::EAST;
|
||||
setFlip(SDL_FLIP_NONE);
|
||||
break;
|
||||
case Cardinal::WEST:
|
||||
facing_ = Facing::SIDE;
|
||||
facing_ = Facing::EAST;
|
||||
setFlip(SDL_FLIP_HORIZONTAL);
|
||||
break;
|
||||
case Cardinal::NONE:
|
||||
@@ -236,10 +236,10 @@ auto Player::cardinalFromInput(float vx, float vy) -> Cardinal {
|
||||
}
|
||||
|
||||
auto Player::cardinalFromString(const std::string& s) -> Cardinal {
|
||||
if (s == "north" || s == "up") { return Cardinal::NORTH; }
|
||||
if (s == "south" || s == "down") { return Cardinal::SOUTH; }
|
||||
if (s == "east" || s == "right") { return Cardinal::EAST; }
|
||||
if (s == "west" || s == "left") { return Cardinal::WEST; }
|
||||
if (s == "north") { return Cardinal::NORTH; }
|
||||
if (s == "south") { return Cardinal::SOUTH; }
|
||||
if (s == "east") { return Cardinal::EAST; }
|
||||
if (s == "west") { return Cardinal::WEST; }
|
||||
throw std::runtime_error("Player: cardinal desconegut '" + s + "' al bloc turn.transitions");
|
||||
}
|
||||
|
||||
@@ -314,15 +314,15 @@ void Player::updateFacingAndTurn(float delta_time, float vx, float vy) {
|
||||
applyCardinal(intermediate_cardinal_);
|
||||
} else if (vx != 0.0F) {
|
||||
// Tria de facing original: prevalença lateral, flip segons el
|
||||
// signe de vx; verticals purs van a UP/DOWN amb flip NONE; en
|
||||
// aturar-se conservem `facing_` per a l'animació stand.
|
||||
facing_ = Facing::SIDE;
|
||||
// signe de vx; verticals purs van a NORTH/SOUTH amb flip NONE;
|
||||
// en aturar-se conservem `facing_` per a l'animació stand.
|
||||
facing_ = Facing::EAST;
|
||||
setFlip(vx < 0.0F ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE);
|
||||
} else if (vy < 0.0F) {
|
||||
facing_ = Facing::UP;
|
||||
facing_ = Facing::NORTH;
|
||||
setFlip(SDL_FLIP_NONE);
|
||||
} else if (vy > 0.0F) {
|
||||
facing_ = Facing::DOWN;
|
||||
facing_ = Facing::SOUTH;
|
||||
setFlip(SDL_FLIP_NONE);
|
||||
}
|
||||
}
|
||||
@@ -342,11 +342,11 @@ Player::Player(const std::string& anim_key, int id, float x, float y, const Cont
|
||||
paint_tile_index_(paint_tile_index) {
|
||||
setPos(x, y);
|
||||
// Postura inicial mirant cap al jugador (cara avall), no de costat:
|
||||
// forcem facing_ a DOWN i l'animació `stand_down` abans del primer
|
||||
// forcem facing_ a SOUTH i l'animació `stand_south` abans del primer
|
||||
// frame d'input — el primer `update` la preservarà si l'usuari no
|
||||
// prem cap tecla.
|
||||
facing_ = Facing::DOWN;
|
||||
setCurrentAnimation("stand_down");
|
||||
facing_ = Facing::SOUTH;
|
||||
setCurrentAnimation("stand_south");
|
||||
}
|
||||
|
||||
void Player::update(float delta_time) {
|
||||
@@ -650,11 +650,11 @@ auto Player::consumeAttackEdge() -> bool {
|
||||
|
||||
auto Player::currentFacingCardinal() const -> Cardinal {
|
||||
switch (facing_) {
|
||||
case Facing::UP:
|
||||
case Facing::NORTH:
|
||||
return Cardinal::NORTH;
|
||||
case Facing::DOWN:
|
||||
case Facing::SOUTH:
|
||||
return Cardinal::SOUTH;
|
||||
case Facing::SIDE:
|
||||
case Facing::EAST:
|
||||
break;
|
||||
}
|
||||
// Lateral: el flip discrimina E/W. Sense flip = mira a la dreta
|
||||
@@ -725,7 +725,7 @@ void Player::startJump() {
|
||||
// Un gir de 180° en curs es compromet immediatament: si l'usuari
|
||||
// ha disparat un giro (oest→est, p.ex.) i salta abans que s'esgote
|
||||
// el timer, l'animació del salt ha de mostrar la direcció final
|
||||
// (jump lateral), no la intermèdia (jump_down). Aplem el pending
|
||||
// (jump lateral), no la intermèdia (jump_south). Aplem el pending
|
||||
// ara mateix i resetem l'estat del gir. Si no hi havia gir en
|
||||
// curs, és no-op.
|
||||
if (turning_remaining_ms_ > 0.0F) {
|
||||
@@ -1112,42 +1112,42 @@ auto Player::animationName(bool moving) const -> const char* {
|
||||
// salt és per direcció, no per velocitat.
|
||||
if (state_ == State::AIRBORNE) {
|
||||
switch (facing_) {
|
||||
case Facing::UP:
|
||||
return "jump_up";
|
||||
case Facing::DOWN:
|
||||
return "jump_down";
|
||||
case Facing::SIDE:
|
||||
case Facing::NORTH:
|
||||
return "jump_north";
|
||||
case Facing::SOUTH:
|
||||
return "jump_south";
|
||||
case Facing::EAST:
|
||||
break;
|
||||
}
|
||||
return "jump";
|
||||
return "jump_east";
|
||||
}
|
||||
// En LANDING_STUN, `stun_*` (per direcció): mostrem el frame
|
||||
// d'aterratge fins que s'esgota el timer. La direcció ve fixada del
|
||||
// moment del despegue (no es canvia mentre estem en l'aire).
|
||||
if (state_ == State::LANDING_STUN) {
|
||||
switch (facing_) {
|
||||
case Facing::UP:
|
||||
return "stun_up";
|
||||
case Facing::DOWN:
|
||||
return "stun_down";
|
||||
case Facing::SIDE:
|
||||
case Facing::NORTH:
|
||||
return "stun_north";
|
||||
case Facing::SOUTH:
|
||||
return "stun_south";
|
||||
case Facing::EAST:
|
||||
break;
|
||||
}
|
||||
return "stun";
|
||||
return "stun_east";
|
||||
}
|
||||
// En HURT, `hurt_*` (per direcció): el jugador llisca sense
|
||||
// control en la direcció triada per `enterHurt`. Mateixa estructura
|
||||
// que walk per facilitat (ara mateix els frames són clons).
|
||||
if (state_ == State::HURT) {
|
||||
switch (facing_) {
|
||||
case Facing::UP:
|
||||
return "hurt_up";
|
||||
case Facing::DOWN:
|
||||
return "hurt_down";
|
||||
case Facing::SIDE:
|
||||
case Facing::NORTH:
|
||||
return "hurt_north";
|
||||
case Facing::SOUTH:
|
||||
return "hurt_south";
|
||||
case Facing::EAST:
|
||||
break;
|
||||
}
|
||||
return "hurt";
|
||||
return "hurt_east";
|
||||
}
|
||||
// ATTACKING té dues sub-fases: durant `swing_ms` el sprite és
|
||||
// `attack_*` (animació del braç llançant el látigo); durant
|
||||
@@ -1161,34 +1161,34 @@ auto Player::animationName(bool moving) const -> const char* {
|
||||
const bool IN_SWING = (attacking_remaining_ms_ > static_cast<float>(whip_config.cooldown_ms));
|
||||
if (IN_SWING) {
|
||||
switch (facing_) {
|
||||
case Facing::UP:
|
||||
return "attack_up";
|
||||
case Facing::DOWN:
|
||||
return "attack_down";
|
||||
case Facing::SIDE:
|
||||
case Facing::NORTH:
|
||||
return "attack_north";
|
||||
case Facing::SOUTH:
|
||||
return "attack_south";
|
||||
case Facing::EAST:
|
||||
break;
|
||||
}
|
||||
return "attack";
|
||||
return "attack_east";
|
||||
}
|
||||
switch (facing_) {
|
||||
case Facing::UP:
|
||||
return "recover_up";
|
||||
case Facing::DOWN:
|
||||
return "recover_down";
|
||||
case Facing::SIDE:
|
||||
case Facing::NORTH:
|
||||
return "recover_north";
|
||||
case Facing::SOUTH:
|
||||
return "recover_south";
|
||||
case Facing::EAST:
|
||||
break;
|
||||
}
|
||||
return "recover";
|
||||
return "recover_east";
|
||||
}
|
||||
switch (facing_) {
|
||||
case Facing::UP:
|
||||
return moving ? "walk_up" : "stand_up";
|
||||
case Facing::DOWN:
|
||||
return moving ? "walk_down" : "stand_down";
|
||||
case Facing::SIDE:
|
||||
case Facing::NORTH:
|
||||
return moving ? "walk_north" : "stand_north";
|
||||
case Facing::SOUTH:
|
||||
return moving ? "walk_south" : "stand_south";
|
||||
case Facing::EAST:
|
||||
break;
|
||||
}
|
||||
return moving ? "walk" : "stand";
|
||||
return moving ? "walk_east" : "stand_east";
|
||||
}
|
||||
|
||||
auto Player::getCurrentTile() const -> std::pair<int, int> {
|
||||
@@ -1249,11 +1249,11 @@ void Player::respawn(float x, float y) {
|
||||
intermediate_cardinal_ = Cardinal::NONE;
|
||||
last_input_cardinal_ = Cardinal::NONE;
|
||||
// Reseteig del facing al d'spawn original (mirant cap a la càmera):
|
||||
// sense això, un EXITED que entrava per la porta amb facing UP
|
||||
// sense això, un EXITED que entrava per la porta amb facing NORTH
|
||||
// re-aparix d'esquena al pròxim cicle. Mateixa lògica que el ctor.
|
||||
facing_ = Facing::DOWN;
|
||||
facing_ = Facing::SOUTH;
|
||||
setFlip(SDL_FLIP_NONE);
|
||||
setCurrentAnimation("stand_down");
|
||||
setCurrentAnimation("stand_south");
|
||||
setPosX(x);
|
||||
setPosY(y);
|
||||
}
|
||||
@@ -1300,10 +1300,10 @@ void Player::spawnFromAir(float x, float y) {
|
||||
intended_vy_ = 0.0F;
|
||||
|
||||
// Mirant cap avall durant la caiguda — `animationName(AIRBORNE)` amb
|
||||
// facing DOWN ja resol a `jump_down`. `respawn` ja ha posat facing a
|
||||
// DOWN; ho deixem explícit ací per claredat de la cinemàtica.
|
||||
facing_ = Facing::DOWN;
|
||||
setCurrentAnimation("jump_down");
|
||||
// facing SOUTH ja resol a `jump_south`. `respawn` ja ha posat facing a
|
||||
// SOUTH; ho deixem explícit ací per claredat de la cinemàtica.
|
||||
facing_ = Facing::SOUTH;
|
||||
setCurrentAnimation("jump_south");
|
||||
}
|
||||
|
||||
auto Player::getBaseBox() const -> SDL_FRect {
|
||||
|
||||
Reference in new issue
Block a user