SwitchGame/source/EngineFrame/Component/Sprite.cpp

138 lines
2.5 KiB
C++
Raw Normal View History

2025-09-15 11:28:54 +08:00
#include "Sprite.h"
#include "EngineCore/Game.h"
#include "Text.h"
Sprite::Sprite()
{
}
Sprite::Sprite(std::string imgPath, int Index)
{
2025-09-19 12:18:57 +08:00
m_texture = new Texture(imgPath, Index);
Init();
}
Sprite::Sprite(std::string PngPath)
{
m_texture = new Texture(PngPath);
Init();
2025-09-15 11:28:54 +08:00
}
Sprite::~Sprite()
{
}
2025-09-19 12:18:57 +08:00
void Sprite::Init()
2025-09-15 11:28:54 +08:00
{
2025-09-18 15:21:43 +08:00
// 标记该组件需要渲染和更新
addTag(Tag::RENDER);
addTag(Tag::UPDATE);
2025-09-19 12:18:57 +08:00
addTag(Tag::TRANSFORM);
2025-09-15 11:28:54 +08:00
2025-09-19 12:18:57 +08:00
Size = m_texture->TextureSize;
2025-09-15 11:28:54 +08:00
}
2025-09-18 15:21:43 +08:00
RefPtr<Texture> Sprite::GetTexture()
2025-09-15 11:28:54 +08:00
{
return m_texture;
}
void Sprite::HandleEvents(SDL_Event *e)
{
}
void Sprite::Update(float deltaTime)
{
2025-09-18 15:21:43 +08:00
// // 检测是否超出屏幕
// bool isFullyOutOfScreen =
// (Pos.x + Size.x <= 0) // 完全在屏幕左侧外
// || (Pos.x >= 1280) // 完全在屏幕右侧外
// || (Pos.y + Size.y <= 0) // 完全在屏幕上侧外
// || (Pos.y >= 720); // 完全在下侧外
// isRenderScreen = !isFullyOutOfScreen;
2025-09-15 11:28:54 +08:00
}
void Sprite::Render(float deltaTime)
{
SDL_Renderer *renderer = Game::GetInstance().GetRenderer();
if (!m_texture)
return;
2025-09-19 12:18:57 +08:00
int XPos = IterationPos.x + Pos.x + m_texture->TexturePos.x;
int YPos = IterationPos.y + Pos.y + m_texture->TexturePos.y;
int XSize = Size.width;
int YSize = Size.height;
SDL_Rect dstrect = {XPos, YPos, XSize, YSize};
2025-09-15 11:28:54 +08:00
2025-09-18 15:21:43 +08:00
if (isRenderScreen)
{
if (Angle != 0 || flip != SDL_FLIP_NONE)
{
2025-09-19 12:18:57 +08:00
SDL_Point AnchorBuf = Anchor;
SDL_RenderCopyEx(renderer, m_texture->GetTexture(), NULL, &dstrect, Angle, &AnchorBuf, flip);
2025-09-18 15:21:43 +08:00
}
else
2025-09-19 12:18:57 +08:00
{
2025-09-18 15:21:43 +08:00
SDL_RenderCopy(renderer, m_texture->GetTexture(), NULL, &dstrect);
2025-09-19 12:18:57 +08:00
}
2025-09-18 15:21:43 +08:00
}
}
2025-09-15 11:28:54 +08:00
void Sprite::Clear()
{
}
2025-09-19 12:18:57 +08:00
void Sprite::SetPos(VecPos pos)
2025-09-15 11:28:54 +08:00
{
Pos = pos;
}
void Sprite::SetBlendMode(SDL_BlendMode blendMode)
{
2025-09-18 15:21:43 +08:00
m_texture->SetBlendMode(blendMode);
2025-09-15 11:28:54 +08:00
}
void Sprite::SetAngle(float angle)
{
Angle = angle;
}
2025-09-19 12:18:57 +08:00
void Sprite::SetAnchor(VecFPos anchor)
2025-09-15 11:28:54 +08:00
{
2025-09-19 12:18:57 +08:00
Anchor.x = Size.width * anchor.x;
Anchor.y = Size.height * anchor.y;
2025-09-15 11:28:54 +08:00
}
2025-09-19 12:18:57 +08:00
void Sprite::SetSize(VecSize size)
2025-09-18 15:21:43 +08:00
{
Size = size;
}
2025-09-19 12:18:57 +08:00
VecSize Sprite::GetSize()
2025-09-18 15:21:43 +08:00
{
return Size;
}
2025-09-19 12:18:57 +08:00
VecPos Sprite::GetPos()
2025-09-15 11:28:54 +08:00
{
return Pos;
}
SDL_BlendMode Sprite::GetBlendMode()
{
2025-09-18 15:21:43 +08:00
return m_texture->GetBlendMode();
2025-09-15 11:28:54 +08:00
}
float Sprite::GetAngle()
{
return Angle;
}
2025-09-19 12:18:57 +08:00
VecFPos Sprite::GetAnchor()
2025-09-15 11:28:54 +08:00
{
2025-09-19 12:18:57 +08:00
VecFPos P;
P.x = Anchor.x / Size.width;
P.y = Anchor.y / Size.height;
2025-09-15 11:28:54 +08:00
return P;
}