📄 maphandler.cpp
字号:
/******************************************************************************************************************
葛碘疙:
累己磊:
累己老:
[老磊][荐沥磊] : 荐沥 郴侩
*******************************************************************************************************************/
#include "StdAfx.h"
/******************************************************************************************************************
窃荐疙 : CMapHandler::CMapHandler()
累己磊 :
累己老 :
格利 :
免仿 :
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
CMapHandler::CMapHandler()
{
InitMapHandler();
}
/******************************************************************************************************************
窃荐疙 : CMapHandler::~CMapHandler()
累己磊 :
累己老 :
格利 :
免仿 :
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
CMapHandler::~CMapHandler()
{
DestroyMapHandler();
}
/******************************************************************************************************************
窃荐疙 : CMapHandler::InitMapHandler()
累己磊 :
累己老 :
格利 :
免仿 : VOID
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
VOID CMapHandler::InitMapHandler()
{
m_pstTileInfo = NULL;
m_pstCellInfo = NULL;
// m_pstDoorInfo = NULL;
// m_pbCellIDoorIdx = NULL;
m_shStartViewTileX = 0;
m_shStartViewTileY = 0;
m_shViewOffsetX = 0;
m_shViewOffsetY = 0;
// m_bDoorCount = 0;
m_ptMovePixelArray[0].x = 8; m_ptMovePixelArray[0].y = 5;
m_ptMovePixelArray[1].x = 16; m_ptMovePixelArray[1].y = 11;
m_ptMovePixelArray[2].x = 24; m_ptMovePixelArray[2].y = 16;
m_ptMovePixelArray[3].x = 32; m_ptMovePixelArray[3].y = 21;
m_ptMovePixelArray[4].x = 40; m_ptMovePixelArray[4].y = 27;
m_ptMovePixelArray[5].x = 48; m_ptMovePixelArray[5].y = 32;
ZeroMemory(m_wSavedMapBuffer, sizeof(WORD)*_VIEW_CELL_X_COUNT*_CELL_WIDTH*_VIEW_CELL_Y_COUNT*_CELL_HEIGHT);
ZeroMemory(m_bAniTileFrame, sizeof(BYTE)*8*16);
ZeroMemory(m_dwAniSaveTime, sizeof(DWORD)*8);
ZeroMemory(&m_stMapFileHeader, sizeof(MAPFILEHEADER));
SetRect(&m_rcView, 0, 0, _VIEW_CELL_X_COUNT*_CELL_WIDTH, _VIEW_CELL_Y_COUNT*_CELL_HEIGHT);
ZeroMemory(m_pxTileImg, sizeof(CWHWilImageData*)*_MAX_TILE_FILE);
}
VOID CMapHandler::LoadMapHandler(CHAR* szMapFile, CImageHandler* pxImgHandler, INT nX, INT nY)
{
InitMapHandler();
LoadMapData(szMapFile);
LoadMapImage(pxImgHandler);
LoadNewMapBuffer();
SetStartViewTile(nX, nY);
}
/******************************************************************************************************************
窃荐疙 : CMapHandler::DestroyMapHandler()
累己磊 :
累己老 :
格利 :
免仿 : VOID
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
VOID CMapHandler::DestroyMapHandler()
{
// INT nCnt;
SAFE_DELETE(m_pstTileInfo);
SAFE_DELETE(m_pstCellInfo);
/* for ( nCnt = 0; nCnt < m_bDoorCount; nCnt++ )
{
SAFE_DELETE(m_pstDoorInfo[nCnt].pstDoorImgInfo);
}
SAFE_DELETE(m_pstDoorInfo);
SAFE_DELETE(m_pbCellIDoorIdx);*/
InitMapHandler();
}
/******************************************************************************************************************
窃荐疙 : CMapHandler::LoadNewMapBuffer()
累己磊 :
累己老 :
格利 :
免仿 : VOID
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
VOID CMapHandler::LoadNewMapBuffer()
{
INT nFileIdx, nImgIdx;
INT nXCnt, nYCnt;
ZeroMemory(m_wSavedMapBuffer, sizeof(WORD)*_VIEW_CELL_X_COUNT*_CELL_WIDTH*_VIEW_CELL_Y_COUNT*_CELL_HEIGHT);
for ( nXCnt = m_shStartViewTileX; nXCnt < m_shStartViewTileX+_VIEW_CELL_X_COUNT; nXCnt++ )
for ( nYCnt = m_shStartViewTileY; nYCnt < m_shStartViewTileY+_VIEW_CELL_Y_COUNT; nYCnt++ )
{
if ( nXCnt >= m_stMapFileHeader.shWidth || nYCnt >= m_stMapFileHeader.shHeight || nXCnt < 0 || nYCnt < 0 )
continue;
if( !( nXCnt % 2 ) && !( nYCnt % 2 ) && nYCnt < m_shStartViewTileY+_VIEW_CELL_Y_COUNT )
{
nFileIdx= m_pstTileInfo[(nYCnt/2) + (nXCnt/2)*m_stMapFileHeader.shHeight/2].bFileIdx;
nImgIdx = m_pstTileInfo[(nYCnt/2) + (nXCnt/2)*m_stMapFileHeader.shHeight/2].wTileIdx;
if( nFileIdx != 255 && nImgIdx != 65535 )
{
m_pxTileImg[nFileIdx]->NewSetIndex(nImgIdx);
g_xMainWnd.DrawWithImageForCompMemToMem(
(nXCnt-m_shStartViewTileX)*_CELL_WIDTH ,
(nYCnt-m_shStartViewTileY)*_CELL_HEIGHT,
m_pxTileImg[nFileIdx]->m_lpstNewCurrWilImageInfo->shWidth,
m_pxTileImg[nFileIdx]->m_lpstNewCurrWilImageInfo->shHeight,
(WORD*)m_pxTileImg[nFileIdx]->m_pbCurrImage,
_VIEW_CELL_X_COUNT*_CELL_WIDTH, _VIEW_CELL_Y_COUNT*_CELL_HEIGHT, m_wSavedMapBuffer);
}
}
}
}
/******************************************************************************************************************
窃荐疙 : CMapHandler::LoadMapData()
累己磊 :
累己老 :
格利 :
涝仿 : CHAR* szMapFile
免仿 : BOOL
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
BOOL CMapHandler::LoadMapData(CHAR* szMapFile)
{
HANDLE hFile;
char szFullPath[128];
sprintf(szFullPath, ".\\Map\\%s.map", szMapFile);
hFile = CreateFile(szFullPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ( hFile != INVALID_HANDLE_VALUE )
{
DWORD dwReadLen;
FreeMapData();
ReadFile(hFile, &m_stMapFileHeader, sizeof(MAPFILEHEADER), &dwReadLen, NULL);
m_pstTileInfo = new TILEINFO[(m_stMapFileHeader.shWidth*m_stMapFileHeader.shHeight)/4];
ReadFile(hFile, m_pstTileInfo, sizeof(TILEINFO)*(m_stMapFileHeader.shWidth*m_stMapFileHeader.shHeight)/4, &dwReadLen, NULL);
m_pstCellInfo = new CELLINFO[m_stMapFileHeader.shWidth*m_stMapFileHeader.shHeight];
ReadFile(hFile, m_pstCellInfo, sizeof(CELLINFO)*(m_stMapFileHeader.shWidth*m_stMapFileHeader.shHeight), &dwReadLen, NULL);
LoadNewMapBuffer();
// ReadFile(hFile, &m_bDoorCount, sizeof(BYTE), &dwReadLen, NULL);
/* m_pstDoorInfo = new DOORINFO[m_bDoorCount];
for ( INT nCnt = 0; nCnt < m_bDoorCount; nCnt++ )
{
ReadFile(hFile, &m_pstDoorInfo[nCnt], sizeof(DOORINFO), &dwReadLen, NULL);
m_pstDoorInfo[nCnt].pstDoorImgInfo = new DOORIMAGEINFO[m_pstDoorInfo[nCnt].bDoorImgCnt];
for ( INT nLoop = 0; nLoop < m_pstDoorInfo[nCnt].bDoorImgCnt; nLoop++ )
{
ReadFile(hFile, &m_pstDoorInfo[nCnt].pstDoorImgInfo[nLoop], sizeof(DOORIMAGEINFO), &dwReadLen, NULL);
}
}
m_pbCellIDoorIdx = new BYTE[m_stMapFileHeader.shWidth*m_stMapFileHeader.shHeight];
ZeroMemory(m_pbCellIDoorIdx, sizeof(BYTE)*m_stMapFileHeader.shWidth*m_stMapFileHeader.shHeight);
SetDoorIndex();
*/
CloseHandle(hFile);
return TRUE;
}
return FALSE;
}
/******************************************************************************************************************
窃荐疙 : CMapHandler::LoadMapImage(CImageHandler* pxImgHandler)
累己磊 :
累己老 :
格利 :
免仿 : VOID
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
VOID CMapHandler::LoadMapImage(CImageHandler* pxImgHandler)
{
m_pxTileImg[0] = &(pxImgHandler->m_xImageList[_IMAGE_TILES]);
m_pxTileImg[1] = &(pxImgHandler->m_xImageList[_IMAGE_TILES30]);
m_pxTileImg[2] = &(pxImgHandler->m_xImageList[_IMAGE_TILES5]);
m_pxTileImg[3] = &(pxImgHandler->m_xImageList[_IMAGE_SMTILES]);
m_pxTileImg[4] = &(pxImgHandler->m_xImageList[_IMAGE_HOUSES]);
m_pxTileImg[5] = &(pxImgHandler->m_xImageList[_IMAGE_CLIFFS]);
m_pxTileImg[6] = &(pxImgHandler->m_xImageList[_IMAGE_DUNGEONS]);
m_pxTileImg[7] = &(pxImgHandler->m_xImageList[_IMAGE_INNERS]);
m_pxTileImg[8] = &(pxImgHandler->m_xImageList[_IMAGE_FUNITURES]);
m_pxTileImg[9] = &(pxImgHandler->m_xImageList[_IMAGE_WALLS]);
m_pxTileImg[10] = &(pxImgHandler->m_xImageList[_IMAGE_SMOBJECTS]);
m_pxTileImg[11] = &(pxImgHandler->m_xImageList[_IMAGE_ANIMATIONS]);
m_pxTileImg[12] = &(pxImgHandler->m_xImageList[_IMAGE_OBJECT1]);
m_pxTileImg[13] = &(pxImgHandler->m_xImageList[_IMAGE_OBJECT2]);
}
/******************************************************************************************************************
窃荐疙 : CMapHandler::FreeMapData()
累己磊 :
累己老 :
格利 :
免仿 : VOID
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
VOID CMapHandler::FreeMapData()
{
ZeroMemory(&m_stMapFileHeader, sizeof(MAPFILEHEADER));
ZeroMemory(m_wSavedMapBuffer, sizeof(WORD)*_VIEW_CELL_X_COUNT*_CELL_WIDTH*_VIEW_CELL_Y_COUNT*_CELL_HEIGHT);
SAFE_DELETE(m_pstTileInfo);
SAFE_DELETE(m_pstCellInfo);
/* for ( INT nCnt = 0; nCnt < m_bDoorCount; nCnt++ )
{
SAFE_DELETE(m_pstDoorInfo[nCnt].pstDoorImgInfo);
}
SAFE_DELETE(m_pstDoorInfo);
SAFE_DELETE(m_pbCellIDoorIdx);
m_bDoorCount = 0;*/
}
/******************************************************************************************************************
窃荐疙 : CMapHandler::ScrollMap()
累己磊 :
累己老 :
格利 :
涝仿 : INT nCharDir
INT nCharFrame
INT nSpeed
免仿 : VOID
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
VOID CMapHandler::ScrollMap(INT nCharDir, INT nCharFrame, INT nSpeed)
{
nCharFrame %= 10;
switch ( nCharDir )
{
// 流急 困肺 捞悼.
case _DIRECTION_LIST_1:
m_shViewOffsetY = -(m_ptMovePixelArray[nCharFrame].y * nSpeed);
break;
// 坷弗率困肺 捞悼.
case _DIRECTION_LIST_2:
m_shViewOffsetX = (m_ptMovePixelArray[nCharFrame].x * nSpeed);
m_shViewOffsetY = -(m_ptMovePixelArray[nCharFrame].y * nSpeed);
break;
// 坷弗率栏肺 捞悼.
case _DIRECTION_LIST_3:
m_shViewOffsetX = (m_ptMovePixelArray[nCharFrame].x * nSpeed);
break;
// 坷弗率酒贰肺 捞悼.
case _DIRECTION_LIST_4:
m_shViewOffsetX = (m_ptMovePixelArray[nCharFrame].x * nSpeed);
m_shViewOffsetY = (m_ptMovePixelArray[nCharFrame].y * nSpeed);
break;
// 流急 酒贰肺 捞悼.
case _DIRECTION_LIST_5:
m_shViewOffsetY = (m_ptMovePixelArray[nCharFrame].y * nSpeed);
break;
// 哭率酒贰肺 捞悼.
case _DIRECTION_LIST_6:
m_shViewOffsetX = -(m_ptMovePixelArray[nCharFrame].x * nSpeed);
m_shViewOffsetY = (m_ptMovePixelArray[nCharFrame].y * nSpeed);
break;
// 哭率栏肺 捞悼.
case _DIRECTION_LIST_7:
m_shViewOffsetX = -(m_ptMovePixelArray[nCharFrame].x * nSpeed);
break;
// 哭率困肺 捞悼.
case _DIRECTION_LIST_8:
m_shViewOffsetX = -(m_ptMovePixelArray[nCharFrame].x * nSpeed);
m_shViewOffsetY = -(m_ptMovePixelArray[nCharFrame].y * nSpeed);
break;
}
}
VOID CMapHandler::ScrollMap(INT nCharDir, WORD wCurrDelay, WORD wMoveDelay, INT nSpeed)
{
FLOAT fViewOffSetX = (FLOAT)((FLOAT)((wCurrDelay+1)/wMoveDelay) * _CELL_WIDTH ) * nSpeed;
FLOAT fViewOffSetY = (FLOAT)((FLOAT)((wCurrDelay+1)/wMoveDelay) * _CELL_HEIGHT) * nSpeed;
switch ( nCharDir )
{
// 流急 困肺 捞悼.
case _DIRECTION_LIST_1:
m_shViewOffsetY -= (SHORT)-fViewOffSetY;
break;
// 坷弗率困肺 捞悼.
case _DIRECTION_LIST_2:
m_shViewOffsetX = (SHORT)fViewOffSetX;
m_shViewOffsetY = (SHORT)-fViewOffSetY;
break;
// 坷弗率栏肺 捞悼.
case _DIRECTION_LIST_3:
m_shViewOffsetX = (SHORT)fViewOffSetX;
break;
// 坷弗率酒贰肺 捞悼.
case _DIRECTION_LIST_4:
m_shViewOffsetX = (SHORT)fViewOffSetX;
m_shViewOffsetY = (SHORT)fViewOffSetY;
break;
// 流急 酒贰肺 捞悼.
case _DIRECTION_LIST_5:
m_shViewOffsetY = (SHORT)fViewOffSetY;
break;
// 哭率酒贰肺 捞悼.
case _DIRECTION_LIST_6:
m_shViewOffsetX = (SHORT)-fViewOffSetX;
m_shViewOffsetY = (SHORT)fViewOffSetY;
break;
// 哭率栏肺 捞悼.
case _DIRECTION_LIST_7:
m_shViewOffsetX = (SHORT)-fViewOffSetX;
break;
// 哭率困肺 捞悼.
case _DIRECTION_LIST_8:
m_shViewOffsetX = (SHORT)fViewOffSetX;
m_shViewOffsetY = (SHORT)-fViewOffSetY;
break;
}
}
/******************************************************************************************************************
窃荐疙 : CMapHandler::DrawBaseTile()
累己磊 :
累己老 :
格利 :
涝仿 : INT nX
INT nY
免仿 : VOID
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -