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

📄 maphandler.cpp

📁 传奇2客户端源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************************************************
                                                                                                                   
	葛碘疙:																											
																													
	累己磊:																											
	累己老:																											
																													
	[老磊][荐沥磊] : 荐沥 郴侩																						
                                                                                                                   
*******************************************************************************************************************/
#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 + -