修改游戏底层矩阵相关
This commit is contained in:
@@ -1,4 +1,14 @@
|
||||
#include "BaseNode.h"
|
||||
#include "EngineCore/Game.h"
|
||||
BaseNode::BaseNode()
|
||||
{
|
||||
Game::GetInstance().m_nodeCount++;
|
||||
}
|
||||
|
||||
BaseNode::~BaseNode()
|
||||
{
|
||||
Game::GetInstance().m_nodeCount--;
|
||||
}
|
||||
|
||||
void BaseNode::Init()
|
||||
{
|
||||
@@ -67,7 +77,7 @@ void BaseNode::SetCallbackOnUpdate(const UpdateCallback &cb)
|
||||
|
||||
void BaseNode::SetChildIterationTransform()
|
||||
{
|
||||
TransformT n_transform;
|
||||
Transform n_transform;
|
||||
n_transform.position = transform.position + transformIter.position;
|
||||
n_transform.scale = transform.scale * transformIter.scale;
|
||||
n_transform.rotation = transform.rotation + transformIter.rotation;
|
||||
@@ -147,7 +157,7 @@ void BaseNode::AddChild(RefPtr<BaseNode> child)
|
||||
// 如果组件有transform标签,则设置其位置
|
||||
if (child->hasTag(Tag::TRANSFORM))
|
||||
{
|
||||
TransformT n_transform;
|
||||
Transform n_transform;
|
||||
n_transform.position = transform.position + transformIter.position;
|
||||
n_transform.scale = transform.scale * transformIter.scale;
|
||||
n_transform.rotation = transform.rotation + transformIter.rotation;
|
||||
@@ -172,7 +182,7 @@ void BaseNode::OnAdded(BaseNode *node)
|
||||
m_Parent = node;
|
||||
}
|
||||
|
||||
void BaseNode::SetIterationTransform(TransformT n_transform)
|
||||
void BaseNode::SetIterationTransform(Transform n_transform)
|
||||
{
|
||||
if (n_transform == transformIter)
|
||||
return;
|
||||
@@ -181,12 +191,12 @@ void BaseNode::SetIterationTransform(TransformT n_transform)
|
||||
SetChildIterationTransform();
|
||||
}
|
||||
|
||||
TransformT BaseNode::GetIterationTransform()
|
||||
Transform BaseNode::GetIterationTransform()
|
||||
{
|
||||
return transformIter;
|
||||
}
|
||||
|
||||
void BaseNode::SetTransform(TransformT n_transform)
|
||||
void BaseNode::SetTransform(Transform n_transform)
|
||||
{
|
||||
if (n_transform == transform)
|
||||
return;
|
||||
@@ -195,12 +205,12 @@ void BaseNode::SetTransform(TransformT n_transform)
|
||||
SetChildIterationTransform();
|
||||
}
|
||||
|
||||
TransformT BaseNode::GetTransform()
|
||||
Transform BaseNode::GetTransform()
|
||||
{
|
||||
return transform;
|
||||
}
|
||||
|
||||
void BaseNode::SetPos(VecFPos pos)
|
||||
void BaseNode::SetPos(Vec2 pos)
|
||||
{
|
||||
if (pos == this->transform.position)
|
||||
return;
|
||||
@@ -209,17 +219,17 @@ void BaseNode::SetPos(VecFPos pos)
|
||||
SetChildIterationTransform();
|
||||
}
|
||||
|
||||
VecFPos BaseNode::GetPos()
|
||||
Vec2 BaseNode::GetPos()
|
||||
{
|
||||
return this->transform.position;
|
||||
}
|
||||
|
||||
VecFPos BaseNode::GetWorldPos()
|
||||
Vec2 BaseNode::GetWorldPos()
|
||||
{
|
||||
return this->transform.position + this->transformIter.position;
|
||||
}
|
||||
|
||||
void BaseNode::SetScale(VecFPos scale)
|
||||
void BaseNode::SetScale(Vec2 scale)
|
||||
{
|
||||
if (scale == this->transform.scale)
|
||||
return;
|
||||
@@ -228,7 +238,7 @@ void BaseNode::SetScale(VecFPos scale)
|
||||
SetChildIterationTransform();
|
||||
}
|
||||
|
||||
VecFPos BaseNode::GetScale()
|
||||
Vec2 BaseNode::GetScale()
|
||||
{
|
||||
return this->transform.scale;
|
||||
}
|
||||
@@ -247,7 +257,7 @@ float BaseNode::GetRotation()
|
||||
return this->transform.rotation;
|
||||
}
|
||||
|
||||
void BaseNode::SetAnchor(VecFPos anchor)
|
||||
void BaseNode::SetAnchor(Vec2 anchor)
|
||||
{
|
||||
if (anchor == this->Anchor)
|
||||
return;
|
||||
@@ -255,9 +265,9 @@ void BaseNode::SetAnchor(VecFPos anchor)
|
||||
Anchor.y = anchor.y;
|
||||
}
|
||||
|
||||
VecFPos BaseNode::GetAnchor()
|
||||
Vec2 BaseNode::GetAnchor()
|
||||
{
|
||||
VecFPos P;
|
||||
Vec2 P;
|
||||
P.x = Anchor.x;
|
||||
P.y = Anchor.y;
|
||||
return P;
|
||||
@@ -298,7 +308,7 @@ float BaseNode::GetAlpha()
|
||||
return this->Alpha;
|
||||
}
|
||||
|
||||
void BaseNode::SetIterationPos(VecFPos pos)
|
||||
void BaseNode::SetIterationPos(Vec2 pos)
|
||||
{
|
||||
if (pos == this->transformIter.position)
|
||||
return;
|
||||
@@ -307,12 +317,12 @@ void BaseNode::SetIterationPos(VecFPos pos)
|
||||
SetChildIterationTransform();
|
||||
}
|
||||
|
||||
VecFPos BaseNode::GetIterationPos()
|
||||
Vec2 BaseNode::GetIterationPos()
|
||||
{
|
||||
return this->transformIter.position;
|
||||
}
|
||||
|
||||
void BaseNode::SetIterationScale(VecFPos scale)
|
||||
void BaseNode::SetIterationScale(Vec2 scale)
|
||||
{
|
||||
if (scale == this->transformIter.scale)
|
||||
return;
|
||||
@@ -321,7 +331,7 @@ void BaseNode::SetIterationScale(VecFPos scale)
|
||||
SetChildIterationTransform();
|
||||
}
|
||||
|
||||
VecFPos BaseNode::GetIterationScale()
|
||||
Vec2 BaseNode::GetIterationScale()
|
||||
{
|
||||
return this->transformIter.scale;
|
||||
}
|
||||
@@ -339,3 +349,13 @@ float BaseNode::GetIterationRotation()
|
||||
{
|
||||
return this->transformIter.rotation;
|
||||
}
|
||||
|
||||
void BaseNode::SetBlendMode(LE_BlEND_MODE mode)
|
||||
{
|
||||
this->_BlendMode = mode;
|
||||
}
|
||||
|
||||
LE_BlEND_MODE BaseNode::GetBlendMode()
|
||||
{
|
||||
return this->_BlendMode;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,9 @@
|
||||
#include "Tool/RefPtr.h"
|
||||
#include "Tool/IntrusiveList.hpp"
|
||||
#include "Tool/TagGed.h"
|
||||
#include "Tool/TransformT.h"
|
||||
#include "math/Transform.hpp"
|
||||
#include "math/Math.h"
|
||||
using namespace ember;
|
||||
class BaseNode : public RefObject, public TagGed, protected IntrusiveListValue<RefPtr<BaseNode>>
|
||||
{
|
||||
|
||||
@@ -28,23 +30,25 @@ public:
|
||||
// 渲染层级
|
||||
int m_RenderZOrder = 0;
|
||||
// 二维仿射变换
|
||||
TransformT transform;
|
||||
Transform transform;
|
||||
// 迭代的二维仿射变换
|
||||
TransformT transformIter;
|
||||
Transform transformIter;
|
||||
// 锚点
|
||||
VecFPos Anchor = {0.f, 0.f};
|
||||
Vec2 Anchor = {0.f, 0.f};
|
||||
// 大小
|
||||
VecSize Size = {0, 0};
|
||||
// 透明度
|
||||
float Alpha = 1.f;
|
||||
// 混合模式
|
||||
LE_BlEND_MODE _BlendMode = NONE;
|
||||
// 是否显示
|
||||
bool Visible = true;
|
||||
// 计算渲染信息Flag (为了保证每帧只计算一次)
|
||||
bool CalcRenderInfoFlag = true;
|
||||
|
||||
public:
|
||||
BaseNode(/* args */) = default;
|
||||
~BaseNode() = default;
|
||||
BaseNode(/* args */);
|
||||
~BaseNode();
|
||||
|
||||
public:
|
||||
virtual void Init();
|
||||
@@ -81,45 +85,45 @@ public:
|
||||
// 被添加时
|
||||
virtual void OnAdded(BaseNode *node);
|
||||
// 设置迭代的二维仿射变换
|
||||
void SetIterationTransform(TransformT transform);
|
||||
void SetIterationTransform(Transform transform);
|
||||
// 获取迭代的二维仿射变换
|
||||
TransformT GetIterationTransform();
|
||||
Transform GetIterationTransform();
|
||||
// 设置二维仿射变换
|
||||
void SetTransform(TransformT transform);
|
||||
void SetTransform(Transform transform);
|
||||
// 获取二维仿射变换
|
||||
TransformT GetTransform();
|
||||
Transform GetTransform();
|
||||
|
||||
// 设置迭代的坐标
|
||||
virtual void SetIterationPos(VecFPos pos);
|
||||
virtual void SetIterationPos(Vec2 pos);
|
||||
// 获取迭代的坐标
|
||||
VecFPos GetIterationPos();
|
||||
Vec2 GetIterationPos();
|
||||
// 设置迭代的缩放
|
||||
virtual void SetIterationScale(VecFPos scale);
|
||||
virtual void SetIterationScale(Vec2 scale);
|
||||
// 获取迭代的缩放
|
||||
VecFPos GetIterationScale();
|
||||
Vec2 GetIterationScale();
|
||||
// 设置迭代的旋转角度
|
||||
virtual void SetIterationRotation(float angle);
|
||||
// 获取迭代的旋转角度
|
||||
float GetIterationRotation();
|
||||
|
||||
// 设置坐标
|
||||
virtual void SetPos(VecFPos pos);
|
||||
virtual void SetPos(Vec2 pos);
|
||||
// 获取坐标
|
||||
VecFPos GetPos();
|
||||
Vec2 GetPos();
|
||||
// 获取世界坐标
|
||||
VecFPos GetWorldPos();
|
||||
Vec2 GetWorldPos();
|
||||
// 设置缩放
|
||||
virtual void SetScale(VecFPos scale);
|
||||
virtual void SetScale(Vec2 scale);
|
||||
// 获取缩放
|
||||
VecFPos GetScale();
|
||||
Vec2 GetScale();
|
||||
// 设置旋转角度
|
||||
virtual void SetRotation(float angle);
|
||||
// 获取旋转角度
|
||||
float GetRotation();
|
||||
// 设置中心点
|
||||
virtual void SetAnchor(VecFPos anchor);
|
||||
virtual void SetAnchor(Vec2 anchor);
|
||||
// 获取中心点
|
||||
VecFPos GetAnchor();
|
||||
Vec2 GetAnchor();
|
||||
// 设置大小
|
||||
virtual void SetSize(VecSize size);
|
||||
// 获取大小
|
||||
@@ -132,6 +136,10 @@ public:
|
||||
virtual void SetAlpha(float alpha);
|
||||
// 获取透明度
|
||||
float GetAlpha();
|
||||
// 设置混合模式
|
||||
void SetBlendMode(LE_BlEND_MODE mode);
|
||||
// 获取混合模式
|
||||
LE_BlEND_MODE GetBlendMode();
|
||||
|
||||
//获取父对象
|
||||
BaseNode *GetParent();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
// 旋转
|
||||
|
||||
104
source/EngineFrame/Component/NumberText.cpp
Normal file
104
source/EngineFrame/Component/NumberText.cpp
Normal 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();
|
||||
// }
|
||||
}
|
||||
44
source/EngineFrame/Component/NumberText.h
Normal file
44
source/EngineFrame/Component/NumberText.h
Normal 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;
|
||||
};
|
||||
@@ -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(); // 更新渲染信息
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -43,6 +43,35 @@ RefPtr<Texture> Sprite::GetTexture()
|
||||
return m_texture;
|
||||
}
|
||||
|
||||
GlMatrix Sprite::matrix3x2ToGLMatrix(const Matrix3x2 &mat)
|
||||
{
|
||||
return {
|
||||
// 列0:x轴线性变换
|
||||
mat._11, // [0][0]
|
||||
mat._12, // [1][0]
|
||||
0.0f, // [2][0]
|
||||
0.0f, // [3][0]
|
||||
|
||||
// 列1:y轴线性变换
|
||||
mat._21, // [0][1]
|
||||
mat._22, // [1][1]
|
||||
0.0f, // [2][1]
|
||||
0.0f, // [3][1]
|
||||
|
||||
// 列2:z轴(固定)
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user