当前位置: 首页 > news >正文

[C++]拼图游戏

    采用C++开发的一个小游戏,没有用MFC;使用了ATL的CImage,还有STL中的list,vector容器。

    创意是非原创,来自于几年前我看过的一个网页游戏(是否是flash?),原来的界面记不得了,但操作基本相似。

    由于对STL不太熟悉,而又偏要用一下,结果导致走了点弯路,加上世界杯期间总是分心,实际开发大概花了两天。写的比较急,所以显得还有很大的改进余地(我把分块数目限制到100块以下)。

    小块的形状(那些凸起和凹下的槽)最开始我想使用图片模板,但是考虑到我想要小块的大小随意,这用固定的图片模板不够灵活,所以改为用region去控制了。如果用图片模板贴,显示效果会更真实更好一些。当贴块合并时会播放一个声音文件(位于sound目录,资源来自qqgame中的某个游戏);可以在Pics文件夹下添加图片类型文件,这样启动程序后可以选择它们。在菜单中还有一个功能,显示全图,会显示一个非模态对话框,显示全图缩略图;

    最近博客园上争论这C++和C#的话题,我想如果用C#来实现可能开发就不会像我用C++这样花费这么大经历了。但是用C++的好处就是它还是显得很小巧很轻量级的,因为我没有用MFC等任何大的类库和依赖,把它编译为release版以后程序非常小,所以它分发起来非常简便,客户端也不需要必须安装.Net framework, 因为我也没有用CLR和.NET。

    截图如下:(网速过慢,暂不上传)

    

     

 

     可执行文件如下,(源代码就暂时不提供下载了)。

    http://files.cnblogs.com/hoodlum1980/LilyBaby.rar

 

    PS: 关于C++和C#的争论主要集中在性能上,这当然是一个无法忽视的问题;不过我觉得一个很重要的因素是有些地方更适合用甚至只能用C++,因为C#不能做到或者严重不适合;就我个人所遇到的这种情况有:

    (1)插件;例如windows mobile上的今日插件,photoshop的插件;

    (2)服务器通过IE部署到客户端的activeX控件;

    (3)依赖底层功能较多的windows程序(C# winform做起来会非常吃力),例如 隐藏进程,自动关机,切换桌面,全局hook,dll注入等传统windows技术。

    

    ===================

    PS: 刚才对附件做了一个重要更新,提高了绘制效率,即使在分块数量很多的情况下,也不会因为绘制问题而导致CPU占用率高,感觉很“卡”。方法是在绘制函数里面添加了一个参数(LPRECT lpRect),该参数表示的是“失效矩形”,当组成画布的元素位于该矩形外部时,则不对它进行绘制;部分代码如下:

 

    

ExpandedBlockStart.gif CGroup_DRAW
void  CGroup::Draw(HDC hDestDC, LPRECT lpRect)
{
    RECT rc;

    
// 必须有交集,才绘制它!
     if ( ! IntersectRect( & rc,  & this -> m_outterRect, lpRect))
        
return ;

    vector
< CBlock *> ::const_iterator pos;
    
for  (pos  =   this -> m_blocks.begin(); pos  !=   this -> m_blocks.end();  ++ pos)
    {
        (
* pos) -> Draw(hDestDC, lpRect);
    }
}

 

 

 

    当图元被拖动时,我们把图元的当前位置的边界和拖动后的边界,合并成一个“无效矩形”,然后把这个无效矩形下发给所有图元,进行画布更新,因此每个图元都知道自己是否真的需要重绘,这样即可大大提高绘图效率。在改进胡,除非某个位置有大量的图元重叠,否则基本不再会出现拖动时很卡的现象;

 

    当然,如果某个位置有大量图元重叠,实际上我们还可以做进一步优化,即把被拖动的当前图元作为一个单独对象,所有其他图元的绘制结果临时保存起来作为“背景”,在鼠标移动时,我们只需要把已经临时保存的“背景”做贴图即可(省略对图元的遍历性绘制),这样即可进一步提高效率,降低“图元重叠”导致的绘制负荷,但需要更复杂的代码逻辑。在本范例中,图元重叠率不高,因此为了简单起见,暂时不必要做进一步优化;

     --hoodlum1980  2010-6-29 16:52:58;

 

    此外还可添加一些其他功能,例如保存和加载运行时的游戏,把块的轮廓用位图模板去美化,选中时的高亮显示,运行时的帮助提示功能等,其中有些功能实现难度并不大,这里就不添加了。

    2010年7月6日15:57:22:修复拖动时在某些情况不能连续连接的问题。(原因是group合并时,没有更新可连接块集合)。    

 

转载于:https://www.cnblogs.com/hoodlum1980/archive/2010/06/29/1767284.html

相关文章:

  • Servicehot:高效数据中心运维团队有哪7个习惯
  • 2009年的SCI期刊JCR出来了
  • 如何使用Docker构建运行时间较长的脚本
  • cheminfo.gov.cn css 样式示例学习
  • 云服务器ECS资源查询的正确姿势
  • 事与人
  • 校园网配置Vmware的网络模式,便于Xshell和notepad的连接
  • 2015年云计算或将成为企业主流应用
  • MagicDraw UML 16.8 安装教程(2)-破解补丁
  • 使用Docker镜像构建RPM包
  • oracle存储过程例子及其他语句[1]
  • 把问题描述清楚是解决问题的起点
  • jquery:利用jsonp跨域访问--转载
  • async await
  • 《C#本质论》读书笔记(十)异常处理 @ Lennon
  • 深入了解以太坊
  • 【node学习】协程
  • co模块的前端实现
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Java程序员幽默爆笑锦集
  • Java-详解HashMap
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Sass Day-01
  • text-decoration与color属性
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 欢迎参加第二届中国游戏开发者大会
  • 基于遗传算法的优化问题求解
  • 计算机常识 - 收藏集 - 掘金
  • 排序算法之--选择排序
  • 深入浅出webpack学习(1)--核心概念
  • 算法-图和图算法
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 系统认识JavaScript正则表达式
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​TypeScript都不会用,也敢说会前端?
  • #Spring-boot高级
  • #考研#计算机文化知识1(局域网及网络互联)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (二十三)Flask之高频面试点
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (算法)N皇后问题
  • (转)c++ std::pair 与 std::make
  • (转)http协议
  • (转)JAVA中的堆栈
  • (转)程序员疫苗:代码注入
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET下ASPX编程的几个小问题
  • /dev/sda2 is mounted; will not make a filesystem here!
  • /etc/sudoer文件配置简析