完成生命组件与死伤状态

This commit is contained in:
Ziyu
2025-06-16 14:44:47 +08:00
parent a31890fc20
commit 26ed9c34e4
15 changed files with 370 additions and 5 deletions
+39
View File
@@ -0,0 +1,39 @@
#include "dead_state.h"
#include "../player_component.h"
#include "../../../engine/object/game_object.h"
#include "../../../engine/component/animation_component.h"
#include "../../../engine/component/physics_component.h"
#include "../../../engine/component/collider_component.h"
namespace game::component::state {
void DeadState::enter() {
spdlog::debug("玩家进入死亡状态。");
playAnimation("hurt"); // 播放死亡(受伤)动画
// 应用击退力(只向上)
auto physics_component = player_component_->getPhysicsComponent();
physics_component->velocity_ = glm::vec2(0.0f, -200.0f); // 向上击退
// 禁用碰撞(自动掉出屏幕)
auto collider_component = player_component_->getOwner()->getComponent<engine::component::ColliderComponent>();
if (collider_component) {
collider_component->setActive(false);
}
}
void DeadState::exit() {
}
std::unique_ptr<PlayerState> DeadState::handleInput(engine::core::Context&){
// 死亡状态下不处理输入
return nullptr;
}
std::unique_ptr<PlayerState> DeadState::update(float, engine::core::Context&){
// 死亡状态下不更新状态
return nullptr;
}
}
+19
View File
@@ -0,0 +1,19 @@
#pragma once
#include "player_state.h"
namespace game::component::state {
class DeadState final : public PlayerState {
friend class game::component::PlayerComponent;
public:
DeadState(PlayerComponent* player_component) : PlayerState(player_component) {}
~DeadState() override = default;
private:
void enter() override;
void exit() override;
std::unique_ptr<PlayerState> handleInput(engine::core::Context&) override;
std::unique_ptr<PlayerState> update(float delta_time, engine::core::Context&) override;
};
} // namespace game::component::state
+56
View File
@@ -0,0 +1,56 @@
#include "hurt_state.h"
#include "idle_state.h"
#include "walk_state.h"
#include "fall_state.h"
#include "../player_component.h"
#include "../../../engine/core/context.h"
#include "../../../engine/component/physics_component.h"
#include "../../../engine/component/sprite_component.h"
#include <glm/common.hpp>
namespace game::component::state {
void HurtState::enter() {
playAnimation("hurt"); // 播放受伤动画
// --- 造成击退效果 ---
auto physics_component = player_component_->getPhysicsComponent();
auto sprite_component = player_component_->getSpriteComponent();
auto knockback_velocity = glm::vec2(-100.0f, -150.0f); // 默认左上方击退效果
// 根据当前精灵的朝向状态决定是否改成右上方
if (sprite_component->isFlipped()) {
knockback_velocity.x = -knockback_velocity.x; // 变成向右
}
physics_component->velocity_ = knockback_velocity; // 设置击退速度
}
void HurtState::exit() {
}
std::unique_ptr<PlayerState> HurtState::handleInput(engine::core::Context&){
// 硬直期不能进行任何操控
return nullptr;
}
std::unique_ptr<PlayerState> HurtState::update(float delta_time, engine::core::Context&){
stunned_timer_ += delta_time;
// --- 两种情况离开受伤(硬直)状态:---
// 1. 落地
auto physics_component = player_component_->getPhysicsComponent();
if (physics_component->hasCollidedBelow()) {
if (glm::abs(physics_component->velocity_.x) < 1.0f) {
return std::make_unique<IdleState>(player_component_);
} else {
return std::make_unique<WalkState>(player_component_);
}
}
// 2. 硬直时间结束(能走到这里说明没有落地,直接切换到 FallState)
if (stunned_timer_ > player_component_->getStunnedDuration()){
stunned_timer_ = 0.0f; // 重置硬直计时器
return std::make_unique<FallState>(player_component_); // 切换到下落状态
}
return nullptr;
}
}
+22
View File
@@ -0,0 +1,22 @@
#pragma once
#include "player_state.h"
namespace game::component::state {
class HurtState final : public PlayerState {
friend class game::component::PlayerComponent;
private:
float stunned_timer_ = 0.0f; ///< @brief 硬直计时器,单位为秒
public:
HurtState(PlayerComponent* player_component) : PlayerState(player_component) {}
~HurtState() override = default;
private:
void enter() override;
void exit() override;
std::unique_ptr<PlayerState> handleInput(engine::core::Context&) override;
std::unique_ptr<PlayerState> update(float delta_time, engine::core::Context&) override;
};
} // namespace game::component::state