Extra2D/Extra2D/include/extra2d/scene/scene.h

90 lines
2.6 KiB
C++

#pragma once
#include <extra2d/core/color.h>
#include <extra2d/render/camera.h>
#include <extra2d/scene/node.h>
#include <extra2d/spatial/spatial_manager.h>
#include <vector>
namespace extra2d {
class Renderer;
// ============================================================================
// 场景类 - 节点容器,管理整个场景图
// ============================================================================
class Scene : public Node {
public:
Scene();
~Scene() override = default;
// 场景属性
void setBackgroundColor(const Color& color) { backgroundColor_ = color; }
Color getBackgroundColor() const { return backgroundColor_; }
// 摄像机
void setCamera(Ref<Camera> camera);
Ref<Camera> getCamera() const { return camera_; }
Camera* getActiveCamera() const {
return camera_ ? camera_.get() : defaultCamera_.get();
}
// 视口和尺寸
void setViewportSize(float width, float height);
void setViewportSize(const Size& size);
Size getViewportSize() const { return viewportSize_; }
float getWidth() const { return viewportSize_.width; }
float getHeight() const { return viewportSize_.height; }
// 场景状态
bool isPaused() const { return paused_; }
void pause() { paused_ = true; }
void resume() { paused_ = false; }
// 渲染和更新
void renderScene(Renderer& renderer);
virtual void renderContent(Renderer& renderer);
void updateScene(float dt);
// 空间索引系统
SpatialManager& getSpatialManager() { return spatialManager_; }
const SpatialManager& getSpatialManager() const { return spatialManager_; }
void setSpatialIndexingEnabled(bool enabled) {
spatialIndexingEnabled_ = enabled;
}
bool isSpatialIndexingEnabled() const { return spatialIndexingEnabled_; }
void updateNodeInSpatialIndex(Node* node, const Rect& oldBounds, const Rect& newBounds);
void removeNodeFromSpatialIndex(Node* node);
std::vector<Node*> queryNodesInArea(const Rect& area) const;
std::vector<Node*> queryNodesAtPoint(const Vec2& point) const;
std::vector<std::pair<Node*, Node*>> queryCollisions() const;
// 静态创建方法
static Ref<Scene> create();
protected:
void onEnter() override;
void onExit() override;
friend class SceneManager;
private:
Color backgroundColor_ = Colors::Black;
Size viewportSize_ = Size::Zero();
Ref<Camera> camera_;
Ref<Camera> defaultCamera_;
bool paused_ = false;
SpatialManager spatialManager_;
bool spatialIndexingEnabled_ = true;
};
} // namespace extra2d