游戏编程之十 图像引擎DirectXDraw

简介: 游戏编程之十 图像引擎DirectXDraw

图像引擎DirectXDraw


 目前win95下比较常用的图像引擎是DirectX,国内资料比较少,我给大家推荐过<<高性能WINDOWS图形设计>>这本书,大家不妨找一下.

 在我们的游戏引擎中,目前使用的也是DirectX,网上见到有关DirectX的简化接口的对象库,没有使用过,不知如何,最好是自己做这些对象,灵活些.

图像引擎在游戏中的作用是这样的,设置显示模式,管理操作一种特殊图像表面,显示到屏

幕.  

图像引擎对象:

class DirectDrawWin 
{ 
 HWND hWnd; 
 BOOL IsUse; 
 int  winWidth,winHeight; 
 LPDIRECTDRAW2 ddraw2; 
 LPDIRECTDRAWSURFACE primsurf; 
 LPDIRECTDRAWPALETTE palette; 
 CDirectPAGE bakDirectPAGE;//背景表面,是CPICPAGE的继承对象CDirectPAGE的实例 
 LPDIRECTDRAWCLIPPER clipper; 
 RECT displayrect; 
 int displaydepth; 
 WORD loREDbit, numREDbits; 
 WORD loGREENbit, numGREENbits; 
 WORD loBLUEbit, numBLUEbits; 
public: 
 DirectDrawWin(); 
 ~DirectDrawWin(); 
 BOOL IsWorking(void); 
 int OnCreate(HWND _hWnd,BOOL IsFullWin=FALSE,int colors=16,int 
width=640,int height=480); 
 void DrawScene(); 
  BOOL ClearSurface( LPDIRECTDRAWSURFACE surf, DWORD clr, RECT* rect=0 ); 
  BOOL ClearSurface( LPDIRECTDRAWSURFACE surf, DWORD r, DWORD g, DWORD b,RECT* rect=0 ); 
 BOOL BltSurface(LPDIRECTDRAWSURFACE destsurf,LPDIRECTDRAWSURFACE srcsurf, int   srcInX, 
             int srcInY,DWORD flap, RECT *DecView=NULL,RECT *souRectBlt=NULL,//源图片目标区 
             RECT *lpFillRect=NULL); 
 CPICPAGE  *GetDecDrawPage(void); 
 LPDIRECTDRAWSURFACE CreateSurface( DWORD w, DWORD h ); 
 HRESULT SetColorKey(IDirectDrawSurface *pdds, COLORREF rgb); 
//====================================================================== 
private: 
 void SetHWnd(HWND _hWnd); 
 HWND GetSafeHwnd(){return hWnd;}; 
 BOOL CreateFlippingSurfaces(); 
 void OnDestroy(); 
 DWORD RGBtoPixel(DWORD r, DWORD g, DWORD b); 
 void GetSurfaceRect(LPDIRECTDRAWSURFACE surf,RECT *lpRc); 
 DWORD ColorMatch(IDirectDrawSurface *pdds, COLORREF rgb); 
 BOOL GetSurfaceRect( LPDIRECTDRAWSURFACE surf, RECT& rect); 
// 
 WORD LowBitPos( DWORD dword ); 
 WORD HighBitPos( DWORD dword ); 
 BOOL StorePixelFormatData(); 
 BOOL DetectDisplayMode(); 
}; 

 大家可以看到,对外的接口有限,主要是初始设置OnCreate,输出到屏幕DrawScene,然后是表面的生成CreateSurface和图像操作ClearSurface,BltSurface; 初始设置OnCreate():初始DrectX,设置显示模式,申请前表面,背景表面.对于即时滚屏的游戏,为了加快速度,可以将背景表面设置得比显示区大,这样滚动时只要局部更改活动区,设置DrawScene时的起始位置即可.但我们没有使用这项技巧,我们的系统设计原则之一是:尽量少用技巧,靠系统设计提高速度,而不是局部技巧,原因是技巧的适应范围一般有限.系统尽量要求通用.

 

 表面的生成和图像操作被一个叫CPICPAGE的通用图像页调用,CPICPAGE是一个包括各种位图格式的统一管理对象,游戏在进行图像操作时,不直接与DirectX图像表面打交道,CPICPAGE扩展了DirectX图像操作功能,比如带alpha通道的BLT,以及带亮度的BLT,直接对表面的Line,DrawTxt等.BltSurface()是一个包括许多剪裁定位输求的函数.

 

 对于窗口模式下的DrawScene,为了避免屏幕产生图像撕裂现象,可以利用垂直同步刷新同步地更新屏幕,为了减少此过程的等待时间,可以使用多线程技术.

  为了加快游戏显示速度,在使用DirectX中有许多可以挖掘的技巧.

   有关DirectX的部分我不作详细介绍,网上有一部分资料,另外可参阅<<高性能WINDOWS图形设计>>一书,我们的这个对象就是在其书的基础上简化而来,需要这部分源代码的朋友可来信与我们联系。


目录
相关文章
|
Java API 容器
Java Applet
Applet 是一种 Java 程序。它一般运行在支持 Java 的 Web 浏览器内。因为它有完整的 Java API支持,所以Applet 是一个全功能的 Java 应用程序。
263 0
|
10月前
|
JavaScript 前端开发 UED
jquery实现文字点选验证码
通过上述步骤,可以使用jQuery实现一个功能完整、易用的文字点选验证码系统。该系统不仅能够有效防止自动化攻击,还可以通过友好的交互提升用户体验。希望本文的详解能够为开发者提供有价值的参考,帮助实现高效的验证码功能。
355 14
|
运维 应用服务中间件 Linux
自动化运维:使用Ansible进行批量配置管理
【10月更文挑战第36天】在现代的IT基础设施中,高效和可靠的系统管理变得至关重要。本文将介绍如何使用Ansible这一强大的自动化工具来简化运维任务,包括安装、配置、部署应用程序以及管理系统更新。我们将探讨Ansible的核心概念,并通过实际代码示例展示其应用。通过阅读本文,读者将获得使用Ansible改善日常运维工作流程的实用知识。
165 1
|
8月前
|
关系型数据库 Linux 数据库
PostgreSQL 入门指南:安装、配置与基本命令
本文从零开始,详细介绍如何在 Windows、Linux 和 macOS 上安装和配置 PostgreSQL,涵盖30+个实操代码示例。内容包括安装步骤、配置远程访问和用户权限、基础数据库操作命令(如创建表、插入和查询数据),以及常见问题的解决方案。通过学习,你将掌握 PostgreSQL 的基本使用方法,并为后续深入学习打下坚实基础。
9796 1
|
JSON 缓存 前端开发
验证码demo(简单实现)
验证码demo(简单实现)
|
监控 网络协议 数据挖掘
阿里云国际云解析DNS如何开启/关闭流量分析?
阿里云国际云解析DNS如何开启/关闭流量分析?
|
安全
AC800PEC 系列 激励装置控制单元GFD563A101 3BHE046836R0101
AC 800PEC是ABB推出的一款控制系统,特别适合大功率整流器应用。它具备100微秒的快速控制周期和对长期瞬变的处理能力,采用双核处理器集成高速与低速控制,减少了对独立PLC的需求。
150 0
AC800PEC 系列 激励装置控制单元GFD563A101 3BHE046836R0101
|
存储 C++
【PTA】​L1-034 点赞(C++)
【PTA】​L1-034 点赞(C++)
121 0
|
关系型数据库 分布式数据库 PolarDB
PolarDB常见问题之安装gms时出现docker如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。