本课内容 接下来的几节课,我们要利用C语言开发一些游戏 本节课开发一个俄罗斯方块游戏 游戏规则
开发第一步 打开资源视图:修改Menu的菜单选项: 注:修改每一项的菜单ID
游戏规则 导入ICON资源并修改其ID:
游戏规则(牌型比较) 1:添加一个设置对话框,并修改其ID为:IDD_DLG_SETTING 2:添加下面的控件,并修改其ID
开发第二步(进行游戏实战) 右键上图的对话框: 添加一个类名为:CSettingDlg
开发第二步(进行游戏实战) 添加control bar 和 status bar: 第一步:MainFrm.h中添加成员变量: CToolBar m_wndToolBar; 第二步:MainFrm.cpp中修改OnCreate函数,添加如下代码: 1:CImageList img; //对图片进行处理的类 CString str; //设置按钮的宽度和长度 m_wndToolBar.GetToolBarCtrl().SetButtonWidth(40, 100); //改变属性 m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT |CBRS_TOOLTIPS | TBSTYLE_TRANSPARENT|TBBS_CHECKBOX ); //设置按钮数为 m_wndToolBar.SetButtons(NULL,4);
开发第二步(进行游戏实战) 2. 添加图像设置"热/hot"状态的的位图 img.Create(28, 28, ILC_COLOR8|ILC_MASK,2,2); img.SetBkColor(RGB(0, 0, 102)); 顺序增添按键的图标 img.Add(AfxGetApp()->LoadIcon(IDI_ICON_START)); img.Add(AfxGetApp()->LoadIcon(IDI_ICON_PAUSE)); img.Add(AfxGetApp()->LoadIcon(IDI_ICON_END)); img.Add(AfxGetApp()->LoadIcon(IDI_ICON_SET)); m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img); img.Detach(); 设置"冷/cold"状态的位图 img.Create(32, 32, ILC_COLOR8|ILC_MASK, 2,2); img.SetBkColor(::GetSysColor(COLOR_BTNFACE));
开发第二步(进行游戏实战) 顺序增添按键的图标 img.Add(AfxGetApp()->LoadIcon(IDI_ICON_START)); img.Add(AfxGetApp()->LoadIcon(IDI_ICON_PAUSE)); img.Add(AfxGetApp()->LoadIcon(IDI_ICON_END)); img.Add(AfxGetApp()->LoadIcon(IDI_ICON_SET)); m_wndToolBar.GetToolBarCtrl().SetImageList(&img); img.Detach(); 3. 设置文字 m_wndToolBar.SetButtonInfo(0, ID_GAME_START, TBSTYLE_BUTTON, 0); m_wndToolBar.SetButtonText(0, "开始"); m_wndToolBar.SetButtonInfo(1, ID_GAME_PAUSH, TBSTYLE_BUTTON, 1); m_wndToolBar.SetButtonText(1, "暂停"); m_wndToolBar.SetButtonInfo(2, ID_GAME_END, TBSTYLE_BUTTON,2); m_wndToolBar.SetButtonText(2, "结束"); m_wndToolBar.SetButtonInfo(3, ID_GAME_OPTION, TBSTYLE_BUTTON,3); m_wndToolBar.SetButtonText(3, "设置");
开发第二步(进行游戏实战) 4:设置工具BAR开始的大小 CRect rectToolBar; //得到按钮的大小 m_wndToolBar.GetItemRect(0, &rectToolBar); //设置按钮的大小 m_wndToolBar.SetSizes(rectToolBar.Size(), CSize(32,32));
绘制游戏客户区 在视图类中添加一个OnDraw()虚函数: 1:函数体内添加DcInit(): if(m_bFistPlay) { m_bFistPlay = FALSE; //用默认的参数,获取当前屏幕设备环境 CDC *pWindowDC = GetDC(); //1.用于映射屏幕的内存设备环境 //获取游戏窗口的大小用于下面设置内存位图的尺寸 CRect windowRect; GetClientRect(&windowRect); m_nWidth = windowRect.Width(); m_nHeight = windowRect.Height(); //内存设备环境与屏幕设备环境关联(兼容) m_memDC.CreateCompatibleDC(pWindowDC); //内存位图与与屏幕关联(兼容),大小为游戏窗口的尺寸 m_memBmp.CreateCompatibleBitmap(pWindowDC,m_nWidth,m_nHeight); //内存设备环境与内存位图关联,以便通过m_memDC在内存位图上作画 m_memDC.SelectObject(&m_memBmp); //2.存储方块位图的内存资源 m_memRectDC.CreateCompatibleDC(pWindowDC); //相当于将外部位图rect.bmp动态载入m_hMemRectBmp中 m_hMemRectBmp=(HBITMAP)LoadImage(NULL,"rect.bmp",IMAGE_BITMAP,150,30,LR_LOADFROMFILE); //内存设备环境与内存位图关联,以便通过m_memRectDC在内存位图上作画 SelectObject(m_memRectDC.m_hDC, m_hMemRectBmp); //黑色的黑笔 m_pBlackPen = new CPen(PS_SOLID,1,BLACK); //画刷 m_pGrayBrush = new CBrush(RGB(66,66,66)); m_pBlackBrush = new CBrush(BLACK); }
绘制游戏客户区 1:函数体内添加DrawGame (CDC *pCDC): 1:绘制游戏区域的背景 //选用黑色画刷,绘制整个游戏所在窗口的背景 pDC -> SelectObject(m_pBlackBrush); CRect rect; GetClientRect(&rect); pDC -> Rectangle(rect); //选用灰色画刷,绘制游戏区域的背景 pDC -> SelectObject(m_pGrayBrush); pDC -> Rectangle(m_iStartY ,m_iStartX, m_iStartY + 301, m_iStartX + 360); pDC->SelectObject(m_pBlackPen); 2:绘制网格
绘制游戏客户区 //画网格线 if (m_bDrawGrid) { //画横线 for (i=0;i<m_iRow;i++) pDC->MoveTo(m_iStartY, m_iStartX + i*m_iLarge); pDC->LineTo(m_iStartY+300, m_iStartX +i*m_iLarge); } //画竖线 for (i=0;i<m_iCol;i++) pDC->MoveTo(m_iStartY+i*m_iLarge, m_iStartX); pDC->LineTo(m_iStartY+i*m_iLarge, m_iStartX+360);
课程讲授完毕 感谢聆听! www.dut-px.com/