[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。

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

    

     

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

    https://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),该参数表示的是“失效矩形”,当组成画布的元素位于该矩形外部时,则不对它进行绘制;部分代码如下:

    

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/p/1767284.html