📄 sprite.cpp
字号:
#include "Sprite.h"
CSprite::CSprite(CApplicationBase& aApp)
: CSpriteBase(aApp)
{
}
CSprite::~CSprite()
{
if (iAnimationIndices)
{
delete [] iAnimationIndices;
iAnimationIndices = NULL;
}
iAnimationIndicesCount = 0;
iFrames.Reset();
iFrames.Close();
}
TInt CSprite::AddFrame(const TSpriteFrame& aFrame)
{
iFrames.Append(aFrame);
if (aFrame.iBitmap)
{
CSize bmsize = aFrame.iBitmap->GetSize();
if ( bmsize.mX > iSize.iWidth ||
bmsize.mY > iSize.iHeight)
{
iSize.iWidth = bmsize.mX;
iSize.iHeight = bmsize.mY;
}
}
return iFrames.Count() - 1;
}
TSpriteFrame& CSprite::Frame(TInt aIndex)
{
return iFrames[aIndex];
}
void CSprite::SetAnimationSequence(const TUint32* aFrameIndices, const TUint32 aFrameCount)
{
// release previous sequence
if (iAnimationIndices)
{
delete [] iAnimationIndices;
iAnimationIndices = NULL;
}
// allocate new sequence
iAnimationIndicesCount = aFrameCount;
if (iAnimationIndicesCount)
{
iAnimationIndices = new TUint32[iAnimationIndicesCount];
Mem::Copy(iAnimationIndices, aFrameIndices, iAnimationIndicesCount * sizeof(TUint32));
}
}
void CSprite::SetAnimationSpeed(const TReal64 aFPS)
{
iAnimationSpeed = aFPS;
}
void CSprite::Update(const TReal64 aFrametime)
{
// update sprite position
CSpriteBase::Update(aFrametime);
// update animation index
if (iAnimationIndices && iAnimationIndicesCount)
{
// increase frame index
iAnimationIndex += aFrametime * iAnimationSpeed;
// check of out of bounds
while (iAnimationIndex >= iAnimationIndicesCount)
{
iAnimationIndex -= (TReal64)iAnimationIndicesCount;
}
// also, we may have negative speeds, so check
// another way around
while (iAnimationIndex < 0.0)
{
iAnimationIndex += (TReal64)iAnimationIndicesCount;
}
}
else
{
iAnimationIndex = 0.0;
}
}
void CSprite::Draw(IGraphicsContext& aContext, const TVector2& aCamera)
{
if (iFrames.Count())
{
// find animation frame, check boundaries, and draw
TSpriteFrame* frame = NULL;
TUint32 frameindex = (TUint32)iAnimationIndex;
if (iAnimationIndices)
{
frame = &iFrames[iAnimationIndices[frameindex]];
}
else
{
frame = &iFrames[frameindex];
}
if (frame)
{
if (frame->iBitmap)
{
CPoint position( (TInt)(iPos.iX - aCamera.iX),
(TInt)(iPos.iY - aCamera.iY) );
position.mX -= (iSize.iWidth >> 1);
position.mY -= (iSize.iHeight >> 1);
frame->iBitmap->Lock();
if (frame->iMask)
{
// mask found, use alpha
frame->iMask->Lock();
aContext.BitBlitAlphaMask( position,
*frame->iBitmap,
*frame->iMask);
frame->iMask->Unlock();
}
else
{
// no mask, plain transparent draw
aContext.BitBlitTransparent(position, *frame->iBitmap, 0);
}
frame->iBitmap->Unlock();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -