feat(whip): separa draw_rect i damage_rect; sprites 80×32 / 16×96; feet_y delegat a l'owner; recover_* per al cooldown
This commit is contained in:
1 parent
121558b1fd
commit
8f66961c7b
15 files changed
+353
-127
No files matched your search
@@ -89,18 +89,81 @@ WhipAttack::WhipAttack(const fkyaml::node& yaml) {
|
||||
anim_ = anim_swing_;
|
||||
}
|
||||
|
||||
void WhipAttack::configure(Direction dir, float spawn_x, float spawn_y, float range_px) {
|
||||
void WhipAttack::configure(Direction dir, const SDL_FRect& owner_box, float range_px) {
|
||||
direction_ = dir;
|
||||
range_px_ = range_px;
|
||||
|
||||
// Draw rect (= pixel_rect_): cobreix tot el sprite del látigo segons
|
||||
// la taula d'offsets del disseny:
|
||||
// E: (player.x - 16, player.y ), 80×32
|
||||
// W: (player.x - 48, player.y ), 80×32
|
||||
// N: (player.x, player.y - 48 ), 16×96
|
||||
// S: (player.x, player.y - 16 ), 16×96
|
||||
const auto& chosen = spriteFor(dir);
|
||||
setPixelRect({.x = spawn_x, .y = spawn_y, .w = chosen.frame_w, .h = chosen.frame_h});
|
||||
SDL_FRect draw{0.0F, 0.0F, chosen.frame_w, chosen.frame_h};
|
||||
switch (dir) {
|
||||
case Direction::EAST:
|
||||
draw.x = owner_box.x - 16.0F;
|
||||
draw.y = owner_box.y;
|
||||
break;
|
||||
case Direction::WEST:
|
||||
draw.x = owner_box.x - 48.0F;
|
||||
draw.y = owner_box.y;
|
||||
break;
|
||||
case Direction::NORTH:
|
||||
draw.x = owner_box.x;
|
||||
draw.y = owner_box.y - 48.0F;
|
||||
break;
|
||||
case Direction::SOUTH:
|
||||
draw.x = owner_box.x;
|
||||
draw.y = owner_box.y - 16.0F;
|
||||
break;
|
||||
}
|
||||
setPixelRect(draw);
|
||||
|
||||
// Damage rect: 48×16 (E/W) o 16×48 (N/S) al nivell dels peus del
|
||||
// jugador (els últims 16 px del seu pixel_rect — convenció estàndard
|
||||
// del player AEE), pegat al borde en la direcció d'atac.
|
||||
// computeDamageRect rep la cantonada del rect MÀXIM (sense retallar)
|
||||
// i recorre internament la línia per topar amb el primer bloquejador.
|
||||
const float COLLISION_TOP_Y = owner_box.y + owner_box.h - 16.0F;
|
||||
const float OWNER_RIGHT = owner_box.x + owner_box.w;
|
||||
const float OWNER_BOTTOM = owner_box.y + owner_box.h;
|
||||
float spawn_x = 0.0F;
|
||||
float spawn_y = 0.0F;
|
||||
switch (dir) {
|
||||
case Direction::EAST:
|
||||
spawn_x = OWNER_RIGHT;
|
||||
spawn_y = COLLISION_TOP_Y;
|
||||
break;
|
||||
case Direction::WEST:
|
||||
spawn_x = owner_box.x - range_px;
|
||||
spawn_y = COLLISION_TOP_Y;
|
||||
break;
|
||||
case Direction::NORTH:
|
||||
spawn_x = owner_box.x;
|
||||
spawn_y = COLLISION_TOP_Y - range_px;
|
||||
break;
|
||||
case Direction::SOUTH:
|
||||
spawn_x = owner_box.x;
|
||||
spawn_y = OWNER_BOTTOM;
|
||||
break;
|
||||
}
|
||||
computeDamageRect(dir, spawn_x, spawn_y, range_px);
|
||||
|
||||
// Snapshot del feet_y del jugador. La convenció estàndard del Player
|
||||
// AEE té el seu feet_y a la base inferior del pixel_rect (collision
|
||||
// 16×16 als últims 16 px del sprite 16×32), així que owner_box.y +
|
||||
// owner_box.h reprodueix `Player::getFeetY()` exactament.
|
||||
owner_feet_y_ = owner_box.y + owner_box.h;
|
||||
|
||||
if (anim_.has_value()) { anim_->reset(); }
|
||||
}
|
||||
|
||||
auto WhipAttack::getFeetY() const -> float {
|
||||
return owner_feet_y_;
|
||||
}
|
||||
|
||||
void WhipAttack::setWorldContext(EntityManager* manager, const std::vector<Player*>* players) {
|
||||
entity_manager_ = manager;
|
||||
players_ = players;
|
||||
|
||||
Reference in new issue
Block a user