修改游戏底层矩阵相关

This commit is contained in:
2025-10-26 14:38:53 +08:00
parent dc0213dc16
commit 88f039348a
50 changed files with 1983 additions and 362 deletions

View File

@@ -45,8 +45,8 @@ void Animation::Init(std::string AniPath)
FrameObj.Img_Path = AdditionalOptions(FrameObj.Img_Path, this->AdditionalOptionsData);
}
SpriteObj = new Sprite(FrameObj.Img_Path, FrameObj.Img_Index);
SpriteObj->SetAnchor(VecFPos(0.5f, 0.5f));
SpriteObj->SetPos(VecFPos(FrameObj.Img_Pos.x, FrameObj.Img_Pos.y));
SpriteObj->SetAnchor(Vec2(0.5f, 0.5f));
SpriteObj->SetPos(Vec2(FrameObj.Img_Pos.x, FrameObj.Img_Pos.y));
SpriteObj->SetVisible(false);
}
else
@@ -191,8 +191,8 @@ void Animation::FlushFrame(int Index)
// 缩放
if (FlagBuf.count("IMAGE_RATE"))
{
VecFPos Rate = std::get<VecFPos>(FlagBuf["IMAGE_RATE"]);
CurrentFrame->SetScale(VecFPos{Rate.x, Rate.y});
Vec2 Rate = std::get<Vec2>(FlagBuf["IMAGE_RATE"]);
CurrentFrame->SetScale(Vec2{Rate.x, Rate.y});
}
// 线性减淡
if (FlagBuf.count("GRAPHIC_EFFECT_LINEARDODGE"))
@@ -202,7 +202,7 @@ void Animation::FlushFrame(int Index)
// 旋转
if (FlagBuf.count("IMAGE_ROTATE"))
{
CurrentFrame->SetAnchor(VecFPos{0.5f, 0.5f});
CurrentFrame->SetAnchor(Vec2{0.5f, 0.5f});
CurrentFrame->SetRotation(std::get<float>(FlagBuf["IMAGE_ROTATE"]));
}
// 染色
@@ -277,27 +277,27 @@ void Animation::InterpolationLogic()
}
// 坐标
{
VecFPos PosData = {
Vec2 PosData = {
(OldData.Img_Pos.x + (NewData.Img_Pos.x - OldData.Img_Pos.x) * InterRate),
(OldData.Img_Pos.y + (NewData.Img_Pos.y - OldData.Img_Pos.y) * InterRate)};
CurrentFrame->SetPos(PosData);
}
// 缩放
{
VecFPos OldRateData = {1.0f, 1.0f};
VecFPos NewRateData = {1.0f, 1.0f};
Vec2 OldRateData = {1.0f, 1.0f};
Vec2 NewRateData = {1.0f, 1.0f};
if (OldData.Flag.count("IMAGE_RATE"))
{
OldRateData = std::get<VecFPos>(OldData.Flag["IMAGE_RATE"]);
OldRateData = std::get<Vec2>(OldData.Flag["IMAGE_RATE"]);
}
if (NewData.Flag.count("IMAGE_RATE"))
{
NewRateData = std::get<VecFPos>(NewData.Flag["IMAGE_RATE"]);
NewRateData = std::get<Vec2>(NewData.Flag["IMAGE_RATE"]);
}
VecFPos RateData = {
Vec2 RateData = {
OldRateData.x + (NewRateData.x - OldRateData.x) * InterRate,
OldRateData.y + (NewRateData.y - OldRateData.y) * InterRate};
CurrentFrame->SetAnchor(VecFPos{0.5f, 0.5f});
CurrentFrame->SetAnchor(Vec2{0.5f, 0.5f});
CurrentFrame->SetScale(RateData);
}
// 旋转

View File

@@ -0,0 +1,104 @@
#include "NumberText.h"
void NumberText::PreloadDigits()
{
// 需要支持的字符0-9和负号
const std::string digits = "0123456789-";
for (char c : digits)
{
std::string charStr(1, c);
// 渲染单个字符为纹理
SDL_Surface *surface = TTF_RenderUTF8_Blended(m_font, charStr.c_str(), m_color);
if (!surface)
{
SDL_LogError(0, "数字字符渲染数字字符失败:%s", TTF_GetError());
continue;
}
// 转换为RGBA格式
SDL_Surface *rgbaSurface = SDL_ConvertSurfaceFormat(surface, SDL_PIXELFORMAT_ABGR8888, 0);
SDL_FreeSurface(surface);
// 创建纹理并缓存
Texture *tex = new Texture();
tex->Init(rgbaSurface);
SDL_FreeSurface(rgbaSurface);
m_digitTextures[c] = tex;
}
}
void NumberText::UpdateDigitSprites(const std::string &numStr)
{
// // 先释放旧的精灵
// for (auto *sprite : m_digitSprites)
// {
// if (sprite)
// {
// delete sprite;
// }
// }
// m_digitSprites.clear();
// // 计算总宽度(用于居中或左对齐)
// int totalWidth = 0;
// std::vector<int> charWidths; // 记录每个字符的宽度
// for (char c : numStr)
// {
// auto it = m_digitTextures.find(c);
// if (it == m_digitTextures.end())
// continue; // 跳过不支持的字符
// int w = it->second->getSize().width;
// totalWidth += w;
// charWidths.push_back(w);
// }
// // 绘制每个字符(从左到右排列)
// float currentX = GetWorldPos().x; // 基于当前位置排列
// float currentY = GetWorldPos().y;
// int index = 0;
// for (char c : numStr)
// {
// auto it = m_digitTextures.find(c);
// if (it == m_digitTextures.end())
// continue;
// // 创建字符精灵
// Sprite *sprite = new Sprite();
// sprite->SetTexture(it->second);
// sprite->SetPosition(Vec2(currentX, currentY));
// sprite->SetSize(it->second->getSize());
// m_digitSprites.push_back(sprite);
// // 移动到下一个字符的位置预留1px间距
// currentX += charWidths[index] + 1;
// index++;
// }
}
NumberText::NumberText(TTF_Font *font, SDL_Color color) : m_font(font), m_color(color)
{
PreloadDigits();
}
NumberText::~NumberText()
{
}
void NumberText::SetNumber(int number)
{
if (number == m_currentNumber)
return; // 数字未变化则跳过
m_currentNumber = number;
// 转换数字为字符串(处理负数)
std::string numStr = std::to_string(number);
UpdateDigitSprites(numStr); // 更新数字精灵布局
}
void NumberText::Render()
{
// for (auto *sprite : m_digitSprites)
// {
// if (sprite)
// sprite->Render();
// }
}

View File

@@ -0,0 +1,44 @@
#pragma once
#include "EngineFrame/Component/Text.h"
#include "EngineCore/Game.h"
#include "EngineFrame/Render/RenderManager.h"
#include <string>
#include <unordered_map>
#include <vector>
// 数字文本类,高效处理数字更新
class NumberText : public Text
{
private:
// 字体
TTF_Font *m_font;
// 文本颜色
SDL_Color m_color;
// 当前数字
int m_currentNumber = 0;
// 数字字符纹理缓存('0'-'9'和'-'
std::unordered_map<char, RefPtr<Texture>> m_digitTextures;
// 当前数字的字符精灵列表
std::vector<Sprite *> m_digitSprites;
// 预加载0-9和负号的纹理
void PreloadDigits();
// 更新数字精灵(根据新数字字符串重新排列字符)
void UpdateDigitSprites(const std::string &numStr);
public:
// 构造函数:指定字体、颜色和字符尺寸
NumberText(TTF_Font *font, SDL_Color color);
~NumberText();
// 设置数字(核心方法:仅更新变化的数字部分)
void SetNumber(int number);
int GetNumber() const { return m_currentNumber; }
// 重写Render绘制所有数字字符
void Render() override;
};

View File

@@ -40,13 +40,13 @@ void RenderBase::Render()
Component::Render();
}
void RenderBase::SetIterationPos(VecFPos pos)
void RenderBase::SetIterationPos(Vec2 pos)
{
Component::SetIterationPos(pos);
CalcRenderInfo(); // 更新渲染信息
}
void RenderBase::SetIterationScale(VecFPos scale)
void RenderBase::SetIterationScale(Vec2 scale)
{
Component::SetIterationScale(scale);
CalcRenderInfo(); // 更新渲染信息
@@ -60,14 +60,14 @@ void RenderBase::SetIterationRotation(float angle)
CalcRenderInfo(); // 更新渲染信息
}
void RenderBase::SetPos(VecFPos pos)
void RenderBase::SetPos(Vec2 pos)
{
Component::SetPos(pos);
CalcRenderInfo(); // 更新渲染信息
}
void RenderBase::SetScale(VecFPos scale)
void RenderBase::SetScale(Vec2 scale)
{
Component::SetScale(scale);
CalcRenderInfo(); // 更新渲染信息
@@ -79,7 +79,7 @@ void RenderBase::SetRotation(float angle)
CalcRenderInfo(); // 更新渲染信息
}
void RenderBase::SetAnchor(VecFPos anchor)
void RenderBase::SetAnchor(Vec2 anchor)
{
Component::SetAnchor(anchor);
CalcRenderInfo(); // 更新渲染信息

View File

@@ -1,7 +1,6 @@
#pragma once
#include "EngineFrame/Component/Component.h"
#include "Tool/TransformT.h"
class RenderBase : public Component
{
@@ -15,11 +14,13 @@ public:
// 翻转Flag
SDL_RendererFlip flip = SDL_FLIP_NONE;
// 锚点坐标
VecFPos AnchorPos;
Vec2 AnchorPos;
// 是否显示
bool Visible = true;
// 是否在屏幕内
bool IsInScreen = false;
//渲染矩阵
GlMatrix RenderMatrix;
};
public:
@@ -35,20 +36,20 @@ public:
public:
public:
// 设置迭代的坐标
void SetIterationPos(VecFPos pos) override;
void SetIterationPos(Vec2 pos) override;
// 设置迭代的缩放
void SetIterationScale(VecFPos scale) override;
void SetIterationScale(Vec2 scale) override;
// 设置迭代的旋转角度
void SetIterationRotation(float angle) override;
// 设置坐标
void SetPos(VecFPos pos) override;
void SetPos(Vec2 pos) override;
// 设置缩放
void SetScale(VecFPos scale) override;
void SetScale(Vec2 scale) override;
// 设置旋转角度
void SetRotation(float angle) override;
// 设置中心点
void SetAnchor(VecFPos anchor) override;
void SetAnchor(Vec2 anchor) override;
// 计算渲染信息
void CalcRenderInfo() override;

View File

@@ -43,6 +43,35 @@ RefPtr<Texture> Sprite::GetTexture()
return m_texture;
}
GlMatrix Sprite::matrix3x2ToGLMatrix(const Matrix3x2 &mat)
{
return {
// 列0x轴线性变换
mat._11, // [0][0]
mat._12, // [1][0]
0.0f, // [2][0]
0.0f, // [3][0]
// 列1y轴线性变换
mat._21, // [0][1]
mat._22, // [1][1]
0.0f, // [2][1]
0.0f, // [3][1]
// 列2z轴固定
0.0f, // [0][2]
0.0f, // [1][2]
1.0f, // [2][2]
0.0f, // [3][2]
// 列3平移
mat._31, // [0][3]x平移
mat._32, // [1][3]y平移
0.0f, // [2][3]
1.0f // [3][3]
};
}
void Sprite::CalcRenderInfoLogic()
{
// 获取至在最终的父对象检查是否显示
@@ -151,7 +180,9 @@ void Sprite::Render()
if (_RenderGuidanceInfo.IsInScreen && _RenderGuidanceInfo.Visible)
{
SDL_FPoint AnchorPos = _RenderGuidanceInfo.AnchorPos;
SDL_FPoint AnchorPos;
AnchorPos.x = _RenderGuidanceInfo.AnchorPos.x;
AnchorPos.y = _RenderGuidanceInfo.AnchorPos.y;
// 混合
if (this->_BlendMode != NONE)
@@ -163,8 +194,6 @@ void Sprite::Render()
// 还原混合
if (this->_BlendMode != NONE)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Game::GetInstance().m_RenderCount++;
}
}
@@ -172,10 +201,7 @@ void Sprite::Clear()
{
}
void Sprite::SetBlendMode(LE_BlEND_MODE mode)
{
this->_BlendMode = mode;
}
void Sprite::Blend()
{
@@ -186,8 +212,3 @@ void Sprite::Blend()
break;
}
}
LE_BlEND_MODE Sprite::GetBlendMode()
{
return this->_BlendMode;
}

View File

@@ -29,19 +29,17 @@ public:
public:
// 渲染信息
RenderGuidanceInfo _RenderGuidanceInfo;
// 混合模式
LE_BlEND_MODE _BlendMode = NONE;
std::string imgPath;
int Index;
Matrix3x2 transform_matrix_;
GlMatrix matrix3x2ToGLMatrix(const Matrix3x2 &mat);
public:
// 计算渲染信息
void CalcRenderInfoLogic();
// 设置混合模式
void SetBlendMode(LE_BlEND_MODE mode);
// 混合
void Blend();
// 获取混合模式
LE_BlEND_MODE GetBlendMode();
};