初步看了一下这篇文章,基本是没有什么大用,只是对于初学时,有点点的指导作用.要真正掌握DirectDraw还是系统去学习一下DirectDraw,有本DirectDraw的中文手册,可以看一下. 以下为转: 这并非哗众取宠, 通常学习一种电脑技术有两种方法. 一种是自己摸索, 在错误的方向上一错再错, 屡战屡败, 不过最后得道成功. 另一种是有人 或好的材料指导, 因而事半功倍, 在正确的方向上走了速成的捷径. 就象KFC 的鸡一样. 第一种学法能学出电脑天才, 因为所谓电脑高手, 其实就是排错试错的高手. 而第二种则出电脑专才. 这个两小时(?)的学习, 不能使你深入的掌握DD, 不过可以给你编制DD的框架. 能给你 一个起始点, 这个教程就算成功了. DirectDraw编程需要一些背景知识: DirectDraw是为在 Windows95/NT 下实现高速图形显示所写的程式库. 高速图形显示的基本方法是用一种叫做 Page Flipping的技术. 关于什么是 Page Flipping, 参见古技介绍.如果你不急的话, 看到下面, 你也会看到. 在 Windows95/NT下做 Page Flipping 分为全屏的和窗口的两种. 在全屏下Page Flipping 叫做Flip, 在窗口下叫做 Blit. 知道了这些背景知识, 我们可以开始写程式了. 写所有 DirectDraw的程式, 差不多都有以下几个步骤, 1. 初始化, 这是每个程式都需要的劳什子. 步骤一: 初始化 DirectDraw 是一个面向对象的函数库. "面向对象"的意思并不是指面对著你的女朋友, "对象" 在这里, 你可以简单地想象成是一个模板, 比方说,"政府", 一旦你说:"我成立了一个政府". 别人 就会立即把你套入"政府模板", 自然而然地认为你有印钞票的功能. 在我们的程式里, 你一旦声明 一个变量(比如 myDD)是 DirectDraw对象 (DirectDraw对象的正式名为 LPDIRECTDRAW) , 这个myDD就有了 DirectDraw对象的所有的功能和特性. 定义 的语法是: LPDIRECTDRAW pMyDD; LPDIRECTDRAWSURFACE pMyDDSFront; LPDIRECTDRAWCLIPPER pMyClipper; 编制 Windows 程式有一大堆变量和对象是 Windows所要求的, 这也是我最烦 Microsoft的地方. Microsoft 似乎知道这点. 所以在 VC4.0后的版本有了 Wizard的功能帮你自动生成代码. 尽量地去用它的 Wizard使我们的生活变得容易. 由于我们的程式可能会占用一个窗口, 就给这个窗口一个 handle: HWND myWnd pMyDD = NULL; 最后, 在 Windows系统为我们的 myDD对象开辟相应的区域: DirectDrawCreate( NULL, //用当前的显示驱动
DirectDraw 有自己的设置屏幕的方式, 而且它的屏幕模式分为"全屏"( exclusive mode)和"窗口"( normal mode). 各有各的设置方法. 设置的主要区别在于 SetCooperativeLeve的参数. SetCooperativeLeve 在"窗口"模式下这样设置: pMyDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ); pMyDD->SetDisplayMode( 640, 480, 8 );
两块画板的好处是可以一边在一块上面画, 一边给别人看已经画好的另一块. 等这块画好了, 两块板就对调一下, 让别人看新画好的这块. 如果画的足够快, 换的足够快. 看的人就会看到动画了, 就象电影的效果一样. 我们把这叫做 Page Flipping. ddsd.dwSize = sizeof(ddsd); //尺寸
if (result!=DD_OK) }
//指定 我们要后页 //做后页 }
在窗口下. 为了防止 DirectDraw 画到窗口外面去. 需要加一个画框(裁剪板). 可以用 CreateClipper来创建剪贴板. 创建后,把它套到窗口上去, 所以要知道是那一个窗口( Handle). myWnd = AfxGetMainWnd()->GetSafeHwnd();// 从系统中拿到窗口的 Handle // 把剪贴板加到窗口上去
其实到这里才是真正开始写游戏的地方, 以前在 DOS下写游戏, 就是直接从 这个步骤开始的. 以上这些工作, 都是 Microsoft强加给我们的.
// 如果前页的内存被 Windows"征用"了, 这里把它要回来. 这个检察常常会被忘记.
result = pMyDDSFront->Blt(&rcTo, pMyDDSBack, &rcFrom, DDBLT_WAIT,NULL);
result = pMyDDSFront->Flip( NULL, 0 ); 所有的步骤都讲完了. 是不是觉得特容易? 半个小时就够了? okay, 剩下的一个半小时让 你把它们变成真正的代码吧. 打开你的 Visual C++, 我用的是 VC5.0, 不过你也可以用 VC4.0. 再低恐怕就不可以了. 别忘了检查一下你的 DirectX SDK 有没有安装好. 打开VC, 选择 MFC app EXE Wizard 来生成程式的框架, 我假设学DirectDraw的人应该 会用VC, 所以怎样用 Wizard, 我就不再赘述. 进入 IDE环境后, 加入一个新 CPP file, 把上面用到的子函数的代码打入. MFC(Microsoft Fried Checken)的 Wizard会帮你生成 ::InitInstance() 和 ::OnIdle(LONG lCount), 把你的 初始化部份, 建页等步骤放在 InitInstance子类里. 把"游戏逻辑"和换页放在 OnIdle里. [align=right][color=#000066][此贴子已经被作者于2009-3-14 22:12:13编辑过][/color][/align] (ixmy) |