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