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

📄 role.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		else
			g_objGameMap.World2Cell(m_Info.posActionBegin.x, m_Info.posActionBegin.y, posPreStep.x, posPreStep.y);

		m_Info.posMap = posPreStep;

		if (g_objGameMap.IsPosVisible(m_Info.posMap, 2))
			g_objGameMap.ApplyObjShow(this);

		m_Info.posMap = posCurrent;
	}
	else
	{
		if (g_objGameMap.IsPosVisible(m_Info.posMap, 2))
			g_objGameMap.ApplyObjShow(this);
	}

	m_objFStr.Process();
}

//--------------------------------------------------------------
void CRole::Show()
{
	if(m_dwDisappear != 0 && (::TimeGet() - m_dwDisappear) < m_dwDisappearLast && m_dwDisappearLast != 0)
	{
		int nOffsetY = 0;
		nOffsetY += m_Info.nFlyOffset;
		int nBgX, nBgY;
		g_objGameMap.World2Bg(m_Info.posWorld.x, m_Info.posWorld.y, nBgX, nBgY);
		CMyPos posWorld;
		posWorld.x = nBgX;
		posWorld.y = nBgY-nOffsetY;
		m_objEffect.Show(posWorld);
		return;
	}

	if ((m_dwStatus & USERSTATUS_INVISIBLE) == USERSTATUS_INVISIBLE)
		return;

	if (!m_pIRoleView)
		return;

	{
		int nBgX, nBgY;
		g_objGameMap.World2Bg(m_Info.posWorld.x, m_Info.posWorld.y, nBgX, nBgY);

		int nOffsetY = 0;
		int nShadowY = 0;
		switch(this->GetActionType())
		{
		case _ACTION_JUMP:
			{
// 				if(!this->TestStatus(USERSTATUS_FLY))
				{
					nOffsetY = this->GetJumpHeight();
					nShadowY = this->GetJumpShadowHeight();
				}
				//nOffsetY -= g_objGameMap.GetBaseAltitude(m_Info.posMap);
			}
			break;
		case _ACTION_WALKL:
		case _ACTION_WALKR:
		case _ACTION_RUNL:
		case _ACTION_RUNR:
			{
			//	nOffsetY = this->GetWalkHeight();
			}
			break;
		default:
			//nOffsetY = g_objGameMap.GetAltitude(m_Info.posMap)- g_objGameMap.GetBaseAltitude(m_Info.posMap);
			break;
		}
		//m_Info.nFlyOffset = 100;
		nOffsetY += m_Info.nFlyOffset;
		nShadowY -= m_Info.nFlyOffset;
		int nRotate	= -45*m_Info.iDirection-45;
		if(m_Info.bAdjustDir && (_ACTION_RUNL == m_Info.iActType || _ACTION_RUNR == m_Info.iActType))
		{
			int nDeltaX = (m_Info.posActionEnd.x - m_Info.posDir.x);
			int nDeltaY = (m_Info.posActionEnd.y - m_Info.posDir.y);
			double dAtan = atan2((double)nDeltaX, (double)nDeltaY);
			nRotate = (180.0 * dAtan)/3.1415926 + 90;
		}
		if (m_Info.bAdjustDir &&(m_Info.posActionBegin.x != m_Info.posDir.x 
			|| m_Info.posActionBegin.y != m_Info.posDir.y))
		{
			if (_ACTION_RUNL != m_Info.iActType 
				&& _ACTION_RUNR != m_Info.iActType && 
				_ACTION_WALKL != m_Info.iActType
				&& _ACTION_WALKR != m_Info.iActType)
			{
				int nDeltaX = -(m_Info.posActionEnd.x - m_Info.posDir.x);
				int nDeltaY = m_Info.posActionEnd.y - m_Info.posDir.y;
				
				double dAtan = atan2((double)nDeltaY, (double)nDeltaX);
				nRotate = (180.0 * dAtan)/3.1415926 + 90;
			}
			
			if(_ACTION_RUNL == m_Info.iActType 
				|| _ACTION_RUNR == m_Info.iActType)
			{
				int nDeltaX = -(m_Info.posActionBegin.x - m_Info.posDir.x);
				int nDeltaY = m_Info.posActionBegin.y - m_Info.posDir.y;
				
				double dAtan = atan2((double)nDeltaY, (double)nDeltaX);
				nRotate = (180.0 * dAtan)/3.1415926 + 90;
			}
		}
		
		
		float fScale = s_fBaseScale*this->GetZoomPercent()/100.0f;
	//	fScale = 0.75f*this->GetZoomPercent()/100.0f;

		static float rscale = s_fBaseScale;
		if(this->GetLook() == 1 && this->TestStatus(USERSTATUS_ATTACK))
		{
			if ( rscale < 0.85)
				rscale += 0.01f;
			else
				rscale = 0.85f;
			fScale = rscale*this->GetZoomPercent()/100.0f;
		}
		if (this->GetLook() == 1&& rscale > s_fBaseScale && !this->TestStatus(USERSTATUS_ATTACK)) 
		{
			if (rscale > s_fBaseScale) 
				rscale -= 0.01f;
			else
				rscale = s_fBaseScale;
			fScale = rscale*this->GetZoomPercent()/100.0f;
		}

		if(this->GetCommandType() == _COMMAND_INTONE)
			nShadowY = -m_Info.nZ;
		else 
			m_Info.nZ = 0;
		m_pIRoleView->SetPos(nBgX, nBgY-nOffsetY, nShadowY, nRotate, fScale);

		// shadow...
//		s_nShadowType = SHADOW_REAL;
		if (s_nShadowType == SHADOW_SIMPLE && 
				!this->TestStatus(USERSTATUS_GHOST) && 
				this->GetViewType() != _ROLE_VIEW_TERRAIN)
		{
			CAni* pAni = g_objGameDataSet.GetDataAni("ani/common.ani", "SimpleShadow");
			if (pAni)
			{
				int nShowX = 0, nShowY =0;
				g_objGameMap.World2Screen(m_Info.posWorld.x, m_Info.posWorld.y, nShowX, nShowY);

				CMyBitmap* pBmp = pAni->GetFrame(0);
				if (pBmp)
				{
					int nAlpha = 255;
					if (m_tmDisappear != 0)
					{
						DWORD dwTimeGoesBy = ::TimeGet()-m_tmDisappear;
						nAlpha = 256-50*dwTimeGoesBy/1000;
						if (nAlpha < 0)
							nAlpha = 0;
					}
					CMyPos posShadow = {nShowX-32, nShowY-16-nShadowY-nOffsetY};
					g_objGameMap.MapScaleShowPos(posShadow.x, posShadow.y);
					CMySize sizeShadow;
					pBmp->GetSize(sizeShadow.iWidth, sizeShadow.iHeight);
					sizeShadow.iWidth = sizeShadow.iWidth*g_objGameMap.GetScale()/_NORMAL_SCALE;
					sizeShadow.iHeight = sizeShadow.iHeight*g_objGameMap.GetScale()/_NORMAL_SCALE;
					pBmp->ShowEx(posShadow.x, posShadow.y, NULL, sizeShadow.iWidth, sizeShadow.iHeight, nAlpha);
				}
			}
		}

		CMyPos posView;
		g_objGameMap.GetViewPos(posView);
	
		int nViewportBgX, nViewportBgY;
		g_objGameMap.World2Bg(posView.x, posView.y, nViewportBgX, nViewportBgY);
		
		m_pIRoleView->SetAction(this->GetActionType(), false);
		m_pIRoleView->SetVariable(_VAR_STATUS, this->GetStatus());
		m_pIRoleView->SetVariable(_VAR_FRAME, m_Info.iActFrameIndex);


		float alpha			= 1.0f;
		float alphaShadow	= 0.8f;

		if (m_tmDisappear != 0)
		{
			DWORD dwTimeGoesBy = ::TimeGet()-m_tmDisappear;

			alpha = 1.0-0.2*dwTimeGoesBy/1000;
			if (alpha < 0.0)
				alpha = 0.0;

			alphaShadow = 0.8-0.15*dwTimeGoesBy/1000;
			if (alphaShadow < 0.0)
				alphaShadow = 0.0;
		}

		union
		{
			DWORD dwColor;
			struct
			{
				unsigned char ucAlpha;
				unsigned char ucRed;
				unsigned char ucGreen;
				unsigned char ucBlue;
			}InfoColor;
		};
		dwColor = g_objGameMap.GetARGB();
		float fColor = 0.1 * (InfoColor.ucRed + InfoColor.ucGreen + InfoColor.ucBlue)/(255*3);

		if (this->TestStatus(USERSTATUS_GHOST) && !this->IsPet())
			m_pIRoleView->SetLightOffset(SHADOW_NONE, 300, -300, -1000, 0.8f, fColor, fColor, fColor);
		else
			m_pIRoleView->SetLightOffset(CRole::s_nShadowType, 300, -300, -1000, alphaShadow, fColor, fColor, fColor);


		unsigned char ucA, ucR, ucG, ucB;
			
		ucA = m_dwARGB >> 24;
		ucR = (m_dwARGB & 0x00ff0000) >> 16;
		ucG = (m_dwARGB & 0x0000ff00) >> 8;
		ucB = m_dwARGB & 0x000000ff;
		if ((this->TestStatus(USERSTATUS_GHOST) || this->TestStatus(USERSTATUS_LURKER)) && !this->IsPet())
			m_pIRoleView->SetRGBA(1.0*ucA/(255*alpha*2), 1.0*ucR/255, 1.0*ucG/255, 1.0*ucB/255);
		else
			m_pIRoleView->SetRGBA(1.0*ucA/255*alpha, 1.0*ucR/255, 1.0*ucG/255, 1.0*ucB/255);
		

		m_pIRoleView->Draw(nViewportBgX, nViewportBgY);

		// show effect
		this->ShowAniEffect(m_Info.posScr.x, m_Info.posScr.y-nOffsetY);

		// show dialog ...
		int nDialogDir = this->GetDir();
		if(m_Info.posScr.x < 100)
			nDialogDir = 1;

		if(m_Info.posScr.x > _SCR_WIDTH - 100)
			nDialogDir = 5;

		g_objGameMap.World2Screen(m_Info.posWorld.x, m_Info.posWorld.y, m_Info.posScr.x, m_Info.posScr.y);
		m_objSayHello.ShowWords(m_Info.posScr.x, m_Info.posScr.y-nOffsetY, nDialogDir);

		CMyPos posFStr;
		posFStr.x = m_Info.posScr.x;
		posFStr.y = m_Info.posScr.y-nOffsetY-100;
		m_objFStr.Show(posFStr);


		CMyPos posWorld;
		posWorld.x = nBgX;
		posWorld.y = nBgY-nOffsetY;		

		// Test code
		int test = 0;
		if (test == 1)
		if ( this->GetID() == g_objHero.GetID() )
		{
			posWorld.y -= 100;
			
			static BOOL s_bOK = true;
			static CMyPos s_posEnd = posWorld;
			static CMyPos s_posBegin;
			static float s_fRadii;
			static DWORD s_dwBeginTime;
			static float s_fTime;
			static BOOL s_bDir;
			
			// Get a random position
			if ( s_bOK )
			{
				s_posBegin = s_posEnd;
				
				int nRandX = ::RandGet( 60 );
				int nRandY = ::RandGet( 60 );
				switch ( ::RandGet( 4 ) )
				{
				case 0:
					s_posEnd.x = posWorld.x + nRandX;
					s_posEnd.y = posWorld.y + nRandY;
					break;
				case 1:
					s_posEnd.x = posWorld.x - nRandX;
					s_posEnd.y = posWorld.y - nRandY;
					break;
				case 2:
					s_posEnd.x = posWorld.x + nRandX;
					s_posEnd.y = posWorld.y - nRandY;
					break;
				case 3:
					s_posEnd.x = posWorld.x - nRandX;
					s_posEnd.y = posWorld.y + nRandY;
					break;
				default:
					break;
				}
				
				s_fRadii = ( 60 + ::RandGet( 60 ) ) / 100;
				s_dwBeginTime = ::TimeGet();
				s_bDir = ::TimeGet() % 2;
				s_bOK = false;
				posWorld = s_posBegin;
			}
			
			s_fTime = ( ::TimeGet() - s_dwBeginTime ) * 3.0f / 100;
			if ( s_fTime != 0 )
				s_bOK = CPhysics::S2DCMGetPos( 30, 0, s_fTime, s_fRadii, s_posBegin, s_posEnd, posWorld, s_bDir );
		}
		if(this->GetViewType() != _ROLE_VIEW_ROLE)
			m_objEffect.Show(posWorld);
		
	}
	//CMyBitmap::ClearBuffer(true, false, 0);
}

//--------------------------------------------------------------
int CRole::GetWalkHeight()
{
	CMyPos posBegin, posEnd;
	g_objGameMap.World2Cell(m_Info.posActionBegin.x, m_Info.posActionBegin.y, 
								posBegin.x, posBegin.y);
	g_objGameMap.World2Cell(m_Info.posActionEnd.x, m_Info.posActionEnd.y, 
								posEnd.x, posEnd.y);
	CellInfo* pCellBegin = g_objGameMap.GetCell(posBegin.x, posBegin.y);
	CellInfo* pCellEnd = g_objGameMap.GetCell(posEnd.x, posEnd.y);
	
	int nOffsetY = 0;
	if(pCellBegin && pCellEnd)
	{

		int nHeightDef = g_objGameMap.GetGroundAltitude(pCellBegin) -
						 g_objGameMap.GetBaseAltitude(posBegin) -
						 g_objGameMap.GetGroundAltitude(pCellEnd) +
						 g_objGameMap.GetBaseAltitude(posEnd);
		
		double dbDicAll = sqrt(
			(m_Info.posActionBegin.x- m_Info.posActionEnd.x) * 
			(m_Info.posActionBegin.x - m_Info.posActionEnd.x) +
			(m_Info.posActionBegin.y - m_Info.posActionEnd.y) * 
			(m_Info.posActionBegin.y - m_Info.posActionEnd.y)
			);
		CMyPos posWorld; 
		this->GetWorldPos(posWorld);
		double dbDicNow = sqrt(
			(m_Info.posActionBegin.x- posWorld.x) * 
			(m_Info.posActionBegin.x - posWorld.x) +
			(m_Info.posActionBegin.y - posWorld.y) * 
			(m_Info.posActionBegin.y - posWorld.y)
			);
		double dbOffsetY;
		dbOffsetY = nHeightDef * dbDicNow / dbDicAll; 
		nOffsetY = (int)dbOffsetY;
	}
	int nAltitude = g_objGameMap.GetGroundAltitude(pCellBegin)-g_objGameMap.GetBaseAltitude(posBegin) - nOffsetY;
	return nAltitude;
}
//--------------------------------------------------------------

int	CRole::GetJumpHeight()
{
	DEQUE_CELL setCell;
	CMyPos posHighest;

	CMyPos posBegin, posEnd;
	g_objGameMap.World2Cell(m_Info.posActionBegin.x, m_Info.posActionBegin.y, 
								posBegin.x, posBegin.y);
	g_objGameMap.World2Cell(m_Info.posActionEnd.x, m_Info.posActionEnd.y, 
								posEnd.x, posEnd.y);


	g_objGameMap.Sampling(setCell, posHighest, posBegin, posEnd, 32);

	// Get the highest altitude
	CellInfo* pBeginCell = g_objGameMap.GetCell(posBegin.x, posBegin.y);
	if(!pBeginCell)
		return 0;

	CellInfo* pEndCell = g_objGameMap.GetCell(posEnd.x, posEnd.y);
	if(!pEndCell)
		return 0;

	CellInfo* pHighestCell = g_objGameMap.GetCell(posHighest.x, posHighest.y);
	if(!pHighestCell)
		return 0;


	// 取三个点
	int nHightestAltitude = g_objGameMap.GetGroundAltitude(pHighestCell) - g_objGameMap.GetBaseAltitude(posHighest);

	int nBeginAltitude = g_objGameMap.GetGroundAltitude(pBeginCell) - g_objGameMap.GetBaseAltitude(posBegin);
	
	int nEndAltitude = g_objGameMap.GetGroundAltitude(pEndCell) - g_objGameMap.GetBaseAltitude(posEnd);
	
	// 判断有没有最高点或者最高点小于缺省高度, 取中间点为最高点, 
	BOOL bHaveHighestPoint = false;
	if(nHightestAltitude > nBeginAltitude)
		bHaveHighestPoint = true;



	// 计算最高点的世界坐标
	CMyPos posHighestWorldPos, posBeginWorldPos, posEndWorldPos;
	posBeginWorldPos = m_Info.posActionBegin;
	posEndWorldPos = m_Info.posActionEnd;
	if(bHaveHighestPoint)
	{
		g_objGameMap.Cell2World(posHighest.x, posHighest.y, posHighestWorldPos.x, posHighestWorldPos.y);
	}

	nHightestAltitude = nHightestAltitude + sqrt((posBeginWorldPos.x - posEndWorldPos.x) * (posBeginWorldPos.x - posEndWorldPos.x) +
			(posBeginWorldPos.y - posEndWorldPos.y) * (posBeginWorldPos.y - posEndWorldPos.y))/3;

	posHighestWorldPos.x = (posBeginWorldPos.x + posEndWorldPos.x)/2;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -