⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sprite.cpp

📁 RGA: Biowaste Game Example This C++ application demonstrates how to create a 2D mobile game for S60
💻 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 + -