📄 player.cpp
字号:
bMoveX = m_pGameView->Moveable(m_nRelativePosX+nBalanceX+nDistanceX, m_nRelativePosY-tt);
if (bMoveX == FALSE)
break;
}
if (bMoveX)
{
m_nRunSpeedX -= WORLD_ACCELERATION;
if (m_nCurDirectX == 0)// 左
{
if ((m_pGameView->m_nMapX+nDistanceX) <= 0)
{
if (m_nPosX >= -nDistanceX)
m_nPosX += (m_pGameView->m_nMapX+nDistanceX);
else
m_nPosX = 0;
m_pGameView->m_nMapX = 0;
m_nRelativePosX = m_pGameView->m_nMapX+m_nPosX;
}
else
{
if ((m_nPosX+nDistanceX) > INIT_POSX)
{
m_nPosX += nDistanceX;
m_nRelativePosX = m_pGameView->m_nMapX+m_nPosX;
}
else
{
m_pGameView->m_nMapX += nDistanceX-(INIT_POSX-m_nPosX);
m_nPosX = INIT_POSX;
m_nRelativePosX = m_pGameView->m_nMapX+m_nPosX;
}
}
}
else// 右
{
if ((m_pGameView->m_nMapX+BACKGROUND_WIDTH+nDistanceX) >= (MAP_COL_INDEX*SIGLE_MAP_WIDTH))
{
if (m_nPosX <= (BACKGROUND_WIDTH-27)-nDistanceX)
m_nPosX += nDistanceX-(MAP_COL_INDEX*SIGLE_MAP_WIDTH - (m_pGameView->m_nMapX+BACKGROUND_WIDTH));
else
m_nPosX = BACKGROUND_WIDTH-27;
m_pGameView->m_nMapX = MAP_COL_INDEX*SIGLE_MAP_WIDTH - BACKGROUND_WIDTH;
m_nRelativePosX = m_pGameView->m_nMapX+m_nPosX;
}
else
{
if ((m_nPosX+nDistanceX) < INIT_POSX)
{
m_nPosX += nDistanceX;
m_nRelativePosX = m_pGameView->m_nMapX+m_nPosX;
}
else
{
m_pGameView->m_nMapX += nDistanceX-(INIT_POSX-m_nPosX);
m_nPosX = INIT_POSX;
m_nRelativePosX = m_pGameView->m_nMapX+m_nPosX;
}
}
}
}
else
{
m_nCurDoing = 0;
m_nCurDoingNum = 0;
m_nRunDistanceX = 0;
m_nRunDistanceY = 0;
m_nDoingTimeNum = 0;
m_nRunTime = 0;
m_bAclinicMoveable = FALSE;
break;
}
m_nRunTime++;
}
break;
case 4:// 自由下落
{
nRunDistanceY = (WORLD_ACCELERATION*m_nRunTime*m_nRunTime) / 2;
nDistanceY = nRunDistanceY-m_nRunDistanceY;
if (nDistanceY >= 20)
nDistanceY = 19;
for (i = 0; i < 3; i++)//宽度28
{
int tt = i*SIGLE_MAP_WIDTH;
if (i == 0)
tt = 2;
else if (i == 2)
tt = 26;
bMoveY = m_pGameView->Moveable(m_nRelativePosX+tt, (m_nRelativePosY+1)+nDistanceY);
if (bMoveY == FALSE)
{
m_nCurDoingNum = 1;
break;
}
}
if (bMoveY)
{
m_nCurDoingNum = 0;
m_nRunSpeedY += WORLD_ACCELERATION;
m_pGameView->m_nMapY += nDistanceY;
m_nPosY = INIT_POSY;
m_nRelativePosY += nDistanceY;
m_nRunDistanceY = nRunDistanceY;
m_nRunTime++;
break;
}
else
{
// if (m_nRelativePosY%20 != 0)
// {
m_nRelativePosY = (m_nRelativePosY/20 + 1)*20 - 1;
// m_nPosY = (m_nRelativePosY/20 + 1)*20 ;
m_pGameView->m_nMapY = (m_nRelativePosY+1)-m_nPosY;
m_nDoingTimeNum = (m_nCurDoingNum == 0)?0:m_nDoingTimeNum;
m_nCurDoingNum = 1;
// }
}
// 处理人物图
if (m_nDoingTimeNum < m_nDoingTimeCount[m_nCurDoing][m_nCurDoingNum])
m_nDoingTimeNum++;
else
{
if (m_nCurDoingNum < m_nPlayerDoingNum[m_nCurDoing]-1)
m_nCurDoingNum++;
else
{
m_nCurDoing = 0;
m_nCurDoingNum = 0;
if (m_nJumpNum == 2)
m_nJumpNum = 0;
}
m_nDoingTimeNum = 0;
m_bAclinicMoveable = FALSE;
m_nRunDistanceX = 0;
m_nRunDistanceY = 0;
}
}
break;
case 5:// 物理攻击
{
// 处理人物攻击
if (m_bAttackable == TRUE)
{
m_bAttackable = FALSE;
}
if (m_nCurDoingNum == 2 && m_nDoingTimeNum == 1)
m_bAttackable = TRUE;
// 处理人物图
if (m_nDoingTimeNum < m_nDoingTimeCount[m_nCurDoing][m_nCurDoingNum])
m_nDoingTimeNum++;
else
{
if (m_nCurDoingNum < m_nPlayerDoingNum[m_nCurDoing]-1)
m_nCurDoingNum++;
else
{
m_nCurDoing = 0;
m_nCurDoingNum = 0;
}
m_nDoingTimeNum = 0;
}
}
break;
case 6:// 魔法攻击
break;
case 7:// 死亡
break;
default:
break;
}
// 更新人物图片
m_nCurIndex = (m_nCurFaceX == 0)?(m_tPlayerIndex[m_nCurDoing][m_nCurDoingNum].nLeftIndex)
:(m_tPlayerIndex[m_nCurDoing][m_nCurDoingNum].nRightIndex);
// 更新人物影子
UpdateShadow();
}
void CPlayer::UpdateShadow()
{
int8 nTemp = 0;
int8 i = 0;
int8 tt = 0;
boolean bMoveY = TRUE;
m_tShadow.nRelativeX = m_nRelativePosX+m_pGameView->m_tPlayerShadow[m_nCurIndex].nSeekPosX;
m_tShadow.nPosX = m_nPosX+m_pGameView->m_tPlayerShadow[m_nCurIndex].nSeekPosX;
m_tShadow.nRelativeY = m_nRelativePosY;
m_tShadow.nPosY = m_tShadow.nRelativeY+1;
m_tShadow.nIndex = m_pGameView->m_tPlayerShadow[m_nCurIndex].nResIndex;
nTemp = (m_pGameView->m_tBmpData[m_tShadow.nIndex].nResWidth/SIGLE_MAP_WIDTH) + 2;
while (bMoveY)
{
for (i = 0; i < nTemp; i++)
{
tt = i*SIGLE_MAP_WIDTH;
if (i == nTemp - 1)
tt = m_pGameView->m_tBmpData[m_tShadow.nIndex].nResWidth;
bMoveY = m_pGameView->Moveable(m_tShadow.nRelativeX+tt, (m_tShadow.nRelativeY+1)+19);
if (bMoveY == FALSE)
break;
}
if (bMoveY)
{
if (m_tShadow.nRelativeY+20 <= SIGLE_MAP_HEIGHT*MAP_COW_INDEX)
{
m_tShadow.nRelativeY += 19;
m_tShadow.nPosY += 19;
}
else
{
m_tShadow.nRelativeY = SIGLE_MAP_HEIGHT*MAP_COW_INDEX-1;
m_tShadow.nPosY = (m_tShadow.nRelativeY-m_pGameView->m_nMapY)+1;
break;
}
}
else
{
m_tShadow.nRelativeY = (m_tShadow.nRelativeY/20 + 1)*20-1;
m_tShadow.nPosY = (m_tShadow.nRelativeY-m_pGameView->m_nMapY)+1;
break;
}
}
}
void CPlayer::HandleJump()
{
boolean bMoveY = FALSE;
int8 nRunDistanceY = 0;
int8 nDistanceY = 0;
switch (m_nCurDirectY)
{
case 0:// 上
{
if (m_nRunSpeedY <= 0)
{
m_nCurDoing = 4;
m_nRunDistanceY = 0;
m_nCurDoingNum = 0;
m_nDoingTimeNum = 0;
m_nRunTime = 1;//0;
break;
}
bMoveY = TRUE;
nRunDistanceY = m_nRunSpeedY*m_nRunTime+(WORLD_ACCELERATION*m_nRunTime*m_nRunTime)/2;
nDistanceY = nRunDistanceY-m_nRunDistanceY;
nDistanceY = (nDistanceY > 0)?(-nDistanceY):nDistanceY;
if (bMoveY)
{
m_nRunDistanceY = nRunDistanceY;
if (m_nRunTime > 0)
m_nRunSpeedY -= WORLD_ACCELERATION;
m_pGameView->m_nMapY += nDistanceY;
m_nRelativePosY += nDistanceY;
m_nPosY = INIT_POSY;
m_nRunTime++;
break;
}
}
break;
case 1:// 下
break;
}
}
void CPlayer::DrawShapeTrans(IDisplay *pIDisplay, AEERect *pRect, IBitmap *pTransBmp, RGBVAL rgbTransColor)
{
IBitmap* pMemScreen;
int16 x;
int16 y;
// NativeColor TransColor;
NativeColor ncScreen;
NativeColor ncTransBmp;
uint8 Screen[3];
uint8 TransBmp[3];
int8 A = 20;
IBITMAP_CreateCompatibleBitmap(m_pGameView->m_pScreen, &pMemScreen, pRect->dx, pRect->dy);
IBITMAP_BltIn(pMemScreen, 0, 0, pRect->dx, pRect->dy, m_pGameView->m_pScreen, pRect->x, pRect->y, AEE_RO_COPY);
IDISPLAY_BitBlt(pIDisplay, pRect->x, pRect->y, pRect->dx, pRect->dy, pTransBmp, 0, 0, AEE_RO_COPY);
// TransColor = IBITMAP_RGBToNative(m_pGameView->m_pScreen, rgbTransColor);
for ( x = 0; x < pRect->dx; x++)
{
for ( y = 0; y < pRect->dy; y++)
{
IBITMAP_GetPixel(pMemScreen, x, y, &ncScreen);
IBITMAP_GetPixel(m_pGameView->m_pScreen, x + pRect->x, y + pRect->y, &ncTransBmp);
if (ncTransBmp != rgbTransColor)//TransColor)
{
Screen[0] = (uint8)(ncScreen & 0x1F);
Screen[1] = (uint8)((ncScreen >>5) & 0x3F);
Screen[2] = (uint8)((ncScreen >>11) & 0x1F);
TransBmp[0] = (uint8)(ncTransBmp & 0x1F);
TransBmp[1] = (uint8)((ncTransBmp >>5) & 0x3F);
TransBmp[2] = (uint8)((ncTransBmp >>11) & 0x1F);
// Screen[0] = (Screen[0] >> 1) + (TransBmp[0] >> 1);
// Screen[1] = (Screen[1] >> 1) + (TransBmp[1] >> 1);
// Screen[2] = (Screen[2] >> 1) + (TransBmp[2] >> 1);
Screen[0] = (Screen[0] * (100 - A))/100 + (TransBmp[0] * A)/100;
Screen[1] = (Screen[1] * (100 - A))/100 + (TransBmp[1] * A)/100;
Screen[2] = (Screen[2] * (100 - A))/100 + (TransBmp[2] * A)/100;
ncScreen = (uint32)(Screen[2] << 11) + (uint32)(Screen[1] << 5) + (uint32)Screen[0];
}
IBITMAP_DrawPixel(m_pGameView->m_pScreen, x + pRect->x, y + pRect->y, ncScreen, AEE_RO_COPY);
}
}
IBITMAP_Release(pMemScreen);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -