完成生命组件与死伤状态
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user