📄 spr_character.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 + -