// ============================================================================ // Bird.h - 小鸟类 // 描述: 玩家控制的小鸟角色,包含飞行动画和物理效果 // ============================================================================ #pragma once #include namespace flappybird { /** * @brief 小鸟类 * 游戏主角,包含飞行动画、重力模拟和状态管理 */ class Bird : public extra2d::Node { public: /** * @brief 小鸟状态枚举 */ enum class Status { Still, // 静止不动 Idle, // 上下浮动(菜单展示) StartToFly, // 开始飞行 Fly // 飞行中 }; /** * @brief 构造函数 */ Bird(); /** * @brief 析构函数 */ ~Bird(); /** * @brief 每帧更新 * @param dt 时间间隔(秒) */ void onUpdate(float dt) override; /** * @brief 渲染小鸟 * @param renderer 渲染后端 */ void onRender(extra2d::Renderer &renderer) override; /** * @brief 进入场景时调用 */ void onEnter() override; /** * @brief 模拟下落 * @param dt 时间间隔(秒) */ void fall(float dt); /** * @brief 跳跃 */ void jump(); /** * @brief 死亡 */ void die(); /** * @brief 设置小鸟状态 * @param status 新状态 */ void setStatus(Status status); /** * @brief 获取当前状态 * @return 当前状态 */ Status getStatus() const { return status_; } /** * @brief 检查是否存活 * @return 是否存活 */ bool isLiving() const { return living_; } /** * @brief 获取边界框(用于碰撞检测) * @return 边界框 */ extra2d::Rect boundingBox() const override; private: /** * @brief 初始化动画 */ void initAnimations(); /** * @brief 更新帧动画 */ void updateFrameAnimation(float dt); /** * @brief 设置当前帧 */ void setCurrentFrame(int frameIndex); bool living_ = true; // 是否存活 float speed_ = 0.0f; // 垂直速度 float rotation_ = 0.0f; // 旋转角度 Status status_ = Status::Idle; // 当前状态 // 动画相关 extra2d::Ptr sprite_; // 精灵 std::vector> frames_; // 动画帧 int currentFrame_ = 0; // 当前帧索引 float frameTimer_ = 0.0f; // 帧计时器 float frameInterval_ = 0.1f; // 帧间隔(秒) float idleTimer_ = 0.0f; // 闲置动画计时器 float idleOffset_ = 0.0f; // 闲置偏移量 // 物理常量 static constexpr float gravity = 1440.0f; // 重力加速度 static constexpr float jumpSpeed = 432.0f; // 跳跃初速度 }; } // namespace flappybird