实训课二,走迷宫,画直线
来源:互联网 发布:工作压力大 知乎 编辑:程序博客网 时间:2024/05/21 19:23
第一次课我们讲到创建一个简单的窗口,然后画上几条线,甚至是椭圆!接下来我们进一步学习,今天的主要任务是:
1. 通过鼠标拖动画直线。
2. 走迷宫。
接着上次课。
第一步:
定义变量。双击【GameWnd】,弹出GameWnd.h编辑区,如下图:
找到 DECLARE_MESSAGE_MAP()写如下代码:
star 用来存放线起点的坐标信息。
end 用来存放线终点的坐标信息。
第二步:
写绘图代码。双击【OnPaint()】,
写下如下代码:
dc.MoveTo(star.x, star.y);
dc.LineTo(end.x, end.y);
或
dc.MoveTo(star);
dc.LineTo(end);
这里只是把上节课的
dc.MoveTo();
dc.LineTo();
内容换成了变量star和变量end。
第三步:
添加鼠标的相关信息。和添加【WM_PAINT】一样,右击【GameWnd】,
选择【Add Windows Message Handler…】,弹出下面的窗口:
分别找到【WM_LBUTTONDOWN】【WM_LBUTTONUP】并双击它们进行添加:点确定。
【WM_LBUTTONDOWN】鼠标左键按下。
【WM_LBUTTONUP】鼠标左键弹起。
双击【OnLButtonUp】
写下如下代码:
end = point;//弹起下的点的信息给end
Invalidate();//Invalidate(FALSE);不重绘,Invalidate()刷新窗口区域
//如果写Invalidate(FALSE);可以连续画多条线,自己试验。
双击【OnLButtonDown】
写下如下代码:
star = point;//点下的点的信息给star
切换到【GameWnd()】下编译运行。
走迷宫
同样,在上一节课的内容接着做。
第一步:
定义变量。双击【GameWnd】,弹出GameWnd.h编辑区,如下图:
找到 DECLARE_MESSAGE_MAP()写如下代码:
dir:后面用来存放图片文件名的信息与 index相同。
其中 char FileName[8];和 CString Name;都可以,写一种就行。不同点后面介绍。
第二步:
定义好变量后为变量赋初始值。双击【GameWnd()】
找到【GameWnd::GameWnd()】写下如下代码:
Create(NULL, “窗口”, WS_OVERLAPPEDWINDOW, CRect(0, 0, 744, 800));//这里和上一节课的内容有一点不同,注意自己体会
dir = 1;
index = 1;
bitmap = new CBitmap;
wall = new CBitmap;
mdc = new CDC;//在内存里面申请一段内存空间
CClientDC dc(this);//客户区的缓冲区,在当前区显示
mdc->CreateCompatibleDC(&dc);//对当前窗口建立临时缓冲区
wall->m_hObject = LoadImage(NULL, "wall.bmp", IMAGE_BITMAP, 93, 100, LR_LOADFROMFILE);
//装载图片到临时缓冲区(句柄,名称,类型,宽,高,加载方式)把图片从外存拿到内存
WS_OVERLAPPEDWINDOW指窗口样式。
CRect(0, 0, 744, 800)画一个矩形,宽744,高800,根据要加载的图片计算的,0,0表示起点坐标。
第三步:
绘图。在【GameWnd::GameWnd()】构造函数前定义二维数组,如下:
在下面找到【void GameWnd::OnPaint()】,写如下代码:
dc.SelectObject(wall);//把图片从内存拿到缓冲区(加载到临时缓冲区)
for (int i = 0; i < 8; ++i)
{
for (int j = 0; j < 8; ++j)
{
if (1 == maze[i][j])//如果是1,显示墙
{
mdc->SelectObject(wall);//(存放墙的变量名)
dc.BitBlt(j*93, i*100, 93, 100, mdc, 0, 0, SRCCOPY);//显示图片(x,y,宽,高,存放位置,)
}
if (2 == maze[i][j])
{
sprintf(FileName, "%d.%d.bmp", dir, index);//注释行不须此语句
//Name.Format("%d.%d.bmp", dir, index);//CString Name的情况下用此语句代替上一行的语句,FileName改为Name
bitmap->m_hObject=LoadImage(NULL,FileName,IMAGE_BITMAP,93,100,LR_LOADFROMFILE);
//bitmap->m_hObject=LoadImage(NULL,"1.1.bmp",IMAGE_BITMAP,93,100,LR_LOADFROMFILE);
mdc->SelectObject(bitmap);//(存放人的变量名)
dc.BitBlt(j*93, i*100, 93, 100, mdc, 0, 0, SRCCOPY);//显示图片(x,y,宽,高,存放位置,)
}
}
}
第四步:
添加键盘信息。用添加WM_PAINT同样的方式添加【WM_KEYDOWN】
双击【OnKeyDown()】
在里面写如下代码:
for (int i = 0; i < 8; ++i)
{
for (int j = 0; j < 8; ++j)
{
if (2 == maze[i][j])
{
switch (nChar)
{
case VK_DOWN:
//会动
dir = 1;
++index;
if (5 == index)
{
index = 1;
}
if (0 == maze[i+1][j])
{
maze[i+1][j] = 2;
maze[i][j] = 0;
}
Invalidate();
break;
case VK_LEFT:
dir = 2;
++index;
if (5 == index)
{
index = 1;
}
if (0 == maze[i][j-1])
{
maze[i][j-1] = 2;
maze[i][j] = 0;
}
Invalidate();
break;
case VK_RIGHT:
dir = 3;
++index;
if (5 == index)
{
index = 1;
}
if (0 == maze[i][j+1])
{
maze[i][j+1] = 2;
maze[i][j] = 0;
}
Invalidate();
break;
case VK_UP:
dir = 4;
++index;
if (5 == index)
{
index = 1;
}
if (0 == maze[i-1][j])
{
maze[i-1][j] = 2;
maze[i][j] = 0;
}
Invalidate();
break;
}
}
}
}
切换到【GameWnd()】下编译运行。
把相关图片放在game文件夹下。