// GameWnd.cpp : implementation file
//
//#include "stdafx.h"
#include "game.h"
#include "GameWnd.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// GameWnd
IMPLEMENT_DYNCREATE(GameWnd, CFrameWnd)
int i;
int dir,index;
int x,y;
int maze[8][8]={
1,1,1,1,1,1,2,1,
3,0,0,1,0,0,0,1,
1,1,0,0,0,1,1,1,
1,0,0,1,0,0,0,1,
1,1,1,1,0,1,1,1,
1,0,0,0,0,0,0,1,
1,0,1,0,1,0,0,1,
1,1,1,1,1,1,1,1
};
int m,n;
BOOL start=true;
int k,p;
struct list
{
int m;
int n;
int x;
int y;
struct list *next;
struct list *back;
CBitmap*bitmap;
};
list *ptr,*preptr,*fist;
BOOL go=false;
int number=0;
GameWnd::GameWnd()
{
Create(NULL,"创建窗口",WS_OVERLAPPEDWINDOW,CRect(0,0,744,800));
char ch[8]; //保存文件名.
for (int i=0;i<4;i++)
{
for (int j=0;j<4;j++)
{
sprintf(ch,"%d.%d.bmp",i+1,j+1); //把第一个%d转换为i+1.第二个替换第二个%d
bitmap[i][j]=new CBitmap;
bitmap[i][j]->m_hObject=LoadImage(NULL,ch,IMAGE_BITMAP,93,100,LR_LOADFROMFILE);
}
}
// bitmap=new CBitmap;
// bitmap->m_hObject=LoadImage(NULL,"1.1.bmp",IMAGE_BITMAP,93,100,LR_LOADFROMFILE);
mdc=new CDC;
CClientDC dc(this);//cclientdc客户区域. dc窗口的客服区域.获利作画区域.
mdc->CreateCompatibleDC(&dc); //创建兼容DC; dc=device context设备环境.
mdc->SelectObject(bitmap[0][0]);
// dc.BitBlt(0,0,93,100,mdc,0,0,SRCCOPY);
for (i=0;i<8;i++)
{
for (int j=0;j<8;j++)
{
if (maze[i][j]==2)
{
m=i;
n=j;
break;
}
}
}
wall=new CBitmap;
wall->m_hObject=LoadImage(NULL,"wall.bmp",IMAGE_BITMAP,93,100,LR_LOADFROMFILE);
i=0;
dir=0;
index=0;
x=0,y=0;
ptr=(list*)malloc(sizeof(list));//保存当前结点
ptr->m=m;
ptr->n=n;
ptr->bitmap=bitmap[0][0];
ptr->next=NULL;
ptr->back=NULL;
fist=ptr;
}
GameWnd::~GameWnd()
{
}
BEGIN_MESSAGE_MAP(GameWnd, CFrameWnd)
//{{AFX_MSG_MAP(GameWnd)
ON_WM_PAINT()
ON_WM_CREATE()
ON_WM_TIMER()
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// GameWnd message handlers
void GameWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
//CPaintDC从CDC类派生出来的.自动调用BeginPaint开始绘图.
// TODO: Add your message handler code here
// if (i++<300)
// {
// dc.BitBlt(0+i,0,93,100,mdc,0,0,SRCCOPY);
// }
// else
// {
// i=0;
// }
// Do not call CFrameWnd::OnPaint() for painting messages
}
int GameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
SetTimer(1,100,NULL);
return 0;
}
void GameWnd::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (start)
{
Start();
}
else
{
if (go)
{
Go();
}
}
CFrameWnd::OnTimer(nIDEvent);
}
void GameWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
dc.BitBlt(n*93+x,m*100+y,93,100,mdc,0,0,WHITENESS); //处理残形.
if (nChar==VK_DOWN)
{
y+=100;
k=(n*93+x)/93; //横坐标
p=(m*100+y)/100; //纵坐标
if (maze[p][k]==1)
{
y-=100;
}
if (dir==0)
{
index++;
if (index==4)
{
index=0;
}
}
else
{
index=0;
dir=0;
}
ptr->next=(list*)malloc(sizeof(list));
ptr->next->m=m; //行数
ptr->next->n=n; //列数
ptr->next->y=y;
ptr->next->x=x;
ptr->next->bitmap=bitmap[dir][index];
preptr=ptr;
ptr->next->next=NULL;
ptr=ptr->next;
ptr->back=preptr;
}
if (nChar==VK_UP)
{
y-=100;
k=(n*93+x)/93; //横坐标
p=(m*100+y)/100; //纵坐标
if (maze[p][k]==1)
{
y+=100;
}
if (dir==3)
{
index++;
if (index==4)
{
index=0;
}
}
else
{
index=0;
dir=3;
}
ptr->next=(list*)malloc(sizeof(list));
ptr->next->m=m; //行数
ptr->next->n=n; //列数
ptr->next->y=y;
ptr->next->x=x;
ptr->next->bitmap=bitmap[dir][index];
preptr=ptr;
ptr->next->next=NULL;
ptr=ptr->next;
ptr->back=preptr;
}
if (nChar==VK_LEFT)
{
x-=93;
k=(n*93+x)/93; //横坐标
p=(m*100+y)/100; //纵坐标
if (maze[p][k]==1)
{
x+=93;
}
if (dir==1)
{
index++;
if (index==4)
{
index=0;
}
}
else
{
index=0;
dir=1;
}
ptr->next=(list*)malloc(sizeof(list));
ptr->next->m=m; //行数
ptr->next->n=n; //列数
ptr->next->y=y;
ptr->next->x=x;
ptr->next->bitmap=bitmap[dir][index];
preptr=ptr;
ptr->next->next=NULL;
ptr=ptr->next;
ptr->back=preptr;
}
if (nChar==VK_RIGHT)
{
x+=93;
k=(n*93+x)/93; //横坐标
p=(m*100+y)/100; //纵坐标
if (maze[p][k]==1)
{
x-=93;
}
if (dir==2)
{
index++;
if (index==4)
{
index=0;
}
}
else
{
index=0;
dir=2;
}
ptr->next=(list*)malloc(sizeof(list));
ptr->next->m=m; //行数
ptr->next->n=n; //列数
ptr->next->y=y;
ptr->next->x=x;
ptr->next->bitmap=bitmap[dir][index];
preptr=ptr;
ptr->next->next=NULL;
ptr=ptr->next;
ptr->back=preptr;
}
k=(n*93+x)/93; //横坐标
p=(m*100+y)/100; //纵坐标
if (maze[p][k]==3)
{
dc.TextOut(120,350,"出去了");
ptr->next=(list*)malloc(sizeof(list));
ptr->next->m=m; //行数
ptr->next->n=n; //列数
ptr->next->y=y;
ptr->next->x=x;
ptr->next->bitmap=bitmap[dir][index];
preptr=ptr;
ptr->next->next=NULL;
ptr=ptr->next;
ptr->back=preptr;
go=true;
return;
}
mdc->SelectObject(bitmap[dir][index]);
dc.BitBlt(n*93+x,m*100+y,93,100,mdc,0,0,SRCCOPY);
CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
void GameWnd::Start()
{
CClientDC dc(this);
mdc->SelectObject(wall);
for (int i=0;i<8;i++)
{
for (int j=0;j<8;j++)
{
if (maze[i][j]==1)
{
dc.BitBlt(j*93,i*100,93,100,mdc,0,0,SRCCOPY);
}
}
}
mdc->SelectObject(bitmap[0][0]);
dc.BitBlt(n*93,m*100,93,100,mdc,0,0,SRCCOPY);
start=false;
}
void GameWnd::Go()
{
CClientDC dc(this);
/*
m=fist->m;
n=fist->n;
x=fist->x;
y=fist->y;
*/
mdc->SelectObject(wall);
for (int i=0;i<8;i++)
{
for (int j=0;j<8;j++)
{
if (maze[i][j]==1)
{
dc.BitBlt(j*93,i*100,93,100,mdc,0,0,SRCCOPY);
}
}
}
mdc->SelectObject(fist->bitmap);
if (number==0)
{
dc.BitBlt(fist->n*93+fist->x,fist->m*100+fist->y,93,100,mdc,0,0,SRCCOPY);
}
else
{
dc.BitBlt(fist->back->n*93+fist->back->x,fist->back->m*100+fist->back->y,93,100,mdc,0,0,WHITENESS);
dc.BitBlt(fist->n*93+fist->x,fist->m*100+fist->y,93,100,mdc,0,0,SRCCOPY);
}
number++;
if (fist->next==NULL)
{
go=false;
}
else
{
fist=fist->next;
}
}