📄 sprite.cpp
字号:
// Sprite.cpp: implementation of the CSprite class.
//
//////////////////////////////////////////////////////////////////////
#include "Sprite.h"
extern char G_cSpriteAlphaDegree;
extern int G_iAddTable31[64][510], G_iAddTable63[64][510];
extern int G_iAddTransTable31[510][64], G_iAddTransTable63[510][64];
extern long G_lTransG100[64][64], G_lTransRB100[64][64];
extern long G_lTransG70[64][64], G_lTransRB70[64][64];
extern long G_lTransG50[64][64], G_lTransRB50[64][64];
extern long G_lTransG25[64][64], G_lTransRB25[64][64];
extern long G_lTransG2[64][64], G_lTransRB2[64][64];
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//沥柳堡 荐沥, constructor OverLoad..
//扁粮狼 constructor 客 备盒阑 窍扁 困秦, int type variable 阑 parameter肺 眠啊沁栏唱 角力肺绰 救静烙.
//捞 constructor绰 郴何俊辑 Pak 颇老俊 措茄 open 苞 close 甫 窍瘤 臼绰促.
CSprite::CSprite(HANDLE hPakFile, DXC_ddraw *pDDraw, char *cPakFileName, short sNthFile, bool bAlphaEffect)
{
DWORD nCount;
int iASDstart;
m_stBrush = NULL;
m_lpSurface = NULL;
m_bIsSurfaceEmpty = TRUE;
ZeroMemory(m_cPakFileName, sizeof(m_cPakFileName));
m_cAlphaDegree = 1;
m_bOnCriticalSection = FALSE;
m_iTotalFrame = 0;
m_pDDraw = pDDraw;
// 捞力 胶橇扼捞飘 颇老(*.ASD)捞 矫累窍绰 困摹甫 茫绰促.
SetFilePointer(hPakFile, 24 + sNthFile*8, NULL, FILE_BEGIN);
ReadFile(hPakFile, &iASDstart, 4, &nCount, NULL); // i绰 ASD颇老狼 矫累困摹
// 胶橇扼捞飘 拳老 庆歹甫 佬绢 犬牢茄促.
//i+100篮 ASD颇老狼 矫累俊辑何磐 Sprite Confirm何盒阑 顿绢逞绰促.
SetFilePointer(hPakFile, iASDstart+100, NULL, FILE_BEGIN);
// 傈眉 橇饭烙荐 佬绰促.
ReadFile(hPakFile, &m_iTotalFrame, 4, &nCount, NULL);
// 厚飘甘 拳老狼 困摹甫 固府 拌魂秦 初绰促.
m_dwBitmapFileStartLoc = iASDstart + (108 + (12*m_iTotalFrame));
m_stBrush = new stBrush[m_iTotalFrame];
// 胶橇扼捞飘 沥焊甫 佬绢 檬扁拳茄促.
ReadFile(hPakFile, m_stBrush, 12*m_iTotalFrame, &nCount, NULL);
// PAK 颇老 捞抚阑 历厘茄促.
memcpy(m_cPakFileName, cPakFileName, strlen(cPakFileName));
// 舅颇 俊棋飘啊 荤侩登绰 胶橇扼牢飘牢瘤
m_bAlphaEffect = bAlphaEffect;
// 胶橇扼捞飘 沥焊父阑 佬绊 捞固瘤绰 肺爹窍瘤 臼绰促. 弥檬肺 弊副锭 肺爹茄促.
}
CSprite::~CSprite()
{
if (m_stBrush != NULL) delete[] m_stBrush;
if (m_lpSurface != NULL) m_lpSurface->Release();
}
IDirectDrawSurface7 * CSprite::_pMakeSpriteSurface()
{
IDirectDrawSurface7 * pdds4;
HDC hDC;
WORD * wp;
m_bOnCriticalSection = TRUE;
if( m_stBrush == NULL ) return NULL;
CMyDib mydib(m_cPakFileName, m_dwBitmapFileStartLoc);
m_wBitmapSizeX = mydib.m_wWidthX;
m_wBitmapSizeY = mydib.m_wWidthY;
pdds4 = m_pDDraw->pCreateOffScreenSurface(m_wBitmapSizeX, m_wBitmapSizeY);
if (pdds4 == NULL) return NULL;
pdds4->GetDC(&hDC);
mydib.PaintImage(hDC);
pdds4->ReleaseDC(hDC);
// 拿矾虐蔼阑 掘绢柯促.
DDSURFACEDESC2 ddsd;
ddsd.dwSize = 124;
if (pdds4->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) != DD_OK) return NULL;
pdds4->Unlock(NULL);
wp = (WORD *)ddsd.lpSurface;
m_wColorKey = *wp;
m_bOnCriticalSection = FALSE;
return pdds4;
}
void CSprite::PutSpriteFast(int sX, int sY, int sFrame, DWORD dwTime)
{
short dX,dY,sx,sy,szx,szy,pvx,pvy;
RECT rcRect;
if( this == NULL ) return;
if( m_stBrush == NULL ) return;
// 粮犁窍瘤 臼绰 橇饭烙阑 免仿窍咯 沁促.
if ((m_iTotalFrame-1 < sFrame) || (sFrame < 0)) return;
m_bOnCriticalSection = TRUE;
sx = m_stBrush[sFrame].sx;
sy = m_stBrush[sFrame].sy;
szx = m_stBrush[sFrame].szx;
szy = m_stBrush[sFrame].szy;
pvx = m_stBrush[sFrame].pvx;
pvy = m_stBrush[sFrame].pvy;
dX = sX + pvx;
dY = sY + pvy;
if (dX < m_pDDraw->m_rcClipArea.left)
{
sx = sx + (m_pDDraw->m_rcClipArea.left - dX);
szx = szx - (m_pDDraw->m_rcClipArea.left - dX);
if (szx <= 0) {
m_rcBound.top = -1;
return;
}
dX = (short)m_pDDraw->m_rcClipArea.left;
}
else if (dX+szx > m_pDDraw->m_rcClipArea.right)
{
szx = szx - ((dX+szx) - (short)m_pDDraw->m_rcClipArea.right);
if (szx <= 0) {
m_rcBound.top = -1;
return;
}
}
if (dY < m_pDDraw->m_rcClipArea.top)
{
sy = sy + (m_pDDraw->m_rcClipArea.top - dY);
szy = szy - (m_pDDraw->m_rcClipArea.top - dY);
if (szy <= 0) {
m_rcBound.top = -1;
return;
}
dY = (short)m_pDDraw->m_rcClipArea.top;
}
else if (dY+szy > m_pDDraw->m_rcClipArea.bottom)
{
szy = szy - ((dY+szy) - (short)m_pDDraw->m_rcClipArea.bottom);
if (szy <= 0) {
m_rcBound.top = -1;
return;
}
}
// 谅钎啊 嘛绢具 且 谅钎捞促.
// 免仿 矫埃阑 扁废.
m_dwRefTime = dwTime;
if (m_bIsSurfaceEmpty == TRUE)
{
if( _iOpenSprite() == FALSE ) return;
}
else {
// AlphaDegree啊 函版登菌促搁 促矫 肺靛茄促.
if (m_bAlphaEffect && (m_cAlphaDegree != G_cSpriteAlphaDegree)) {
if (G_cSpriteAlphaDegree == 2) {
// 鸥老捞 广栏肺 函版登绰 巴捞扼搁 犁肺爹且 鞘夸 绝捞 Alpha Degree父 汲沥茄促.
_SetAlphaDegree();
}
else {
_iCloseSprite();
if( _iOpenSprite() == FALSE ) return;
}
}
}
rcRect.left = sx;
rcRect.top = sy;
rcRect.right = sx + szx;
rcRect.bottom = sy + szy;
m_rcBound.left = dX;
m_rcBound.top = dY;
m_rcBound.right = dX + szx;
m_rcBound.bottom = dY + szy;
m_pDDraw->m_lpBackB4->BltFast( dX, dY, m_lpSurface, &rcRect, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
m_bOnCriticalSection = FALSE;
}
void CSprite::PutSpriteFastDst(LPDIRECTDRAWSURFACE7 lpDstS, int sX, int sY, int sFrame, DWORD dwTime)
{
short dX,dY,sx,sy,szx,szy,pvx,pvy;
RECT rcRect;
// 粮犁窍瘤 臼绰 橇饭烙阑 免仿窍咯 沁促.
if( this == NULL ) return;
if( m_stBrush == NULL ) return;
if ((m_iTotalFrame-1 < sFrame) || (sFrame < 0)) return;
m_bOnCriticalSection = TRUE;
sx = m_stBrush[sFrame].sx;
sy = m_stBrush[sFrame].sy;
szx = m_stBrush[sFrame].szx;
szy = m_stBrush[sFrame].szy;
pvx = m_stBrush[sFrame].pvx;
pvy = m_stBrush[sFrame].pvy;
dX = sX + pvx;
dY = sY + pvy;
if (dX < m_pDDraw->m_rcClipArea.left)
{
sx = sx + (m_pDDraw->m_rcClipArea.left - dX);
szx = szx - (m_pDDraw->m_rcClipArea.left - dX);
if (szx <= 0) {
m_rcBound.top = -1;
return;
}
dX = (short)m_pDDraw->m_rcClipArea.left;
}
else if (dX+szx > m_pDDraw->m_rcClipArea.right)
{
szx = szx - ((dX+szx) - (short)m_pDDraw->m_rcClipArea.right);
if (szx <= 0) {
m_rcBound.top = -1;
return;
}
}
if (dY < m_pDDraw->m_rcClipArea.top)
{
sy = sy + (m_pDDraw->m_rcClipArea.top - dY);
szy = szy - (m_pDDraw->m_rcClipArea.top - dY);
if (szy <= 0) {
m_rcBound.top = -1;
return;
}
dY = (short)m_pDDraw->m_rcClipArea.top;
}
else if (dY+szy > m_pDDraw->m_rcClipArea.bottom)
{
szy = szy - ((dY+szy) - (short)m_pDDraw->m_rcClipArea.bottom);
if (szy <= 0) {
m_rcBound.top = -1;
return;
}
}
// 谅钎啊 嘛绢具 且 谅钎捞促.
// 免仿 矫埃阑 扁废.
m_dwRefTime = dwTime;
if (m_bIsSurfaceEmpty == TRUE)
{
if( _iOpenSprite() == FALSE ) return;
}
else {
// AlphaDegree啊 函版登菌促搁 促矫 肺靛茄促.
if (m_bAlphaEffect && (m_cAlphaDegree != G_cSpriteAlphaDegree)) {
if (G_cSpriteAlphaDegree == 2) {
// 鸥老捞 广栏肺 函版登绰 巴捞扼搁 犁肺爹且 鞘夸 绝捞 Alpha Degree父 汲沥茄促.
_SetAlphaDegree();
}
else {
_iCloseSprite();
if( _iOpenSprite() == FALSE ) return;
}
}
}
//SetRect(&rcRect, sx, sy, sx + szx, sy + szy); // our fictitious sprite bitmap is
//SetRect(&m_rcBound, dX, dY, dX + szx, dY + szy);
rcRect.left = sx;
rcRect.top = sy;
rcRect.right = sx + szx;
rcRect.bottom = sy + szy;
m_rcBound.left = dX;
m_rcBound.top = dY;
m_rcBound.right = dX + szx;
m_rcBound.bottom = dY + szy;
lpDstS->BltFast( dX, dY, m_lpSurface, &rcRect, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
m_bOnCriticalSection = FALSE;
}
void CSprite::PutSpriteFastNoColorKey(int sX, int sY, int sFrame, DWORD dwTime)
{
short dX,dY,sx,sy,szx,szy,pvx,pvy;
RECT rcRect;
// 粮犁窍瘤 臼绰 橇饭烙阑 免仿窍咯 沁促.
if( this == NULL ) return;
if( m_stBrush == NULL ) return;
if ((m_iTotalFrame-1 < sFrame) || (sFrame < 0)) return;
m_bOnCriticalSection = TRUE;
sx = m_stBrush[sFrame].sx;
sy = m_stBrush[sFrame].sy;
szx = m_stBrush[sFrame].szx;
szy = m_stBrush[sFrame].szy;
pvx = m_stBrush[sFrame].pvx;
pvy = m_stBrush[sFrame].pvy;
dX = sX + pvx;
dY = sY + pvy;
if (dX < m_pDDraw->m_rcClipArea.left)
{
sx = sx + (m_pDDraw->m_rcClipArea.left - dX);
szx = szx - (m_pDDraw->m_rcClipArea.left - dX);
if (szx <= 0) {
m_rcBound.top = -1;
return;
}
dX = (short)m_pDDraw->m_rcClipArea.left;
}
else if (dX+szx > m_pDDraw->m_rcClipArea.right)
{
szx = szx - ((dX+szx) - (short)m_pDDraw->m_rcClipArea.right);
if (szx <= 0) {
m_rcBound.top = -1;
return;
}
}
if (dY < m_pDDraw->m_rcClipArea.top)
{
sy = sy + (m_pDDraw->m_rcClipArea.top - dY);
szy = szy - (m_pDDraw->m_rcClipArea.top - dY);
if (szy <= 0) {
m_rcBound.top = -1;
return;
}
dY = (short)m_pDDraw->m_rcClipArea.top;
}
else if (dY+szy > m_pDDraw->m_rcClipArea.bottom)
{
szy = szy - ((dY+szy) - (short)m_pDDraw->m_rcClipArea.bottom);
if (szy <= 0) {
m_rcBound.top = -1;
return;
}
}
// 谅钎啊 嘛绢具 且 谅钎捞促.
m_dwRefTime = dwTime;
if (m_bIsSurfaceEmpty == TRUE)
{
if( _iOpenSprite() == FALSE ) return;
}
else {
// AlphaDegree啊 函版登菌促搁 促矫 肺靛茄促.
if (m_bAlphaEffect && (m_cAlphaDegree != G_cSpriteAlphaDegree)) {
if (G_cSpriteAlphaDegree == 2) {
// 鸥老捞 广栏肺 函版登绰 巴捞扼搁 犁肺爹且 鞘夸 绝捞 Alpha Degree父 汲沥茄促.
_SetAlphaDegree();
}
else {
_iCloseSprite();
if( _iOpenSprite() == FALSE ) return;
}
}
}
//SetRect(&rcRect, sx, sy, sx + szx, sy + szy); // our fictitious sprite bitmap is
//SetRect(&m_rcBound, dX, dY, dX + szx, dY + szy);
rcRect.left = sx;
rcRect.top = sy;
rcRect.right = sx + szx;
rcRect.bottom = sy + szy;
m_rcBound.left = dX;
m_rcBound.top = dY;
m_rcBound.right = dX + szx;
m_rcBound.bottom = dY + szy;
m_pDDraw->m_lpBackB4->BltFast( dX, dY, m_lpSurface, &rcRect, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT );
m_bOnCriticalSection = FALSE;
}
void CSprite::PutSpriteFastNoColorKeyDst(LPDIRECTDRAWSURFACE7 lpDstS, int sX, int sY, int sFrame, DWORD dwTime)
{
short dX,dY,sx,sy,szx,szy,pvx,pvy;
RECT rcRect;
// 粮犁窍瘤 臼绰 橇饭烙阑 免仿窍咯 沁促.
if( this == NULL ) return;
if( m_stBrush == NULL ) return;
if ((m_iTotalFrame-1 < sFrame) || (sFrame < 0)) return;
m_bOnCriticalSection = TRUE;
sx = m_stBrush[sFrame].sx;
sy = m_stBrush[sFrame].sy;
szx = m_stBrush[sFrame].szx;
szy = m_stBrush[sFrame].szy;
pvx = m_stBrush[sFrame].pvx;
pvy = m_stBrush[sFrame].pvy;
dX = sX + pvx;
dY = sY + pvy;
if (dX < m_pDDraw->m_rcClipArea.left)
{
sx = sx + (m_pDDraw->m_rcClipArea.left - dX);
szx = szx - (m_pDDraw->m_rcClipArea.left - dX);
if (szx <= 0) {
m_rcBound.top = -1;
return;
}
dX = (short)m_pDDraw->m_rcClipArea.left;
}
else if (dX+szx > m_pDDraw->m_rcClipArea.right)
{
szx = szx - ((dX+szx) - (short)m_pDDraw->m_rcClipArea.right);
if (szx <= 0) {
m_rcBound.top = -1;
return;
}
}
if (dY < m_pDDraw->m_rcClipArea.top)
{
sy = sy + (m_pDDraw->m_rcClipArea.top - dY);
szy = szy - (m_pDDraw->m_rcClipArea.top - dY);
if (szy <= 0) {
m_rcBound.top = -1;
return;
}
dY = (short)m_pDDraw->m_rcClipArea.top;
}
else if (dY+szy > m_pDDraw->m_rcClipArea.bottom)
{
szy = szy - ((dY+szy) - (short)m_pDDraw->m_rcClipArea.bottom);
if (szy <= 0) {
m_rcBound.top = -1;
return;
}
}
// 谅钎啊 嘛绢具 且 谅钎捞促.
m_dwRefTime = dwTime;
if (m_bIsSurfaceEmpty == TRUE) {
if( _iOpenSprite() == FALSE ) return;
}
else {
// AlphaDegree啊 函版登菌促搁 促矫 肺靛茄促.
if (m_bAlphaEffect && (m_cAlphaDegree != G_cSpriteAlphaDegree)) {
if (G_cSpriteAlphaDegree == 2) {
// 鸥老捞 广栏肺 函版登绰 巴捞扼搁 犁肺爹且 鞘夸 绝捞 Alpha Degree父 汲沥茄促.
_SetAlphaDegree();
}
else {
_iCloseSprite();
if( _iOpenSprite() == FALSE ) return;
}
}
}
rcRect.left = sx;
rcRect.top = sy;
rcRect.right = sx + szx;
rcRect.bottom = sy + szy;
m_rcBound.left = dX;
m_rcBound.top = dY;
m_rcBound.right = dX + szx;
m_rcBound.bottom = dY + szy;
lpDstS->BltFast( dX, dY, m_lpSurface, &rcRect, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT );
m_bOnCriticalSection = FALSE;
}
void CSprite::PutSpriteFastFrontBuffer(int sX, int sY, int sFrame, DWORD dwTime)
{
short dX,dY,sx,sy,szx,szy,pvx,pvy;
RECT rcRect;
if( this == NULL ) return;
if( m_stBrush == NULL ) return;
if ((m_iTotalFrame-1 < sFrame) || (sFrame < 0)) return;
m_bOnCriticalSection = TRUE;
sx = m_stBrush[sFrame].sx;
sy = m_stBrush[sFrame].sy;
szx = m_stBrush[sFrame].szx;
szy = m_stBrush[sFrame].szy;
pvx = m_stBrush[sFrame].pvx;
pvy = m_stBrush[sFrame].pvy;
dX = sX + pvx;
dY = sY + pvy;
if (dX < m_pDDraw->m_rcClipArea.left)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -