📄 gamemap.cpp
字号:
// GameMap.cpp: implementation of the CGameMap class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "xxx.h"
#include <graphics.h>
#include "GameMap.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGameMap::CGameMap()
{
m_sBox=NULL;
m_sDest=NULL;
m_sMan=NULL;
m_sWall=NULL;
m_sPass=NULL;
m_Rect.left=0;
m_Rect.top=0;
m_Rect.bottom=48;
m_Rect.right=48;
bNext=FALSE;
m_undo.SetMaxSize(255);
}
CGameMap::~CGameMap()
{
}
void CGameMap::Free()
{
__RELEASES(m_sBox);
__RELEASES(m_sDest);
__RELEASES(m_sMan);
__RELEASES(m_sWall);
__RELEASES(m_sPass);
m_undo.FreeStack();
}
void CGameMap::Init()
{
m_sBox=CreateSurface(48,48);
m_sBox->LoadBitmap((LPCSTR)(IDB_BITMAP3));
m_sDest=CreateSurface(48,48);
m_sDest->LoadBitmap((LPCSTR)(IDB_BITMAP4));
m_sMan=CreateSurface(48,48);
m_sMan->LoadBitmap((LPCSTR)(IDB_BITMAP1));
m_sWall=CreateSurface(48,48);
m_sWall->LoadBitmap((LPCSTR)(IDB_BITMAP2));
m_sPass=CreateSurface(385,96);
m_sPass->LoadBitmap((LPCSTR)(IDB_BITMAP6));
DDCOLORKEY KeyColor;
KeyColor.dwColorSpaceLowValue=DX_GREEN;
KeyColor.dwColorSpaceHighValue=DX_GREEN;
((LPDIRECTDRAWSURFACE)(*m_sMan))->SetColorKey(DDCKEY_SRCBLT,&KeyColor);
KeyColor.dwColorSpaceLowValue=DX_BLACK;
KeyColor.dwColorSpaceHighValue=DX_BLACK;
((LPDIRECTDRAWSURFACE)(*m_sBox))->SetColorKey(DDCKEY_SRCBLT,&KeyColor);
NewMap();
}
void CGameMap::NewMap()
{
m_ManPos.x=48;
m_ManPos.y=48;
m_MapIndex=0;
for(int j=0;j<17;j++)
{
for(int i=0;i<22;i++)
{
m_GameMapData[i][j]=0;
}
}
for(int x=0;x<22;x++)
m_GameMapData[x][0]='B';
for(x=0;x<22;x++)
m_GameMapData[x][15]='B';
for(int y=0;y<15;y++)
m_GameMapData[0][y]='B';
for(y=0;y<15;y++)
m_GameMapData[21][y]='B';
}
void CGameMap::DrawMain()
{
DrawMap();
DrawMan();
}
void CGameMap::DrawMap()
{
CGDisplay *pDisplay=::GetDisplay();
LPCGSURFACE surf=*pDisplay;
for(int y=0;y<17;y++)
{
for(int x=0;x<22;x++)
{
switch(m_GameMapData[x][y])
{
case 'B':
surf->BltFast(x*48,y*48,m_sWall,NULL,DX_BLACK);
break;
case 'A':
surf->BltFast(x*48,y*48,m_sBox,NULL,DX_BLACK);
break;
case 'D':
surf->BltFast(x*48,y*48,m_sDest,NULL,DX_BLACK);
break;
case 'X':
surf->BltFast(x*48,y*48,m_sBox,NULL,DX_BLACK);
surf->AlphaBlt(x*48,y*48,m_sDest,NULL,128,DX_BLACK);
break;
default:;
}
}
}
}
void CGameMap::DrawMan()
{
CGDisplay *pDisplay=::GetDisplay();
LPCGSURFACE surf=*pDisplay;
surf->AlphaBlt(m_ManPos.x,m_ManPos.y,m_sMan,NULL,80,DX_BLACK);
}
void CGameMap::SetAt(int x,int y,char ch)
{
x/=48;
y/=48;
if(x>0 && x<21 && y>0 && y<15)
m_GameMapData[x][y]=ch;
}
char CGameMap::GetAt(int x,int y)
{
x/=48;
y/=48;
if(x>0 && x<21 && y>0 && y<15)
return m_GameMapData[x][y];
return -1;
}
void CGameMap::SetManAt(int x,int y)
{
x/=48;
y/=48;
if(x>0 && x<21 && y>0 && y<15)
{
m_ManPos.x=x*48;
m_ManPos.y=y*48;
}
}
BOOL CGameMap::SaveMap(LPCSTR filename)
{
CGFile file;
if(!file.Open(filename,"wb"))
return FALSE;
file.Write(&m_ManPos,sizeof(POINT));
for(int y=0;y<17;y++)
{
for(int x=0;x<22;x++)
{
file.Write(&m_GameMapData[x][y],sizeof(char));
}
}
file.Close();
return TRUE;
}
BOOL CGameMap::LoadMap(LPCSTR filename)
{
CGFile file;
if(!file.Open(filename,"rb"))
return FALSE;
file.Read(&m_ManPos,sizeof(POINT));
for(int y=0;y<17;y++)
{
for(int x=0;x<22;x++)
{
file.Read(&m_GameMapData[x][y],sizeof(char));
}
}
file.Close();
return TRUE;
}
BOOL CGameMap::MoveMan(int nID,int d)
{
if(d>0)
d=1;
else
d=-1;
if(nID==0)
{
int x=m_ManPos.x/48+d;
int y=m_ManPos.y/48;
switch(m_GameMapData[x][y])
{
case 'D':
case 0:
m_ManPos.x=x*48;
return TRUE;
case 'X':
if(m_GameMapData[x+d][y]==0)
{
PushData();
m_GameMapData[x][y]='D';
m_GameMapData[x+d][y]='A';
m_ManPos.x=x*48;
return TRUE;
}
if(m_GameMapData[x+d][y]=='D')
{
PushData();
m_GameMapData[x][y]='D';
m_GameMapData[x+d][y]='X';
m_ManPos.x=x*48;
return TRUE;
}
break;
case 'A':
if(m_GameMapData[x+d][y]==0)
{
PushData();
m_GameMapData[x][y]=0;
m_GameMapData[x+d][y]='A';
m_ManPos.x=x*48;
return TRUE;
}
if(m_GameMapData[x+d][y]=='D')
{
PushData();
m_GameMapData[x][y]=0;
m_GameMapData[x+d][y]='X';
m_ManPos.x=x*48;
return TRUE;
}
break;
}
}
else
{
int x=m_ManPos.x/48;
int y=m_ManPos.y/48+d;
switch(m_GameMapData[x][y])
{
case 'D':
case 0:
m_ManPos.y=y*48;
return TRUE;
case 'X':
if(m_GameMapData[x][y+d]==0)
{
PushData();
m_GameMapData[x][y]='D';
m_GameMapData[x][y+d]='A';
m_ManPos.y=y*48;
return TRUE;
}
if(m_GameMapData[x][y+d]=='D')
{
PushData();
m_GameMapData[x][y]='D';
m_GameMapData[x][y+d]='X';
m_ManPos.y=y*48;
return TRUE;
}
break;
case 'A':
if(m_GameMapData[x][y+d]==0)
{
PushData();
m_GameMapData[x][y]=0;
m_GameMapData[x][y+d]='A';
m_ManPos.y=y*48;
return TRUE;
}
if(m_GameMapData[x][y+d]=='D')
{
PushData();
m_GameMapData[x][y]=0;
m_GameMapData[x][y+d]='X';
m_ManPos.y=y*48;
return TRUE;
}
break;
}
}
return FALSE;
}
BOOL CGameMap::CheckGameOver()
{
for(int y=0;y<17;y++)
{
for(int x=0;x<22;x++)
{
if(m_GameMapData[x][y]=='A')
return FALSE;
}
}
return TRUE;
}
void CGameMap::ShowPass(void)
{
CGDisplay *pDisplay=::GetDisplay();
LPCGSURFACE suf=*pDisplay;
suf->LoadBitmap((LPCSTR)(IDB_BITMAP5));
suf->AlphaBlt(250,250,m_sPass,NULL,128,DX_BLACK);
}
BOOL CGameMap::LoadNextMap(void)
{
m_MapIndex++;
CGString str;
str.Format("Level%d.dat",m_MapIndex);
return LoadMap(str);
}
void CGameMap::GameLoop(void)
{
CGDisplay *pDisplay=::GetDisplay();
LPCGSURFACE suf=*pDisplay;
suf->ClearSurface();
suf->LoadBitmap((LPCSTR)(IDB_BITMAP5));
DrawMain();
if(CheckGameOver())
{
if(pDisplay->IsEffectOK())
{
if(!bNext)
{
pDisplay->StartEffectLowHlight(255,5);
bNext=TRUE;
}
else
{
LoadNextMap();
bNext=FALSE;
}
}
ShowPass();
}
pDisplay->Update();
}
void CGameMap::PushData(void)
{
UNDODATA *d=new UNDODATA;
memcpy(d->m_GameMapData,m_GameMapData,sizeof(m_GameMapData));
d->m_X=m_ManPos.x;
d->m_Y=m_ManPos.y;
m_undo.PushData(d);
}
void CGameMap::Undo()
{
UNDODATA *d=m_undo.PopData();
if(d==NULL)
return;
memcpy(m_GameMapData,d->m_GameMapData,sizeof(m_GameMapData));
m_ManPos.x=d->m_X;
m_ManPos.y=d->m_Y;
delete d;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -