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;
|
|
|
|
|
}
|