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

📄 spr_character.cpp

📁 大家好!这是一个网络游戏源码
💻 CPP
字号:
#include "spr_character.h"
#include "d3d_app.h"
#include "graph.h"
#include "scene_view.h"

//从方向到格子的转换

int	DirToGrid[8][2] = 
{
	0  , -1 ,  //UP
	1  , -1 ,  //UP_LEFT
	1  ,  0 ,
	1  ,  1 ,
	0  ,  1 ,
   -1  ,  1 , 
   -1  ,  0 ,
   -1  , -1 ,
};

//从方向到象素点位移的转换
int  DirToStep[8][2] = 
{
	-2 , -1 , 
	-2 ,  0 ,
	-2 ,  1 ,
	 0 ,  2 ,
	 2 ,  1 ,
	 2 ,  0 ,
	 2 , -1 ,
	 0 , -2 ,
};

int DirToViewDir[8] = 
{
	6 ,	5 , 4 , 3 , 2 , 1 , 0 , 7 
};

BOOL SPR_CHARACTER::Run(GAME_SCENE *pScene)
{
	return ProcessPath(pScene);
}

BOOL SPR_CHARACTER::ProcessPath(GAME_SCENE *pScene)
{
   	
	//如果当前位置 = 下一个应该在的位置....
	if( (m_iWorldX==m_iNextWorldX) && (m_iWorldY==m_iNextWorldY) )
	{
		//设为停止
		m_iStepX = 0;
		m_iStepY = 0;
		
		//格子坐标相等
		m_iGridX = m_iNextGridX;
		m_iGridY = m_iNextGridY;
		
		if(pCurrentPathLink) //如果还有步数
		{
	  		
			// 取得下一步信息
	        PATH_LINK *pNextPath = pCurrentPathLink->next_path_ptr;
	        
			m_iSprDire		= pCurrentPathLink->dire;
			m_iNextGridX	= m_iGridX + DirToGrid[m_iSprDire][0];
			m_iNextGridY	= m_iGridY + DirToGrid[m_iSprDire][1];
	        m_iStepX		= DirToStep[m_iSprDire][0] ;
			m_iStepY		= DirToStep[m_iSprDire][1] ;
           	
			//设置下一个位置(世界坐标系)
			GridToWorld(pScene , m_iNextGridX , m_iNextGridY , &m_iNextWorldX , &m_iNextWorldY); 
			
			// 重新排序
			//m_iResortOff	=	m_iGridY * pScene->gridWorld.GetWorldGridWidth() + m_iGridX;
			//if(m_boInView)	g_SprMgr->ResortLinkAdd(this);

			pCurrentPathLink = pNextPath;
		}
		else //没有路径
		{
			//目标格不是当前格
			if(m_iDestGridX!=m_iGridX||m_iDestGridY!=m_iGridY)
			{
				DeletePathLink(&pPathLink);
				pScene->ResetPathBlockBuffer();
				pPathLink = SearchPath(pScene->pbBlockPath		, 
				        pScene->gridWorld.GetWorldGridWidth()	,
						pScene->gridWorld.GetWorldGridHeight()  ,
					    m_iGridX		    					,	 
					    m_iGridY								,	
					    m_iDestGridX							, 
					    m_iDestGridY);
			
			    pCurrentPathLink = pPathLink;
				if(pPathLink==NULL) //没有找到路径
				{
				}		
			
			}
		}
	}
	
	m_iWorldX+=m_iStepX;
	m_iWorldY+=m_iStepY;
	
	sprintf(strPathInfo , "(%d %d)-(%d %d)" , m_iWorldX , m_iWorldY , m_iNextWorldX , m_iNextWorldY);
	
	return TRUE;
}

extern LPDIRECTDRAWSURFACE7 pChaSurface;

extern SCENE_VIEW *g_pSceneView;

VOID SPR_CHARACTER::DrawPath(GAME_SCENE *pScene)
{
    
	/*OutputText(m_iWorldX  - pScene->iViewInWorldStartX	, 
               m_iWorldY  - pScene->iViewInWorldStartY	,
               "*" , RGB(255 , 0 , 0));
	*/
	/*
		
	PATH_LINK *pTempPathLink = pCurrentPathLink; 
	
	int iNextGridX = m_iNextGridX;
	int iNextGridY = m_iNextGridY;
	
	while(pTempPathLink!=NULL)
	{
	    int d = pTempPathLink->dire;
		iNextGridX = iNextGridX + DirToGrid[d][0];
		iNextGridY = iNextGridY + DirToGrid[d][1];
		int iWorldX , iWorldY;
		pScene->gridWorld.GridToWorld(iNextGridX , iNextGridY , &iWorldX , &iWorldY);
		
		OutputText(iWorldX - g_pSceneView->iViewAtWorldX - 4 , 
                   iWorldY - g_pSceneView->iViewAtWorldY + pScene->gridWorld.GetGridSizeY() / 2 - 4 ,
                   "*" , RGB(0 , 255 , 0));
		pTempPathLink = pTempPathLink->next_path_ptr;
	}

	DrawChaSurface(pChaSurface , m_iWorldX  - g_pSceneView->iViewAtWorldX , 
								 m_iWorldY  - g_pSceneView->iViewAtWorldY , 
								 DirToViewDir[m_iSprDire]);
	*/
	RECT rc;
	rc.left	  = m_iWorldX;
	rc.right  = m_iWorldX + 64;
	rc.top	  = m_iWorldY;
	rc.bottom = m_iWorldY + 96;
	pScene->SetCoverRedrawValue(rc , 1);  
	
	/*
	int iStartRectX = (m_iWorldX - pSceneView->iMapStartX) / 32;
	int iStartRectY = (m_iWorldY - pSceneView->iMapStartY) / 16;

	int iEndRectX	= (m_iWorldX - pScene->iMapStartX) / 32 + 2;
	int iEndRectY	= (m_iWorldY - pScene->iMapStartY) / 16 + 6;
	
	for(int y = iEndRectY ; y >= iStartRectY; y--)
	{
	   for(int x = iStartRectX ; x <= iEndRectX ; x++)
	   {
			int iRectOff = y * 25 + x;
			if(iRectOff>=0)
			{
			   int iHeight = *(pScene->pdwCoverAttr + iRectOff) & 127;
			   if(iHeight >= (iEndRectY - y) )
			   {
			      RECT rcSrc;
				  rcSrc.left	= x * 32;
				  rcSrc.right	= rcSrc.left + 32;
				  rcSrc.top		= y * 16;
				  rcSrc.bottom	= rcSrc.top + 16;
				  
				  RECT rcView; 
				  rcView.left	= 0;
				  rcView.right	= g_iViewWidth;
				  rcView.top    = 0;
				  rcView.bottom = g_iViewHeight;

				  RECT rc1 , rc2;
				  Blit_GetValidRect(&rc1 , &rc2 ,
									pScene->iMapStartX + rcSrc.left - pScene->iViewInWorldStartX ,
									pScene->iMapStartY + rcSrc.top  - pScene->iViewInWorldStartY ,
				 					rcView , rcSrc);

				  g_pddsRenderTarget->Blt(&rc1 , pScene->psurCover , &rc2 , DDBLT_WAIT|DDBLT_KEYSRC , NULL);
				  
				  //BltSurfaceRect( pScene->iMapStartX + rcSrc.left - pScene->iViewInWorldStartX ,
				//				  pScene->iMapStartY + rcSrc.top  - pScene->iViewInWorldStartY ,
				//				  pScene->psurCover , rcSrc , TRUE);
			   }
			}
	   }
	}*/
	
	
}

VOID SPR_CHARACTER::GridToWorld(GAME_SCENE *pScene , int x , int y , int *piWorldX , int *piWorldY)
{
	int iTempX , iTempY;
	pScene->gridWorld.GridToWorld(x , y , &iTempX , &iTempY);
	*piWorldX	= iTempX - 32;
	*piWorldY	= iTempY + pScene->gridWorld.GetGridSizeY()  / 2 - 80;
}

VOID SPR_CHARACTER::Dest(GAME_SCENE *pScene , int x , int y)
{ 
	if(pScene->gridWorld.GetGridValue(x , y) || !pScene->gridWorld.IsGridValid(x , y))	return;
	m_iDestGridX = x;
	m_iDestGridY = y;
	DeletePathLink(&pPathLink);
    pCurrentPathLink = pPathLink;
}

VOID SPR_CHARACTER::Location(GAME_SCENE *pScene , int x , int y , int dire)
{
	if(pScene->gridWorld.GetGridValue(x , y) || !pScene->gridWorld.IsGridValid(x , y))	return;
	m_iSprDire	 = dire;
	m_iGridX	 = x; 
	m_iGridY	 = y; 
	m_iNextGridX = m_iGridX;
	m_iNextGridY = m_iGridY;
	m_iDestGridX = m_iGridX;
	m_iDestGridY = m_iGridY;
	GridToWorld(pScene , m_iGridX , m_iGridY , &m_iWorldX , &m_iWorldY);
	m_iNextWorldX = m_iWorldX;
	m_iNextWorldY = m_iWorldY;
	DeletePathLink(&pPathLink);
    pCurrentPathLink = pPathLink; 
}


SPR_CHARACTER::~SPR_CHARACTER()
{
	DeletePathLink(&pPathLink);
}

⌨️ 快捷键说明

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