实训课二,走迷宫,画直线

来源:互联网 发布:工作压力大 知乎 编辑:程序博客网 时间: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);//显示图片(xy,宽,高,存放位置,)

}

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);//显示图片(xy,宽,高,存放位置,)

}

}

}

第四步:

添加键盘信息。用添加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文件夹下。

原创粉丝点击