www.pudn.com > MirGui.rar > MirGameMap.cpp
// MirGameMap.cpp: implementation of the CMirGameMap class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "MirGameMap.h" #include////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CMirGameMap::CMirGameMap() { m_pData = 0; m_DrawWidth = 16; m_DrawHeight = 16; m_DrawMapWidth = 11; m_DrawMapHeight = 11; memset( &m_Header, 0, sizeof( m_Header ) ); } CMirGameMap::~CMirGameMap() { if( m_pData != 0 ) delete []m_pData; } void CMirGameMap::Draw(HDC dc, int dx, int dy) { int i = 0; int j = 0; if( m_pData == NULL ) return; //HPEN hp = CreatePen( PS_SOLID, 4, RGB( 0, 0, 255 )); HBRUSH hbrold = (HBRUSH)GetCurrentObject( dc, OBJ_BRUSH ); LOGBRUSH lb; lb.lbColor = RGB( 255, 0, 0 ); lb.lbStyle = BS_SOLID; lb.lbHatch = 0; HBRUSH hbr1 = CreateBrushIndirect( &lb ); lb.lbColor = RGB( 255, 255, 255 ); HBRUSH hbr2 = CreateBrushIndirect( &lb ); lb.lbColor = RGB( 0, 0, 255 ); HBRUSH hbr3 = CreateBrushIndirect( &lb ); for( i = 0;i < m_DrawMapWidth;i ++ ) { for( j = 0;j < m_DrawMapHeight;j ++ ) { if( TestMap( i + m_xpos - m_DrawMapWidth/2, j + m_ypos-m_DrawMapHeight/2)) { SelectObject( dc, hbr2 ); } else { SelectObject( dc, hbr1 ); } PatBlt( dc, i * m_DrawWidth + dx, j * m_DrawHeight + dy, m_DrawWidth, m_DrawHeight, PATCOPY ); } } SelectObject( dc, hbr3 ); PatBlt( dc, (m_DrawMapWidth / 2 ) * m_DrawWidth + dx, ( m_DrawMapHeight / 2 ) * m_DrawHeight + dy, m_DrawWidth, m_DrawHeight, PATCOPY ); SelectObject( dc, hbrold ); DeleteObject( hbr1 ); DeleteObject( hbr2 ); DeleteObject( hbr3 ); } BOOL CMirGameMap::SetGameMap(char *mapname, DWORD x, DWORD y) { if( m_pData != NULL ) delete []m_pData; m_pData = Loadmap( mapname ); if( m_pData == NULL ) return FALSE; m_xpos = x; m_ypos = y; return TRUE; } MIRMAPBLOCK* CMirGameMap::Loadmap(char *map) { char tmpFilename[256]; FILE * fpmap = NULL; MIRMAPBLOCK * pdata = NULL; DWORD dsize = 0; sprintf( tmpFilename, "%s.map", map ); fpmap = fopen( tmpFilename, "rb" ); if( fpmap == NULL ) { sprintf( tmpFilename, "map\\%s.map", map ); fpmap = fopen( tmpFilename, "rb" ); if( fpmap == NULL ) { MessageBox( 0, "未发现传奇地图信息,自动寻路功能和怪物行动预测功能将无法使用。", "提示", 0 ); return NULL; } } fread( &m_Header, sizeof( MIRMAPHEADER), 1, fpmap ); if( m_Header.height == 0 || m_Header.width == 0 ) return NULL; dsize = m_Header.width; dsize *= m_Header.height; pdata = new MIRMAPBLOCK[dsize]; if( pdata == NULL ) return NULL; fread( (void*)pdata, dsize * sizeof( MIRMAPBLOCK ), 1, fpmap ); fclose( fpmap ); return pdata; } void CMirGameMap::SetPersonInfo(DWORD x, DWORD y, DWORD dir) { m_xpos = x; m_ypos = y; m_dir = dir; } int xofs_walk2[] = { 0, 1, 1, 1, 0, -1, -1, -1 }; int yofs_walk2[] = { -1, -1, 0, 1, 1, 1, 0, -1 }; BOOL CMirGameMap::TestMapTo(int x, int y, int dir) { int tx, ty; if( dir < 0 || dir > 7 ) return FALSE; tx = x + xofs_walk2[dir]; ty = y + yofs_walk2[dir]; return TestMap(tx,ty); } BOOL CMirGameMap::TestMap(int x, int y) { if( x >= m_Header.width || y >= m_Header.height || x < 0 || y < 0 ) { return FALSE; } if( m_pData == NULL ) return TRUE; if( m_pData[x * m_Header.height + y].tile & 0x8000 ) { return FALSE; } return TRUE; }