📄 sprite.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 + -