first
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
//
|
||||
// Created by Administrator on 2025/2/16.
|
||||
//
|
||||
|
||||
#ifndef AIRI_DESKTOPGRIL_TEXTRENDERER_H
|
||||
#define AIRI_DESKTOPGRIL_TEXTRENDERER_H
|
||||
|
||||
#include <QOpenGLWidget>
|
||||
#include <QVector>
|
||||
#include <QString>
|
||||
#include <QColor>
|
||||
#include <QElapsedTimer>
|
||||
#include <QVector2D>
|
||||
#include <QFontMetrics>
|
||||
#include <QLinearGradient>
|
||||
|
||||
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<QPoint> charPositions; // 字符位置
|
||||
QList<int> 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<TextInstance> activeTexts; /// 当前显示的文字
|
||||
QElapsedTimer globalTimer; /// 全局计时器
|
||||
QFont font; /// 全局字体
|
||||
int windowWidth; /// 窗口宽度
|
||||
int windowHeight; /// 窗口高度
|
||||
qint64 lastFrameTime; /// 上一帧的时间
|
||||
|
||||
// 一些自定义参数
|
||||
float defaultHoldDuration; /// 默认停留时间(秒)
|
||||
float gravity; /// 重力加速度(像素/秒²)
|
||||
float dampFactor; /// 碰撞阻尼系数
|
||||
};
|
||||
|
||||
#endif //AIRI_DESKTOPGRIL_TEXTRENDERER_H
|
||||
Reference in New Issue
Block a user