| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4034 人关注过本帖, 3 人收藏
标题:连连看游戏 以及 (读取并显示位图),(截屏)头文件
只看楼主 加入收藏
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
收藏(3)
 问题点数:0 回复次数:15 
连连看游戏 以及 (读取并显示位图),(截屏)头文件
BITBLT.H:

    这是我今晚写的一个头文件。它可以读取24bpp的BMP后缀的位图。
    注意,仅针对24bpp,BMP格式,不能读取其他格式图像。
    然后调用里面的BitBlt函数可以把位图显示在屏幕指定位置。
    显示时,采用了颜色空间距离拟合为VGA模式下的16色。
    还可以获取和设置位图指定坐标的颜色。具体方法可以查看该文件的代码。
    具体用法参考BitBltDemo.c中的代码。

    这个头文件可以放到TC的INCLUDE文件夹中。以后只要像引用其他头文件那样引用它即可。

    在这个头文件里我模仿了一些微软的做法,例如以句柄实现数据结构的封装等。

CPYSCR.H

    我从前写的一个头文件。用于在TC的绘图模式下截图屏幕,并保存到BMP文件。
    同样,可以放在TC的INCLUDE文件夹中。

BitBltDemo.c

    这是BITBLT.h头文件的使用范例。注意,代码中使用的是图片的绝对路径,因此
    运行前需要把附件所带的CELLS.bmp的绝对路径设置正确。否则会出现加载位图失败。


lian_jfd.c

    我写的一个连连看游戏。采用了CELLS.bmp文件作为图片资源。该文件的核心算法讲解略。
    编译前请把文件结尾的main函数中的图片和驱动文件所在的路径设置正确即可。

VGA模式下的截图.BMP

    使用CPYSCR.H在VGA模式下,对初始化后的连连看游戏进行的截图。(还未绘制进度条)


具体文件请参考附件的压缩包。
---------------------------------------------------
在BitBlt.h中的一些重要函数:
---------------------------------------------------
/*读取一个问题,返回位图句柄,如果失败,返回NULL*/
HBITMAP LoadBitmap(char *filename);
/*释放位图对象占用的内存*/
bool DeleteBitmap(HBITMAP hBitmap);
/*把图片贴到屏幕上!指定屏幕上的目标矩形 和 位图上的起始点*/
bool BitBlt(HBITMAP hBitmap, int nXDest, int nYDest, int nWidth, int nHeight, int nXSrc, int nYSrc);
/* 获取位图尺寸 */
void GetBitmapSize(HBITMAP hBitmap, BMSIZE* sz)
/* 获取某点的color值,返回0xff表示失败 */
BYTE GetPixel(HBITMAP hBitmap, int nXPos, int nYPos);
/* 设置某点颜色值,返回是否设置成功 */
bool SetPixel(HBITMAP hBitmap, int nXPos, int nYPos, BYTE color);

-------------------------------------------------------------
在cpyscr.h中,有以下重要函数:
-------------------------------------------------------------
/* 指定在VGA模式下的屏幕左上角和右下角坐标,把该矩形区域截屏并保存到给定的filename文件*/
/* 被保存的文件格式是bpp=4的BMP位图。如有其他需求可以在Photoshop中做进一步处理。*/
void CopyScreen(char* filename,int left,int top,int right,int bottom);

-------------------------------------------------------------
以上文件的具体代码,限于篇幅,不在这里贴出了,请下载附件进行查看。
请注意:本压缩包的文件全部使用TC2.0编译的。请不要使用VC去编译。


------------------------------------------------------------------
(1)补充了一个节省内存的版本:bitblt2.h。它加载图片时的像素上限建议数量为80000像素。
(2)修正了GetNearestColor函数中的一个逻辑错误。(重要修正)

[[it] 本帖最后由 hoodlum1980 于 2008-9-11 12:37 编辑 [/it]]

连连看和数字时钟.rar (186.64 KB) 源代码和可执行文件



SNAP_LIAN.gif (6.2 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册


IMGCLOCK.gif (13.55 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: VGA模式下截屏 
2008-08-28 01:29
qfyzy
Rank: 2
等 级:论坛游民
威 望:1
帖 子:380
专家分:86
注 册:2008-2-17
收藏
得分:0 
写的还不错。真的不推荐在TC下作图,和现在主流的东西有很大区别。个人感觉JAVA SE的作图已经算很容易了,还要比TC下的麻烦很多,至少不是想画就画。

当对C的经验增加时,它会显的很好用.----Dennis M Ritche如是说
2008-08-29 09:29
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
感觉你发的ScreenShot根本没有24色,最多16色
哎,用Win32的GDI不是很好吗,干吗要用TC来做图形程序
在GDI中有直接的API函数BitBlt供你调用,何必自己写呢?
文件夹里面的CELLS.bmp是24色没错,但是一到程序里就变16色(或8色)了。
运行你的程序,上面显示“无法读取位图”,看来这个程序是有问题的,建议修改

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-08-29 09:34
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
我现在在用M$的Direct3D做图形程序。3D的画面的确不错

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-08-29 09:37
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
其他的我不多说,因为曾经在本论坛的图形区发过一篇关于TC做图形程序的争论帖,具体可以去那里看

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-08-29 09:39
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
收藏
得分:0 
[bo][un]flyue[/un] 在 2008-8-29 09:34 的发言:[/bo]

感觉你发的ScreenShot根本没有24色,最多16色
哎,用Win32的GDI不是很好吗,干吗要用TC来做图形程序
在GDI中有直接的API函数BitBlt供你调用,何必自己写呢?
文件夹里面的CELLS.bmp是24色没错,但是一到程序里就变 ...


我说的很清楚啦,因为文件写的是绝对路径。因此需要你重新编译一下。我懒得再发一个另一个编译好的版本出来了。
另外,变成16色是因为进入的是VGA模式。作为在vga模式下显示位图所付出的代价,
颜色的数量被降低。

本人VC,也会,用c#写更快。但是我喜欢c的底层特性,现在发这些东西也是基于一种怀旧心理。
用tc只是因为更能体会面向过程如何转换到面向对象,可以体会这个思维的转换过程。
如果我用vc写,那就是只需要考虑纯逻辑了,不如用c具有很强的挑战性,在用c的时候我需要考虑的更多和更加
接近底层和原始状态。当然我用其他技术比如OpenGL可以做到更绚丽的效果。有待进一步的研究。
2008-08-29 09:41
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
收藏
得分:0 
[bo][un]flyue[/un] 在 2008-8-29 09:34 的发言:[/bo]

感觉你发的ScreenShot根本没有24色,最多16色
哎,用Win32的GDI不是很好吗,干吗要用TC来做图形程序
在GDI中有直接的API函数BitBlt供你调用,何必自己写呢?
文件夹里面的CELLS.bmp是24色没错,但是一到程序里就变 ...


这个问题我已经申明过了。你可以下载我的早上发的另一个帖子里的那个IMGCLOCK的附件,这个附件你把它直接解压放到c盘,应该就可以运行看到它的效果。
链接在这里:https://bbs.bccn.net/thread-230374-1-1.html

这个我是特意这样做的。因为我目前还不知道在tc里面怎么获取可执行文件的所在路径,所以就只好写成hard code的路径。
如果在VC下面我可以通过GetModuleFileName来得到可执行文件名,如果在下可以用Application.StartupPath。但是在tc里面我不知道,前几天大致百度查了下也没找到答案。因此暂时放弃。

我以前发的一个俄罗斯方块本来也是专门用tc来写的,但是有一些网友说在vc下无法编译,所以我特别有用vc6给它改造成vc下的版本。这些不能代表什么,我还有编写过Photoshop软件的滤镜插件,教程,也用c#做过分形图像。我从不认为一个人应该厚此薄彼,尤其是对于很多过于专注自身领域的人尤其容易犯下此等浅视的错误,会自己把技术分出高低贵贱,过于绝对。关于更多的东西,你都可以访问我的技术blog看到。我的研究核心并不在tc和绘图。但算法和数据结构等比较底层的东西是我比较喜欢的方向之一。

我现在使用的工具主要是用 VC6 和.Net2003~ .Net 2005。Tc2.0是我10年前学习C语言的时候使用的,至今我依然喜欢它。

[[it] 本帖最后由 hoodlum1980 于 2008-8-29 09:56 编辑 [/it]]
2008-08-29 09:50
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
其实改相对路径只需要把"c:\\tc\\output\\CELLS.bmp"修改成"CELLS.bmp"就OK了,去掉前面的绝对地址

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-08-29 09:57
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
收藏
得分:0 
[bo][un]flyue[/un] 在 2008-8-29 09:57 的发言:[/bo]

其实改相对路径只需要把"c:\\tc\\output\\CELLS.bmp"修改成"CELLS.bmp"就OK了,去掉前面的绝对地址


另外一点,你看到的截图,也是我用我自己写的代码,写到bmp文件中的。因为在VGA模式下,根本没有DC的概念,所以windows下的那种截图方式是不行的。
在windows下面你可以拿到某个窗口的句柄(你看到的任何东西基本都是窗口或者属于某个窗口),然后就可以获得它的dc,bitblt一下就得到了。但是在tc里面,我是把屏幕上的每一点用getpixel函数得到,再写入bmp文件。这和读取和显示bmp恰好是一个方向相反的一个转换过程。
2008-08-29 10:01
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
这个我知道。其实直接对缓冲区操作比用DC是更好玩,比如可以对图片制作Alpha效果,拉伸,反转,旋转,反色,加亮,平滑等处理

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-08-29 10:11
快速回复:连连看游戏 以及 (读取并显示位图),(截屏)头文件
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.041447 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved