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

📄 sprite.cpp

📁 Torus3D.rar,BREW平台的3D游戏引擎的一个实例.喜欢的朋友可以下载
💻 CPP
字号:
// ==========================================================================================================
//
// BREW v2.0+ OPENGLES MICROENGINE
//
// ----------------------------------------
//
// Written by Vander Nunes
//
// ==========================================================================================================

#include "sprite.h"


// --------------------------------------------------------------------------------------
//
// Constructor
//
// --------------------------------------------------------------------------------------
CSprite::CSprite(CEngine* pEngine)
{
	m_pEngine = pEngine;
	pBuffer = NULL;
	pFrames = NULL;
}


// --------------------------------------------------------------------------------------
//
// Destructor
//
// --------------------------------------------------------------------------------------
CSprite::~CSprite()
{
	CleanUp();
}


// --------------------------------------------------------------------------------------
//
// Release memory
//
// --------------------------------------------------------------------------------------
void CSprite::CleanUp()
{
	if (pBuffer)
	{
		if (bUseSysFree)
		{
			SYSFREE(pBuffer);
			pBuffer = NULL;
		}
	}

	if (pFrames)
	{
		delete [] pFrames;
		pFrames = NULL;
		jNFrames = 0;
	}
}


// --------------------------------------------------------------------------------------
//
// Load 2D sprite bitmap from the game dat file (vfs)
//
// --------------------------------------------------------------------------------------
boolean CSprite::LoadFromVfs(char* szVfsFile, char* szFile)
{
	CleanUp();

  CVfs Vfs;
	AEEImageInfo ImgInfo;

	if (!Vfs.Unpack(szVfsFile, szFile, m_pEngine->Applet()))
		return FALSE;

	byte* pData = new byte[Vfs.FileSize()];
	Vfs.Read(pData, Vfs.FileSize());
	Vfs.Finish();

	pBuffer = CONVERTBMP(pData, &ImgInfo, &bUseSysFree);

	iW = (byte)ImgInfo.cx;
	iH = (byte)ImgInfo.cy;
	jCurrFrame = 0;
	jNFrames = 1;
	pFrames = NULL;
	wFrameTime = 0;
	jAnimDir = 1;
	bFlag1 = bFlag2 = FALSE;

	delete [] pData;

	return true;
}


// --------------------------------------------------------------------------------------
//
// Load 2D sprite bitmap from the conventional resource file
//
// --------------------------------------------------------------------------------------
boolean CSprite::LoadFromRes(char* szResFile, int16 sRes)
{
	CleanUp();

	void*		pRes;
	byte*		pPix;
	AEEImageInfo ImgInfo;

	pRes = ISHELL_LoadResData(m_pEngine->Applet()->m_pIShell, szResFile, sRes, RESTYPE_IMAGE);
	if (pRes)
	{
		pPix = (byte*)(pRes) + *((byte*)(pRes));
		pBuffer = CONVERTBMP(pPix, &ImgInfo, &bUseSysFree);
		ISHELL_FreeResData(m_pEngine->Applet()->m_pIShell, pRes);
	}

	iW = (byte)ImgInfo.cx;
	iH = (byte)ImgInfo.cy;
	jCurrFrame = 0;
	jNFrames = 1;
	pFrames = NULL;
	wFrameTime = 0;
	jAnimDir = 1;
	bFlag1 = bFlag2 = FALSE;

	return true;
}


// --------------------------------------------------------------------------------------
//
// Configure sprite frames
//
// --------------------------------------------------------------------------------------
void CSprite::Config(byte jNFrames, int16* pFramesData)
{
	jNFrames = jNFrames;
	jCurrFrame = 0;
	pFrames = new sprframe[jNFrames];
	sprframe* pTmp = pFrames;
	if (pFramesData != NULL)
	{
		// config each frame
		iMinfw = 32767;
		iMaxfw = 0;
		for (byte jx=0; jx<jNFrames; jx++)
		{
			int off = jx*6;
			pTmp[jx].jOffx = pFramesData[off+0];
			pTmp[jx].jOffy = pFramesData[off+1];
			pTmp[jx].jAddx = pFramesData[off+2];
			pTmp[jx].jAddy = pFramesData[off+3];
			pTmp[jx].iW    = pFramesData[off+4];
			pTmp[jx].iH    = pFramesData[off+5];
			if (pTmp[jx].iW < iMinfw) iMinfw = pTmp[jx].iW;
			if (pTmp[jx].iW > iMaxfw) iMaxfw = pTmp[jx].iW;
		}
	}
	else
	{
		// config the single frame
		iMinfw = iMaxfw = iW;
		pTmp[0].iW = iW;
		pTmp[0].iH = iH;
		pTmp[0].jAddx = pTmp[0].jAddy = pTmp[0].jOffx = pTmp[0].jOffy = 0;
	}
}


// --------------------------------------------------------------------------------------
//
// Set manually the current frame
//
// --------------------------------------------------------------------------------------
void CSprite::SetFrame(byte jFrame)
{
	jCurrFrame = jFrame;
}


// --------------------------------------------------------------------------------------
//
// Do an animation step, respecting timer ticks
//
// --------------------------------------------------------------------------------------
void CSprite::StepAnim(byte jFirst, byte jLast, uint16 wTickTime, uint16 wTicksElapsed, boolean bLoop, boolean bPingPong)
{
	if (jCurrFrame < jFirst)
	{
		jCurrFrame = jFirst;
		jAnimDir = 1;
		wFrameTime = 0;
	}
	else if (jCurrFrame > jLast)
	{
		jCurrFrame = jLast;
		jAnimDir = (char)-1;
		wFrameTime = 0;
	}

	wFrameTime += wTicksElapsed;

	if (wFrameTime >= wTickTime)
	{
		if (!bPingPong)
			jCurrFrame++;
		else
			jCurrFrame += 1 * jAnimDir;

		if (jCurrFrame < jFirst)
		{
			jAnimDir *= -1;
			if (bLoop)
			{
				if (bPingPong)
					jCurrFrame = jFirst+1;
				else
					jCurrFrame = jLast;
			}
			else
				jCurrFrame = jFirst;
		}
		else if (jCurrFrame > jLast)
		{
			jAnimDir *= -1;
			if (bLoop)
			{
				if (bPingPong)
					jCurrFrame = jLast-1;
				else
					jCurrFrame = jFirst;
			}
			else
				jCurrFrame = jLast;
		}
		wFrameTime = 0;
	}
}


// --------------------------------------------------------------------------------------
//
// Draw current frame
//
// --------------------------------------------------------------------------------------
void CSprite::Draw(int iPx, int iPy)
{
	if (pFrames)
		IDISPLAY_BitBlt(m_pEngine->Applet()->m_pIDisplay, iPx,iPy, pFrames[jCurrFrame].iW,pFrames[jCurrFrame].iH, pBuffer, pFrames[jCurrFrame].jOffx,pFrames[jCurrFrame].jOffy, AEE_RO_TRANSPARENT);
	else
		IDISPLAY_BitBlt(m_pEngine->Applet()->m_pIDisplay, iPx,iPy, iW,iH, pBuffer, 0,0, AEE_RO_TRANSPARENT);
}


// --------------------------------------------------------------------------------------
//
// Draw a number (to use this, the sprite must be a sequence of numbers from 0 to 9)
//
// --------------------------------------------------------------------------------------
void CSprite::DrawNumber(int iPx, int iPy, char* szNumber)
{
	for (byte xx=0; xx<STRLEN(szNumber); xx++)
	{
		byte c = szNumber[xx]-48;
		SetFrame(c);
		Draw(iPx,iPy);
		iPx += pFrames[c].iW;
	}
}


// --------------------------------------------------------------------------------------
//
// Draw a text in the range (spc)!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ
// (ascii 32 .. 90)
//
// --------------------------------------------------------------------------------------
void CSprite::DrawText32To90(int iPx, int iPy, char* szText)
{
	for (byte xx=0; xx<STRLEN(szText); xx++)
	{
		byte c = szText[xx] - 32;
		SetFrame(c);
		Draw(iPx,iPy);
		iPx += pFrames[c].iW;
	}
}


// --------------------------------------------------------------------------------------
//
//
//
// --------------------------------------------------------------------------------------
short CSprite::Width()
{
	return iW;
}


// --------------------------------------------------------------------------------------
//
//
//
// --------------------------------------------------------------------------------------
short CSprite::Height()
{
	return iH;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -