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

📄 player.cpp

📁 看到有兄弟提出的半透明算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:

				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 + -