金桥科普  
设为首页 关于我们 邮箱登录
科普聚焦时代科技科普生活科学技术自然科学航空航天科技博览历史考古电脑IT
您现在的位置: 首页 >> 科普频道 >> 电脑游戏 >> 文章详情
如何实现游戏截屏功能

SoftBoy  gameres 2006-08-11

如何实现游戏截屏功能


  现在很多游戏都提供一种截屏的功能,用来截取游戏中的画面,那么这是如何实现的呢?其实就是把游戏当前屏幕的数据存成一个图片文件;在这里我给出一段源程序,它实现了DirectDraw(16位模式)下的的游戏截屏。生成的文件格式为BMP,程序有比较详细的注释,请各位自己看吧。

  现在很多游戏都提供一种截屏的功能,用来截取游戏中的画面,那么这是如何实现的呢?其实就是把游戏当前屏幕的数据存成一个图片文件;在这里我给出一段源程序,它实现了DirectDraw(16位模式)下的的游戏截屏。生成的文件格式为BMP,程序有比较详细的注释,请各位自己看吧。

bool Is555; // 是否是565模式,这个变量需要用者填写

// 功能:将一个16位的DirectDraw表面,存为一张24位BMP位图 (传入主表面即截屏)
// 输入:表面指针,输出的文件名
// 输出:是否成功
bool SaveToBitmapFile(LPDIRECTDRAWSURFACE lpSurface, char* filename)
{
    WORD* lpBuffer; // 表面指针
    int nPitch; // 表面跨距
    int nWidth, nHeight; // 表面宽高

    // 打开文件s
    FILE* fp;
    if( (fp=fopen(filename, "wb")) != NULL )
    {
        // 锁定表面
        DDSURFACEDESC ddsd;
        ddsd.dwSize = sizeof(ddsd);
        HRESULT ddrval = lpSurface->Lock( NULL, &ddsd, DDLOCK_WAIT, NULL );
        if( ddrval == DD_OK )
        {
            lpBuffer = (WORD *)ddsd.lpSurface;
            nWidth = ddsd.dwWidth;
            nHeight = ddsd.dwHeight;
            nPitch = ddsd.lPitch >> 1; //lPitch以Byte为单位,GraphPitch以WORD为单位。所以GraphPitch = lPitch / 2;
        }

        // 保存文件头
        BITMAPFILEHEADER FileHeader;
        FileHeader.bfType = 'BM';
        FileHeader.bfSize = nWidth * nHeight * 3 + 0x36;
        FileHeader.bfReserved1 = 0;
        FileHeader.bfReserved2 = 0;
        FileHeader.bfOffBits = 0x36;
        fwrite(&FileHeader, sizeof(BITMAPFILEHEADER), 1, fp);

        // 保存文件信息
        BITMAPINFOHEADER Header;
        Header.biSize = sizeof(BITMAPINFOHEADER); // 结构的大小
        Header.biWidth = nWidth; // 宽
        Header.biHeight = nHeight; // 高
        Header.biPlanes = 1; // 固定
        Header.biBitCount = 24; // 颜色数
        Header.biCompression = BI_RGB; // 是否压缩
        Header.biSizeImage = nWidth * nHeight * 3; // 图片的大小
        Header.biXPelsPerMeter = 0;
        Header.biYPelsPerMeter = 0;
        Header.biClrUsed = 0;
        Header.biClrImportant = 0;
        fwrite(&Header, Header.biSize, 1, fp);

        // 写入具体内容(从下向上存放)
        fseek(fp, 0x36, SEEK_SET);
        WORD word;
        lpBuffer += nWidth * (nHeight - 1);
        for(int i=0; i
{
            for(int j=0; j {
                word = *lpBuffer;
                fputc( GetBlue( word ), fp); // 蓝
                fputc( GetGreen( word ), fp); // 绿
                fputc( GetRed( word ), fp); // 红
                lpBuffer++;
            }
            lpBuffer -= nPitch*2; // 指针转到上一行的开始
        }

        fclose(fp);

        // 解锁表面
        ddrval = lpSurface->Unlock( NULL );
        return true;
    }

    return false;
}

inline unsigned char GetRed(WORD color)
{
    if( Is555 )
        return (color>>7) & 0xff;
    else
        return (color>>8) & 0xff;
}

inline unsigned char GetGreen(WORD color)
{
    if( Is555 )
        return (color>>2) & 0xff;
    else
        return (color>>3) & 0xff;
}

inline unsigned char GetBlue(WORD color)
{
    return (color & 0x1f) << 3;
}

------------------------
金点时空
softboy
2001.5.9
http://www.gpgame.com
------------------------

  发表评论 写信给编辑 关闭窗口
同栏目内容
· 瑞典在网游中开设虚拟大使馆 2007-06-06
· 魔兽争霸3秘籍(魔兽无敌秘籍) 2007-03-28
· 从头学习DirectDraw 2006-08-11
· DirectShow全屏播放视频 2006-08-11
· 游戏基础:我该使用何种语言 2006-08-11
· 游戏开发 ——物品管理系统 2006-08-07
相关内容
近期主推
西藏发现青藏高原最大冰川群
·西藏发现青藏高原最大冰川群
·中日: "月亮女神"携手"嫦娥"
·行星大碰撞砸死恐龙催生人类
·美研制会飞汽车定价9万美元
·美国教授设计出自适应机器人
·银河系可能有20多个黑洞
近期热门
英海域惊现大龙虾为普通龙虾5倍
·英海域惊现大龙虾为普通龙虾5倍
·新物种金蛙体表有剧毒
·我国嫦娥工程计划测量月球
·精神病药物可治多种癌症
·视觉震撼:来自海底的精灵
·能删除不良记忆的药物诞生
近期焦点
广西发现罕见溶洞钟乳石有30万年
·广西发现罕见溶洞钟乳石有30万年
·澳大利亚惊现“卡布基诺”海滩
·美国"彩色"瀑布夜幕下震撼游人
·地球上究竟有多少个物种
·英国探险家北极游泳破纪录
·世界之最 世上最小的动物
金桥科普是一个公益性栏目,内容由作者提供或摘自互联网,其目的是向广大网民普及科学技术知识。如果您发现本网站转载或摘编了您拥有著作权的作品,请通知我们(电话:023-63659911),我们立即删除。
关于我们 | 网站地图 | 用户注册 | 广告客户 | 招聘信息 | 业务信息
Copyright@2006-2009 JQInfo.com,WONDER. All Rights Reserved
重庆科技咨询中心.重庆网得信息技术有限公司.版权所有
Email:webmaster@jqinfo.com
重庆数据通信局提供网络带宽. 渝ICP备05002327号