当前位置:传奇私服首页 --> 技术文章 --> 如何实现游戏截屏功能
传奇技术文章标题

如何实现游戏截屏功能

作者:517Sf 文章来源:www.517sf.com 点击数:321321 更新时间:2008-4-25 17:49:49

现在很多游戏都提供一种截屏的功能,用来截取游戏中的画面,那么这是如何实现的呢?其实就是把游戏当前屏幕的数据存成一个图片文件;在这里我给出一段源程序,它实现了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;

转载请注明出自:传奇私服
私服推荐文章列表
·2008回顾 带你领略真正的E32008-7-28
·康熙来了之魔兽世界2008-7-28
·媒体评选2008 E3各平台最佳游戏2008-7-28
·地龙与天龙的惊天战绩精彩2008-7-16
·钻石版本传奇私服说明2008-5-28
·传奇和现在的玩家2008-5-8
·也谈元宝商人2008-5-6
·泰山呼啸传奇屠龙跑单事件2008-5-6
·传奇游戏的升武器配方2008-5-6
·一个女生的传奇心情故事(转) 2008-4-30
·传奇给我带来恨与爱2008-4-30
·一诉传奇的日子(武曲进来踩)2008-4-30
·在诉传奇的故事(武曲的再踩!)2008-4-30
·他说,我想太多2008-4-30
·陪君醉笑三千场(天道)2008-4-30
·武曲二三事2008-4-30
·4·21沙巴克守城记(1)2008-4-30
·你我的结局?2008-4-30
·感动天道--英雄篇(天道)2008-4-30
·曾经的"天下"2008-4-30
·有关传奇私服数据库Anico 2008-4-26
·穿怪不穿人m2修改方法2008-4-25
·尽量防止回档和复制的服务器关闭方法2008-4-25
·一个IP开设多区(盛大的设置方法) 2008-4-25
·新人架设好传奇私服后需要注意的事情 2008-4-25
·最新DB数据库大全详细说明(改属性必2008-4-25
·法师都飞不出去的监狱 2008-4-25
·如何实现游戏截屏功能2008-4-25
·清除指定地图里的怪物 2008-4-25
·物品极品属性详解 2008-4-25
传奇私服
Copyright (c) 2003-2009 版权所有 www.517SF.com China Ltd. All Rights Reserved.
京ICP备:06040664号