📄 game_sprite.cpp
字号:
#include "runner_game.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
};
SPR_CHARACTER::SPR_CHARACTER()
{
pPathLink = NULL;
pCurrentPathLink = NULL;
m_iStepX = 0;
m_iStepY = 0;
}
SPR_CHARACTER::~SPR_CHARACTER()
{
Release();
}
VOID SPR_CHARACTER::Release()
{
DeletePathLink(&pPathLink);
}
BOOL SPR_CHARACTER::Init(SPR_INIT *pSprInit)
{
m_iWidth = pSprInit->iWidth;
m_iHeight = pSprInit->iHeight;
m_iOffsetAtGridX = pSprInit->iOffsetAtGridX;
m_iOffsetAtGridY = pSprInit->iOffsetAtGridY;
return TRUE;
}
BOOL SPR_CHARACTER::Run(GAME_SCENE *pScene)
{
ProcessPath(pScene);
return TRUE;
}
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;
return 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 + m_iOffsetAtGridX;
*piWorldY = iTempY + m_iOffsetAtGridY;
}
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -