Files
SunnyLand/src/game/scene/game_scene.h
T
2025-06-16 14:44:47 +08:00

63 lines
2.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#pragma once
#include "../../engine/scene/scene.h"
#include <memory>
#include <glm/vec2.hpp>
// 前置声明
namespace engine::object {
class GameObject;
}
namespace game::data {
class SessionData;
}
namespace game::scene {
/**
* @brief 主要的游戏场景,包含玩家、敌人、关卡元素等。
*/
class GameScene final: public engine::scene::Scene {
std::shared_ptr<game::data::SessionData> game_session_data_; ///< @brief 场景间共享数据,因此用shared_ptr
engine::object::GameObject* player_ = nullptr; ///< @brief 保存玩家对象的指针,方便访问
public:
GameScene(engine::core::Context& context,
engine::scene::SceneManager& scene_manager,
std::shared_ptr<game::data::SessionData> data = nullptr);
// 覆盖场景基类的核心方法
void init() override;
void update(float delta_time) override;
void render() override;
void handleInput() override;
void clean() override;
private:
[[nodiscard]] bool initLevel(); ///< @brief 初始化关卡
[[nodiscard]] bool initPlayer(); ///< @brief 初始化玩家
[[nodiscard]] bool initEnemyAndItem(); ///< @brief 初始化敌人和道具
void handleObjectCollisions(); ///< @brief 处理游戏对象间的碰撞逻辑(从PhysicsEngine获取信息)
void handleTileTriggers(); ///< @brief 处理瓦片触发事件(从PhysicsEngine获取信息)
void handlePlayerDamage(int damage); ///< @brief 处理玩家受伤(更新得分、UI等)
void playerVSEnemyCollision(engine::object::GameObject* player, engine::object::GameObject* enemy); ///< @brief 玩家与敌人碰撞处理
void playerVSItemCollision(engine::object::GameObject* player, engine::object::GameObject* item); ///< @brief 玩家与道具碰撞处理
void toNextLevel(engine::object::GameObject* trigger); ///< @brief 进入下一个关卡
/// @brief 根据关卡名称获取对应的地图文件路径
std::string levelNameToPath(const std::string& level_name) const { return "assets/maps/" + level_name + ".tmj"; }
/**
* @brief 创建一个特效对象(一次性)。
* @param center_pos 特效中心位置
* @param tag 特效标签(决定特效类型,例如"enemy","item")
*/
void createEffect(const glm::vec2& center_pos, const std::string& tag);
// 测试函数
void testTextRenderer();
};
} // namespace game::scene