refactor(player): mou height de jump a collision per coherència amb les entitats
This commit is contained in:
1 parent
64390f8ad7
commit
4758d5d8a4
4 files changed
+54
-35
No files matched your search
@@ -77,28 +77,7 @@ void Player::loadFrom(const std::string& yaml_path) {
|
||||
|
||||
readSpriteSize(yaml, yaml_path, sprite_w, sprite_h);
|
||||
|
||||
if (!yaml.contains("collision")) {
|
||||
throw std::runtime_error("Player: manca bloc `collision:` a " + yaml_path);
|
||||
}
|
||||
const auto& c = yaml["collision"];
|
||||
collision_size = c["size"].get_value<int>();
|
||||
base_size = c["base_size"].get_value<int>();
|
||||
|
||||
// Col·lisió centrada en el quadrat inferior del sprite. Si la caixa és
|
||||
// més gran que la base (cas habitual, 16 vs 12) el padding és simètric
|
||||
// a cada costat; si són iguals, padding=0 i la caixa coincideix amb la
|
||||
// base sense offsets.
|
||||
collision_padding = (collision_size - base_size) / 2;
|
||||
collision_x_offset = -collision_padding;
|
||||
collision_y_offset = (sprite_h - base_size) - collision_padding;
|
||||
|
||||
// Hit-box opcional (actor-actor). Si no hi és, s'iguala a la base
|
||||
// per preservar compatibilitat amb YAMLs antics. Concèntrica amb la
|
||||
// caixa de col·lisió: offset interior = (collision_size - hit_size) / 2.
|
||||
hit_size = c.contains("hit_size") ? c["hit_size"].get_value<int>() : collision_size;
|
||||
const int HIT_INSET = (collision_size - hit_size) / 2;
|
||||
hit_x_offset = collision_x_offset + HIT_INSET;
|
||||
hit_y_offset = collision_y_offset + HIT_INSET;
|
||||
readCollisionBlock(yaml, yaml_path);
|
||||
|
||||
// Bloc opcional `inertia:` — si manca, `brake_time_ms` queda a 0 i
|
||||
// la inèrcia de frenada no s'activa (parada instantània com abans).
|
||||
@@ -130,15 +109,43 @@ void Player::loadFrom(const std::string& yaml_path) {
|
||||
readJumpBlock(yaml);
|
||||
}
|
||||
|
||||
void Player::readCollisionBlock(const fkyaml::node& yaml, const std::string& yaml_path) {
|
||||
if (!yaml.contains("collision")) {
|
||||
throw std::runtime_error("Player: manca bloc `collision:` a " + yaml_path);
|
||||
}
|
||||
const auto& c = yaml["collision"];
|
||||
collision_size = c["size"].get_value<int>();
|
||||
base_size = c["base_size"].get_value<int>();
|
||||
|
||||
// Col·lisió centrada en el quadrat inferior del sprite. Si la caixa és
|
||||
// més gran que la base (cas habitual, 16 vs 12) el padding és simètric
|
||||
// a cada costat; si són iguals, padding=0 i la caixa coincideix amb la
|
||||
// base sense offsets.
|
||||
collision_padding = (collision_size - base_size) / 2;
|
||||
collision_x_offset = -collision_padding;
|
||||
collision_y_offset = (sprite_h - base_size) - collision_padding;
|
||||
|
||||
// Hit-box opcional (actor-actor). Si no hi és, s'iguala a la base
|
||||
// per preservar compatibilitat amb YAMLs antics. Concèntrica amb la
|
||||
// caixa de col·lisió: offset interior = (collision_size - hit_size) / 2.
|
||||
hit_size = c.contains("hit_size") ? c["hit_size"].get_value<int>() : collision_size;
|
||||
const int HIT_INSET = (collision_size - hit_size) / 2;
|
||||
hit_x_offset = collision_x_offset + HIT_INSET;
|
||||
hit_y_offset = collision_y_offset + HIT_INSET;
|
||||
|
||||
// Alçada del cos, llegida del mateix bloc per coherència amb la
|
||||
// resta d'entitats (mummy, sarcophagus, etc.). 0 = sense filtre per
|
||||
// altura — el salt no esquiva l'altre jugador.
|
||||
body_height = c.contains("height") ? c["height"].get_value<int>() : 0;
|
||||
}
|
||||
|
||||
void Player::readJumpBlock(const fkyaml::node& yaml) {
|
||||
jump_config = JumpConfig{};
|
||||
body_height = 0;
|
||||
if (!yaml.contains("jump")) { return; }
|
||||
const auto& j = yaml["jump"];
|
||||
if (j.contains("impulse")) { jump_config.impulse_px_per_s = j["impulse"].get_value<float>(); }
|
||||
if (j.contains("gravity")) { jump_config.gravity_px_per_s2 = j["gravity"].get_value<float>(); }
|
||||
if (j.contains("landing_stun_ms")) { jump_config.landing_stun_ms = j["landing_stun_ms"].get_value<int>(); }
|
||||
if (j.contains("height")) { body_height = j["height"].get_value<int>(); }
|
||||
}
|
||||
|
||||
void Player::applyCardinal(Cardinal c) {
|
||||
|
||||
Reference in new issue
Block a user