使用标准GDI实现游戏品质的动画系统.docVIP

使用标准GDI实现游戏品质的动画系统.doc

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
使用标准GDI实现游戏品质的动画系统

使用标准GDI实现游戏品质的动画系统 燕良 2002年1月 / 前言 2 GDI基础 3 绘制一个位图(Bitmap)对象 3 常用像素格式 4 Windows下的基本动画系统 4 动画驱动方式 4 播放动画 5 消除闪烁 6 透明色(color key)处理 7 Alpha混合 9 读取JPEG,GIF文件 10 子窗口管理 12 进阶技巧--使用DIB 14 像素操作 14 RLE压缩 15 参考 15 华山论键 15 其它类库 16 前言 说到实现游戏品质的动画,很多人会立刻想到DirectX,没错DirectDraw很强大,但是并不是必须用DirectDraw才行。动画后面的理论和技巧都是一样的,这和末端使用什么API没有太大关系(如果那API不是太~~慢的话)。就笔者实现的NewImage Lib的测试结果,内部所有像素数据的存储和运算都纯软件实现,最后一步输出到屏幕使用GDI的性能比DirectDraw低不到10%,在Window9X系统上要低20%左右,这对很多软件来说是绝对可以接受的。 现在应用程序界面越做越华丽,除了支持SKIN外,很多人都想在程序中加入一些例如sprite动画这种原本用在游戏上的技术,因为这原因引入DirectX API,显然是不值得的(况且DX版本升级频繁,DX8中已经用DirectGraphic取代了DirectDraw)。本文将以笔者使用标准GDI函数实现的商业游戏为例,带你进入高品质2D动画编程领域,并且保证其设备无关性。 本文假设读者有C/C++语言知识,Windows编程基础,GDI基本概念。下面我将主要讲述我在过去工作中积累的经验和一些技巧,但是将不讲解以上基本概念。读者最好有MFC基础,本文给出的代码将主要使用MFC,但是其中的道理却不限于MFC。 GDI基础 绘制一个位图(Bitmap)对象 GDI的所有操作都是在DC(device context)上进行的,所以首先你应该有DC的概念,如果你对DC还不了解,现在就去翻一翻Windows编程的书吧。 首先我们要Load一个Bitmap对象,使用Win32 API可以写成这样: //从资源Load一个位图,如果从文件load的话,可以使用::LoadImage() HBITMAP hbmp=::LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_MYBMP)); 如果使用MFC可以这样写: CBitmap bmp; Bmp.LoadBitmap(IDB_MYBMP); 想把这个位图对象绘制到窗口上就要先得到窗口的DC,然后对这个DC操作。请留意创建MemoryDC的代码,后面会用到。 Win32 API的版本: //假设位图大小为100*100像素 //假设hwnd是要绘制的窗口的HANDLE HDC hwnddc=::GetDC(hwnd); HDC memdc=::CreateCompatibleDC(hwnddc); HBITMAP oldbmp=::SelectObject(memdc,hbmp); ::BitBlt(hwnddc,0,0,100,100,memdc,0,0,SRCCOPY); if(oldbmp) ::SelectObject(memdc,oldbmp); DeleteDC(memdc); ::ReleaseDC(hwnd,hwnddc); MFC版本: //假设是在一个CWnd派生类的成员函数中 CClientDC dc(this); CDC memdc; memdc.CreateCompatibleDC(dc); CBitmap *oldbmp=memdc.SelectObject(bmp); dc.BitBlt(0,0,100,100,memdc,0,0,SRCCOPY); if(oldbmp) memdc.SelectObject(oldbmp); 也可以这样: CClientDC dc(this); dc.DrawState(CPoint(0,0),CSize(100,100),bmp,DST_BITMAP); 基本的代码就是这样,当然有更多的API可以用,这就要看你自己的了。( 常用像素格式 要进行图像编程的化对像素格式不了解似乎说不过去。我想应该有较多的人并不太了解,所以这里简要的介绍一下。 8bit 也叫做256色模式。每个像素占一个字节, 使用调色板。调色板实际上是一个颜色表,简单的讲就是,我们有256个油漆桶(因为像素的取值范围是

文档评论(0)

aicencen + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档