#include "Sprite.h" #include "EngineCore/Game.h" #include "Text.h" Sprite::Sprite() { } Sprite::Sprite(std::string imgPath, int Index) { m_texture = new Texture(imgPath, Index); Init(); } Sprite::Sprite(std::string PngPath) { m_texture = new Texture(PngPath); Init(); } Sprite::~Sprite() { } void Sprite::Init() { // 标记该组件需要渲染和更新 addTag(Tag::RENDER); addTag(Tag::UPDATE); addTag(Tag::TRANSFORM); Size = m_texture->TextureSize; } 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; 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}; if (isRenderScreen) { if (Angle != 0 || flip != SDL_FLIP_NONE) { SDL_Point AnchorBuf = Anchor; SDL_RenderCopyEx(renderer, m_texture->GetTexture(), NULL, &dstrect, Angle, &AnchorBuf, flip); } else { SDL_RenderCopy(renderer, m_texture->GetTexture(), NULL, &dstrect); } } } void Sprite::Clear() { } void Sprite::SetPos(VecPos pos) { Pos = pos; } void Sprite::SetBlendMode(SDL_BlendMode blendMode) { m_texture->SetBlendMode(blendMode); } void Sprite::SetAngle(float angle) { Angle = angle; } void Sprite::SetAnchor(VecFPos anchor) { Anchor.x = Size.width * anchor.x; Anchor.y = Size.height * anchor.y; } void Sprite::SetSize(VecSize size) { Size = size; } VecSize Sprite::GetSize() { return Size; } VecPos Sprite::GetPos() { return Pos; } SDL_BlendMode Sprite::GetBlendMode() { return m_texture->GetBlendMode(); } float Sprite::GetAngle() { return Angle; } VecFPos Sprite::GetAnchor() { VecFPos P; P.x = Anchor.x / Size.width; P.y = Anchor.y / Size.height; return P; }