15.4 扫雷游戏的界面实现
扫雷游戏的Visual C++(www.cppentry.com)工程采用MFC对话框模式进行开发。本节主要讲解扫雷游戏各个功能模块的代码实现。
说明:界面是提高用户友好度最直接的方法,所以界面设计是游戏开发中重要的部分。
15.4.1 游戏菜单的实现
在扫雷游戏中,通过如下几步即可实现添加游戏的菜单。
(1)在扫雷游戏工程的资源中添加一个菜单资源,其属性如表15.8所示。
15.8 主菜单属性
|
ID< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
类 别 |
说 明 |
|
IDR_MAIN_MENU |
弹出菜单 |
游戏的主菜单 |
|
IDR_START_GAME |
菜单栏 |
开始游戏 |
|
IDR_EXIT_GAME |
菜单栏 |
退出游戏 |
|
IDR_PLAY_MUSIC |
选择菜单 |
播放音乐 |
|
IDR_HELP |
菜单栏 |
帮助 |
|
IDR_ABOUT |
菜单栏 |
关于 |
(2)给每个菜单栏添加响应函数到CMineDlg类中。
(3)菜单响应函数的实现,如代码15.1所示。
代码15.1 菜单响应函数的实现
- 01 BEGIN_MESSAGE_MAP(CMineDlg, CDialog)
- 02 ON_WM_SYSCOMMAND()
- 03 ON_WM_PAINT()
- 04 ON_WM_QUERYDRAGICON()
- // 菜单资源与函数映射表
- 05 ON_COMMAND(IDR_ABOUT, OnAbout)
- 06 ON_COMMAND(IDR_EXIT_GAME, OnExitGame)
- 07 ON_COMMAND(IDR_HELP, OnHelp)
- 08 ON_COMMAND(IDR_PLAY_MUSIC, OnPlayMusic)
- 09 ON_COMMAND(IDR_START_GAME, OnStartGame)
- 10 END_MESSAGE_MAP()
- 11
- 12 BOOL CMineDlg::OnInitDialog() //初始化对话框
- 13 {
- 14 CDialog::OnInitDialog();
- 15
- 16 m_bStart = FALSE; //设置游戏状态
- 17
- 18 InitMenu(); //初始化菜单
- 19
- 20 return TRUE; //初始化成功
- 21 }
- 22 ... //省略部分代码
- 23 void CMineDlg::OnOK() //单击"确认"按钮响应函数
- 24 {
- 25 CDialog::OnOK();
- 26 }
- 27
- 28 void CMineDlg::OnCancel() //单击"退出"按钮响应函数
- 29 {
- 30 CDialog::OnCancel();
- 31 }
- 32
- 33 void CMineDlg::OnAbout() //关于菜单栏响应函数
- 34 {
- 35 CAboutDlg dlg; //创建关于对话框
- 36 dlg.DoModal(); //弹出关于对话框
- 37 }
- 38
- 39 void CMineDlg::OnExitGame() //退出菜单栏响应函数
- 40 {
- 41 CDialog::OnCancel();//调用基类退出函数
- 42 }
- 43
- 44 void CMineDlg::OnHelp() //帮助菜单栏响应函数
- 45 {
- 46 CHelpDlg dlg; //创建帮助对话框
- 47 dlg.DoModal(); //弹出帮助对话框
- 48 }
- 49
- 50 void CMineDlg::OnPlayMusic()
//背景音乐菜单栏响应函数 - 51 {
- 52 CWnd* pMain = AfxGetMainWnd();
- 53 CMenu* pMenu = pMain->GetMenu();
- 54 //判断播放音乐菜单当前状态
- 55 BOOL bCheck = (BOOL)pMenu->GetMenuState
(IDR_PLAY_MUSIC, MF_CHECKED); - 56
- 57 if(m_bStart)
- 58 {
- 59 if(bCheck)
- 60 {
- 61pMenu->CheckMenuItem(IDR_PLAY_MUSIC,
- 62 MF_BYCOMMAND | MF_UNCHECKED);
- 63 }
- 64 else
- 65 {
- 66pMenu->CheckMenuItem(IDR_PLAY_MUSIC,
- 67 MF_BYCOMMAND | MF_CHECKED);
- 68 }
- 69
- 70 PlayBackMusic(!bCheck);
//调用播放背景音乐功能函数 - 71 }
- 72 }
- 73
- 74 void CMineDlg::OnStartGame()
- 75 {
- 76 GameStart(); //调用游戏开始接口函数
- 77 }
- 78
- 79 void CMineDlg::InitMenu()//初始化菜单函数
- 80 {
- 81 CWnd* pMain = AfxGetMainWnd();
- 82 CMenu* pMenu = pMain->GetMenu();
- 83 pMenu->CheckMenuItem(IDR_PLAY_MUSIC,
MF_BYCOMMAND| MF_UNCHECKED); - 84 }