扫雷__重绘优化与数据持久化

刚开始在完成某些功能的时候 可能在刷新的时候都直接用的Invalidate() 这样做的好处是可以直接明了的测试当前功能模块的逻辑正确性,而不必关心具体的下一步优化。但是在界面逻辑完成之后,屏幕会闪得很厉害。这时候就可以通过一些必要的措施来优化或者减少重绘:
     例如下一段用于鼠标移动动态选取雷块的代码(简化后):
     
     上一段代码的重绘效率是相当差的 鼠标稍一移动 就造成整个客户区闪个不停 我们可以逐步的优化代码:
 

    
     1.在逻辑上减少重绘 比如在上面的代码中 当鼠标在一个雷方块上移动 即没有进行雷方块切换时 此时m_pOldMine和m_pNewMine其实指向同一个雷快 此时根本不需要重绘 因此我们可以在m_pNewMine=GetMine(point.x,point.y)后面加上一句if(m_pNewMine == m_pOldMine) return;

     2.对重绘区域的优化:在改进了1之后,只要不切换雷方块 就不会闪烁了。但是此时我们只关心两个雷块的重绘 绘制整个客户区是很不值得的。因此我们可以通过m_pNewMine和m_pOldMine的行列值得到它俩的矩形区域rcMine 只对该矩形进行重绘 即调用InvalidateRect(&rcMine)从而不会引起整个屏幕的闪烁。

     3.在改进1 2后,在切换过快时 仍然会出现小方块闪烁(闪一下白色)的情况。这是因为我们重绘时,InvalidateRect(&rcMine)默认是要擦掉背景的 就会闪烁白色,此时我们可以对重绘方式进行改进:不擦除背景,调用InvalidateRect(&rcMine,FALSE)此时就基本不会闪烁了。对于第二个参数为FALSE具体保留的背景是本身客户区的背景还是绘制之前的整个区域的所有颜色还不大清楚。只是这的确也是通过对重绘方式优化而达到提高重绘效率的良好途径。

最终代码:

其他功能

数据的持久化
  通过ini文件的读取和写入来保存游戏数据和设置 
     主要函数
     GetPrivateProfileString读取字符串
     GetPrivateProfileInt   读取整型数据
     在以上文件读取中 都有一个默认参数用于第一次运行程序未建立ini文件时使用
     WritePrivateProfileString写入字符串
     代码:
     

声音文件的播放:
     1.准备wav格式的声音文件
     2.导入声音文件到资源    改名
     3.找到并加载资源:
     
     注:m_pSoundClock m_pSoundDead m_pSoundVictory均为void*类型
     4.在需要播放声音的地方使用sndPlaySound:
     
     注:用LockResource 锁定资源内存后是不需要解锁的 资源自动在进程终止时释放
        使用sndPlaySound时 需要包含头文件#include "Mmsystem.h"并加载库文件winmm.lib

对话框之间的数据交互:
      在游戏过程中: 我们会用到自定义对话框 胜利保存对话框 排行榜对话框 那么我们有哪些方式对它们进行数据交换呢
      由于这几个对话框交互都比较简单 只涉及到一些简单的数据交换 因此在这个程序中 通过对目标对话框设置一些Get和Set函数来初始化目标对话框并且获取该对话框与用户交互的数据。为了简便 可以使用变量和空间关联来使得对话框在DoModol()时就可以显示出主窗口传给它的数据。注意:不要在对话框DoModol之前通过UpDateData来初始化控件 因为此时对话框还没有显示,还不是一个窗口。否则会引发MFC源代码的段错误

源代码下载地址点击这里(本人资源分寥寥无几了,所以...咳 别说我不厚道啊。如果哪位和我一样穷的话,就留言吧,我发给他,)
     http://download.csdn.net/detail/wudaijun/4709630

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值