SwitchGame/source/EngineFrame/Component/Sprite.cpp

138 lines
2.6 KiB
C++

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