📄 sprite.cpp
字号:
szy = 128;//m_stBrush[sFrame].szy;
pvx = m_stBrush[sFrame].pvx;
pvy = m_stBrush[sFrame].pvy;
sx += shX;
sy += shY;
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;
}
//SetRect(&m_rcBound, dX, dY, dX + szx, dY + szy);
m_rcBound.left = dX;
m_rcBound.top = dY;
m_rcBound.right = dX + szx;
m_rcBound.bottom = dY + szy;
pSrc = (WORD *)m_pSurfaceAddr + sx + ((sy)*m_sPitch);
pDst = (WORD *)m_pDDraw->m_pBackB4Addr + dX + ((dY)*m_pDDraw->m_sBackB4Pitch);
if ((szx == 0) || (szy == 0)) return;
switch (m_pDDraw->m_cPixelFormat) {
case 1:
iy =0;
do {
ix = 0;
do {
if (pSrc[ix] != m_wColorKey) {
pDst[ix] = (WORD)((G_lTransRB2[(pDst[ix]&0xF800)>>11][(pSrc[ix]&0xF800)>>11]<<11) | (G_lTransG2[(pDst[ix]&0x7E0)>>5][(pSrc[ix]&0x7E0)>>5]<<5) | G_lTransRB2[(pDst[ix]&0x1F)][(pSrc[ix]&0x1F)]);
}
ix++;
} while (ix < szx);
pSrc += m_sPitch;
pDst += m_pDDraw->m_sBackB4Pitch;
iy++;
} while (iy < szy);
break;
case 2:
iy =0;
do {
ix = 0;
do {
if (pSrc[ix] != m_wColorKey) {
pDst[ix] = (WORD)((G_lTransRB2[(pDst[ix]&0x7C00)>>10][(pSrc[ix]&0x7C00)>>10]<<10) | (G_lTransG2[(pDst[ix]&0x3E0)>>5][(pSrc[ix]&0x3E0)>>5]<<5) | G_lTransRB2[(pDst[ix]&0x1F)][(pSrc[ix]&0x1F)]);
}
ix++;
} while (ix < szx);
pSrc += m_sPitch;
pDst += m_pDDraw->m_sBackB4Pitch;
iy++;
} while (iy < szy);
break;
}
m_bOnCriticalSection = FALSE;
}
void CSprite::PutFadeSprite(short sX, short sY, short sFrame, DWORD dwTime)
{
short dX,dY,sx,sy,szx,szy,pvx,pvy;
int ix, iy;
WORD * pSrc, * pDst;
//int dX,dY,sx,sy,szx,szy,pvx,pvy,sTmp;
// 粮犁窍瘤 臼绰 橇饭烙阑 免仿窍咯 沁促.
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(&m_rcBound, dX, dY, dX + szx, dY + szy);
pSrc = (WORD *)m_pSurfaceAddr + sx + ((sy)*m_sPitch);
pDst = (WORD *)m_pDDraw->m_pBackB4Addr + dX + ((dY)*m_pDDraw->m_sBackB4Pitch);
switch (m_pDDraw->m_cPixelFormat) {
case 1:
for (iy = 0; iy < szy; iy++) {
for (ix = 0; ix < szx; ix++) {
if (pSrc[ix] != m_wColorKey)
pDst[ix] = ((pDst[ix] & 0xE79C) >> 2);
}
pSrc += m_sPitch;
pDst += m_pDDraw->m_sBackB4Pitch;
}
break;
case 2:
for (iy = 0; iy < szy; iy++) {
for (ix = 0; ix < szx; ix++) {
if (pSrc[ix] != m_wColorKey)
pDst[ix] = ((pDst[ix] & 0x739C) >> 2);
}
pSrc += m_sPitch;
pDst += m_pDDraw->m_sBackB4Pitch;
}
break;
}
m_bOnCriticalSection = FALSE;
}
void CSprite::PutFadeSpriteDst(WORD * pDstAddr, short sPitch, short sX, short sY, short sFrame, DWORD dwTime)
{
short dX,dY,sx,sy,szx,szy,pvx,pvy;
int ix, iy;
WORD * pSrc, * pDst;
//int iRet, dX,dY,sx,sy,szx,szy,pvx,pvy,sTmp;
// 粮犁窍瘤 臼绰 橇饭烙阑 免仿窍咯 沁促.
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(&m_rcBound, dX, dY, dX + szx, dY + szy);
pSrc = (WORD *)m_pSurfaceAddr + sx + ((sy)*m_sPitch);
pDst = (WORD *)pDstAddr + dX + ((dY)*sPitch);
switch (m_pDDraw->m_cPixelFormat) {
case 1:
for (iy = 0; iy < szy; iy++) {
for (ix = 0; ix < szx; ix++) {
if (pSrc[ix] != m_wColorKey)
pDst[ix] = ((pDst[ix] & 0xE79C) >> 2);
}
pSrc += m_sPitch;
pDst += sPitch;
}
break;
case 2:
for (iy = 0; iy < szy; iy++) {
for (ix = 0; ix < szx; ix++) {
if (pSrc[ix] != m_wColorKey)
pDst[ix] = ((pDst[ix] & 0x739C) >> 2);
}
pSrc += m_sPitch;
pDst += sPitch;
}
break;
}
m_bOnCriticalSection = FALSE;
}
bool CSprite::_iOpenSprite()
{
if (m_lpSurface != NULL) return FALSE;
// 厚飘甘阑 辑其捞胶俊 肺靛茄促.
m_lpSurface = _pMakeSpriteSurface();
if (m_lpSurface == NULL) return FALSE;
m_pDDraw->iSetColorKey(m_lpSurface, m_wColorKey);
m_bIsSurfaceEmpty = FALSE;
// 胶橇扼捞飘狼 林家甫 备茄促.
DDSURFACEDESC2 ddsd;
ddsd.dwSize = 124;
if (m_lpSurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) != DD_OK) return FALSE;
m_pSurfaceAddr = (WORD *)ddsd.lpSurface;
m_sPitch = (short)ddsd.lPitch >> 1;
m_lpSurface->Unlock(NULL);
// Alpha Degree汲沥
_SetAlphaDegree();
// m_dwRefTime = timeGetTime();
return TRUE;
}
void CSprite::_iCloseSprite()
{
if( m_stBrush == NULL ) return;
if (m_lpSurface == NULL) return;
if (m_lpSurface->IsLost() != DD_OK) return;
m_lpSurface->Release();
m_lpSurface = NULL;
m_bIsSurfaceEmpty = TRUE;
m_cAlphaDegree = 1;
}
void CSprite::PutSpriteRGB(int sX, int sY, int sFrame, int sRed, int sGreen, int sBlue, DWORD dwTime)
{
short dX,dY,sx,sy,szx,szy,pvx,pvy;
int ix, iy, iRedPlus255, iGreenPlus255, iBluePlus255;
WORD * pSrc, * pDst;
// 粮犁窍瘤 臼绰 橇饭烙阑 免仿窍咯 沁促.
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;
}
}
}
if ((szx == 0) || (szy == 0)) return;
m_rcBound.left = dX;
m_rcBound.top = dY;
m_rcBound.right = dX + szx;
m_rcBound.bottom = dY + szy;
pSrc = (WORD *)m_pSurfaceAddr + sx + ((sy)*m_sPitch);
pDst = (WORD *)m_pDDraw->m_pBackB4Addr + dX + ((dY)*m_pDDraw->m_sBackB4Pitch);
// 加档氢惑阑 困秦 固府 拌魂秦 初绰促. 狼固啊 乐阑瘤绰 葛福摆澜
iRedPlus255 = sRed +255;
iGreenPlus255 = sGreen +255;
iBluePlus255 = sBlue +255;
switch (m_pDDraw->m_cPixelFormat) {
case 1:
iy =0;
do {
ix = 0;
do {
if (pSrc[ix] != m_wColorKey) {
pDst[ix] = (WORD)(( G_iAddTable31[(pSrc[ix]&0xF800)>>11][iRedPlus255] <<11) | ( G_iAddTable63[(pSrc[ix]&0x7E0)>>5][iGreenPlus255] <<5) | G_iAddTable31[(pSrc[ix]&0x1F)][iBluePlus255]);
}
ix++;
} while (ix < szx);
pSrc += m_sPitch;
pDst += m_pDDraw->m_sBackB4Pitch;
iy++;
} while (iy < szy);
break;
case 2:
iy =0;
do {
ix = 0;
do {
if (pSrc[ix] != m_wColorKey) {
pDst[ix] = (WORD)((G_iAddTable31[(pSrc[ix]&0x7C00)>>10][iRedPlus255]<<10) | (G_iAddTable31[(pSrc[ix]&0x3E0)>>5][iGreenPlus255]<<5) | G_iAddTable31[(pSrc[ix]&0x1F)][iBluePlus255]);
}
ix++;
} while (ix < szx);
pSrc += m_sPitch;
pDst += m_pDDraw->m_sBackB4Pitch;
iy++;
} while (iy < szy);
break;
}
m_bOnCriticalSection = FALSE;
}
void CSprite::PutTransSpriteRGB(int sX, int sY, int sFrame, int sRed, int sGreen, int sBlue, DWORD dwTime)
{
short dX,dY,sx,sy,szx,szy,pvx,pvy;
short ix, iy, iRedP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -