ShitEngine
基于 C++20 与 SDL3 的轻量级 2D 游戏引擎
载入中...
搜索中...
未找到
Renderer.h
浏览该文件的文档.
1#pragma once
2
3#include <memory>
4#include <optional>
5#include <SDL3/SDL_render.h>
6#include <SDL3/SDL_timer.h>
7
8#include "../Core/Core.h"
9#include "../Math.h"
10
11namespace Shit {
12 class Sprite;
13 class CameraComponent;
14
21 class SHIT_API Renderer final {
22 public:
23 Renderer(const Renderer&) = delete;
24 Renderer& operator=(const Renderer&) = delete;
25 Renderer(Renderer&&) = delete;
27
28 // --- 静态API ---
30 static bool Init() { return GetInstance().init(); }
31 static void Destroy() { GetInstance().m_renderer.reset(); }
32 static void ClearScreen() { GetInstance().clearScreen(); }
33 static void Present() { GetInstance().present(); }
34 static SDL_Renderer* GetRenderer() { return GetInstance().m_renderer.get(); }
35
42 static bool ReadPixels(void* pixels, int pitch) { return GetInstance().readPixels(pixels, pitch); }
43
49 static bool BeginOffscreen() { return GetInstance().beginOffscreen(); }
50 static void EndOffscreen() { GetInstance().endOffscreen(); }
51
52 static int GetLogicalWidth() { return GetInstance().m_logicalWidth; }
53 static int GetLogicalHeight() { return GetInstance().m_logicalHeight; }
54
61 static void DrawSprite(const Sprite& sprite, const Vector2& position, const std::optional<Vector2>& size = std::nullopt);
62
63 // --- 绘制原语(封装 SDL3 绘制 API,供 UI / HUD 使用)---
64 static void SetDrawColor(const Color& color);
65 static void FillRect(const SDL_FRect& rect);
66 static void SetClipRect(const SDL_Rect* rect);
67 static void ClearClipRect();
68 static void SetViewport(const SDL_Rect* viewport);
69 static void ClearViewport();
70 static void DrawTexture(SDL_Texture* texture, const SDL_FRect* src, const SDL_FRect& dst);
71 static void DrawTextureRotated(SDL_Texture* texture, const SDL_FRect* src, const SDL_FRect& dst,
72 double angle, const SDL_FPoint* center, SDL_FlipMode flip);
73 static void RenderCoordinatesToWindow(float x, float y, float* winX, float* winY);
74 static SDL_Texture* CreateTextureFromSurface(SDL_Surface* surface);
75
76 private:
77 friend class EngineContext;
78 Renderer() = default;
79 ~Renderer() = default;
80
81 bool init();
82 void clearScreen();
83 void present();
84 bool readPixels(void* pixels, int pitch);
85 bool beginOffscreen();
86 void endOffscreen();
87
89 SDL_Renderer* raw() const { return m_renderer ? m_renderer.get() : nullptr; }
90
91 struct SDLRendererDeleter {
92 void operator()(SDL_Renderer* renderer) const {
93 if (renderer) SDL_DestroyRenderer(renderer);
94 }
95 };
96
97 std::unique_ptr<SDL_Renderer, SDLRendererDeleter> m_renderer;
98 int m_logicalWidth = 1280;
99 int m_logicalHeight = 720;
100
101 struct SDLTextureDeleter {
102 void operator()(SDL_Texture* texture) const {
103 if (texture) SDL_DestroyTexture(texture);
104 }
105 };
106 std::unique_ptr<SDL_Texture, SDLTextureDeleter> m_offscreenTarget;
107 };
108}
#define SHIT_API
定义 Core.h:14
相机组件,定义"从哪个角度观察世界"
定义 CameraComponent.h:16
static void ClearScreen()
清屏(每帧开头调用)
定义 Renderer.h:32
static bool BeginOffscreen()
开始离屏渲染到逻辑尺寸(1280×720)目标纹理(编辑器预览用) 之后 SceneManager::Update 的渲染进该纹理;ReadPixels 读出逻辑尺寸像素, 与相机坐标空间一致(不受窗口...
定义 Renderer.h:49
Renderer & operator=(Renderer &&)=delete
Renderer(Renderer &&)=delete
static void DrawTextureRotated(SDL_Texture *texture, const SDL_FRect *src, const SDL_FRect &dst, double angle, const SDL_FPoint *center, SDL_FlipMode flip)
旋转/翻转绘制(SDL_RenderTextureRotated)
Renderer & operator=(const Renderer &)=delete
static SDL_Renderer * GetRenderer()
获取原生 SDL_Renderer
定义 Renderer.h:34
static void ClearClipRect()
清除裁剪矩形
static void SetDrawColor(const Color &color)
设置绘制颜色(SDL_SetRenderDrawColor)
static void DrawSprite(const Sprite &sprite, const Vector2 &position, const std::optional< Vector2 > &size=std::nullopt)
在屏幕坐标直接绘制精灵(UI 场景用)
static void SetViewport(const SDL_Rect *viewport)
设置视口(传 nullptr 恢复全屏)
static void Destroy()
析构渲染器(必须在 SDL_Quit 之前调用)
定义 Renderer.h:31
static Renderer & GetInstance()
Renderer(const Renderer &)=delete
static void DrawTexture(SDL_Texture *texture, const SDL_FRect *src, const SDL_FRect &dst)
绘制纹理(SDL_RenderTexture)
static void RenderCoordinatesToWindow(float x, float y, float *winX, float *winY)
逻辑坐标 → 窗口物理像素坐标
static void ClearViewport()
恢复全屏视口
static void FillRect(const SDL_FRect &rect)
实心矩形(SDL_RenderFillRect)
static int GetLogicalWidth()
逻辑分辨率宽度
定义 Renderer.h:52
static void Present()
交换缓冲区(每帧末尾调用)
定义 Renderer.h:33
static SDL_Texture * CreateTextureFromSurface(SDL_Surface *surface)
surface → texture(SDL_CreateTextureFromSurface)
friend class EngineContext
定义 Renderer.h:77
static void SetClipRect(const SDL_Rect *rect)
设置裁剪矩形(传 nullptr 清除)
static int GetLogicalHeight()
逻辑分辨率高度
定义 Renderer.h:53
static void EndOffscreen()
定义 Renderer.h:50
static bool Init()
初始化渲染器
定义 Renderer.h:30
static bool ReadPixels(void *pixels, int pitch)
读取渲染缓冲像素(离屏渲染/编辑器预览用)
定义 Renderer.h:42
精灵数据,描述"画什么"
定义 Sprite.h:14
定义 AudioPlayer.h:10
glm::vec2 Vector2
定义 Math.h:5
RGBA 颜色(每通道 8 位)
定义 Core.h:26