// // Created by Administrator on 2025/2/16. // #ifndef AIRI_DESKTOPGRIL_TEXTRENDERER_H #define AIRI_DESKTOPGRIL_TEXTRENDERER_H #include #include #include #include #include #include #include #include class TextRenderer { public: // 删除拷贝构造函数和赋值运算符 TextRenderer(const TextRenderer&) = delete; void operator=(const TextRenderer&) = delete; // 获取单例实例 static TextRenderer* getInstance() { if(instance == nullptr){ instance = new TextRenderer(); } return instance; } struct TextInstance { QString text; // 文本内容 QVector2D basePosition; // 基础位置(Y轴) QColor primaryColor; // 主要文字颜色 QColor outlineColor; // 轮廓颜色 float duration; // 显示总时长(秒) qint64 startTime; // 开始显示时间(毫秒) bool isDropping; // 是否正在下坠 qint64 dropStartTime; // 下坠开始时间 float dropYVelocity; // Y轴下落速度 float alpha; // 透明度 QList charPositions; // 字符位置 QList charWidths; // 每个字符宽度 int visibleChars; // 可见字符数 bool flowCompleted; // 流式显示是否完成 float holdDuration; // 实际使用的停留时间 qint64 flowEndTime; // 流式完成时间戳 TextInstance() : isDropping(false), dropYVelocity(0.0f), alpha(1.0f), visibleChars(0), flowCompleted(false), holdDuration(0.5f), flowEndTime(0) {} }; void setWindowSize(int w, int h); void addText(const QString &text, float yPos, const QColor &color, float duration); void update(); void render(); void setGlobalFont(const QFont &newFont); /** * 参数建议值: 效果类型 gravity dampFactor holdDuration 柔和下落 600.0f 0.85f 1.0f 快速坠落 1200.0f 0.6f 0.3f 弹性效果 900.0f 0.75f 0.8f 真实物理模拟 980.0f 0.82f 0.5f */ void setHoldDuration(const float seconds) { defaultHoldDuration = seconds; } void setGravity(const float g) { gravity = g; } void setDampFactor(const float damp) { dampFactor = damp; } // 释放单例 static void releaseInstance() { if (instance) { delete instance; instance = nullptr; } } private: explicit TextRenderer(); // 构造函数私有化 void updateFlowPositions(TextInstance &instance); void updateDropPositions(TextInstance &instance, float deltaTime); private: static TextRenderer *instance; QList activeTexts; /// 当前显示的文字 QElapsedTimer globalTimer; /// 全局计时器 QFont font; /// 全局字体 int windowWidth; /// 窗口宽度 int windowHeight; /// 窗口高度 qint64 lastFrameTime; /// 上一帧的时间 // 一些自定义参数 float defaultHoldDuration; /// 默认停留时间(秒) float gravity; /// 重力加速度(像素/秒²) float dampFactor; /// 碰撞阻尼系数 }; #endif //AIRI_DESKTOPGRIL_TEXTRENDERER_H