欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=440
这并非哗众取宠, 通常学习一种电脑技术有两种方法. 一种是自己摸索, 在错误的方向上一错再错, 屡战屡败, 不过最后得道成功. 另一种是有人 或好的材料指导, 因而事半功倍, 在正确的方向上走了速成的捷径. 就象KFC 的鸡一样. 第一种学法能学出电脑天才, 因为所谓电脑高手, 其实就是排错试错的高手. 而第二种则出电脑专才. 这个两小时(?)的学习, 不能使你深入的掌握DD, 不过可以给你编制DD的框架. 能给你 一个起始点, 这个教程就算成功了.
DirectDraw编程需要一些背景知识:
DirectDraw是为在 Windows95/NT 下实现高速图形显示所写的程式库.
高速图形显示的基本方法是用一种叫做 Page Flipping的技术. 关于什么是 Page Flipping, 参见古技介绍.如果你 不急的话, 看到下面, 你也会看到.
在 Windows95/NT下做 Page Flipping 分为全屏的和窗口的两种. 在全屏下Page Flipping 叫做Flip, 在窗口下叫做 Blit.
知道了这些背景知识, 我们可以开始写程式了.
写所有 DirectDraw的程式, 差不多都有以下几个步骤,
1. 初始化, 这是每个程式都需要的劳什子.
2. 设置显示模式.
3. 在内存里建立PageFlipping所需要的两个页, 前页和后页.
4. 给显示的区域加个画框以免画到外面来.
5. 在后页画图, 然后"刷"的一下子换到前页来.
步骤一: 初始化
DirectDraw 是一个面向对象的函数库. "面向对象"的意思并不是指面对著你的女朋友, "对象" 在这里, 你可以简单地想象成是一个模板, 比方说,"政府", 一旦你说:"我成立了一个政府". 别人 就会立即把你套入"政府模板", 自然而然地认为你有印钞票的功能. 在我们的程式里, 你一旦声明 一个变量(比如 myDD)是 DirectDraw对象 (DirectDraw对象的正式名为 LPDIRECTDRAW) , 这个myDD就有了 DirectDraw对象的所有的功能和特性. 定义 的语法是:
LPDIRECTDRAW pMyDD;
除了 DD的对象外, 还有几个重要的对象, "页面", "裁剪板" 和 "调色板". "页对象"用来定义"前页"和"后页". 定义如下:
LPDIRECTDRAWSURFACE pMyDDSFront;
LPDIRECTDRAWSURFACE pMyDDSBack;
一个"裁剪板对象", 在窗口模式下用来剪去画出窗口边界的部份.
LPDIRECTDRAWCLIPPER pMyClipper;
"调色板"设定屏幕的颜色表, 在读取256色的 Bitmap时要用到.
LPDIRECTDRAWPALETTE myDDPal;
最最重要的"对象"就是这些了. 当然 DirectX还有很多复杂晦涩的对象. 这是速成不起来的.
编制 Windows 程式有一大堆变量和对象是 Windows所要求的, 这也是我最烦 Microsoft的地方. Microsoft 似乎知道这点. 所以在 VC4.0后的版本有了 Wizard的功能帮你自动生成代码. 尽量地去用它的 Wizard使我们的生活变得容易.
由于我们的程式可能会占用一个窗口, 就给这个窗口一个 handle:
HWND myWnd
初始化的工作还没有完, 我们要把这些对象指向一个安全的地方 Null.
pMyDD = NULL;
pMyDDSFront = NULL;
pMyDDSBack = NULL;
pMyClipper = NULL;
pMyDDPal=NULL;
最后, 在 Windows系统为我们的 myDD对象开辟相应的区域:
DirectDrawCreate( NULL, //用当前的显示驱动
&pMyDD, NULL))
Okay, 烦人的初始化总算完了.
步骤二: 设置屏幕的显示方式.
DirectDraw 有自己的设置屏幕的方式, 而且它的屏幕模式分为"全屏"( exclusive mode)和"窗口"( normal mode). 各有各的设置方法. 设置的主要区别在于 SetCooperativeLeve的参数.
SetCooperativeLeve 在"窗口"模式下这样设置:
pMyDD->SetCooperativeLevel(AfxGetMainWnd()->GetSafeHwnd(),DDSCL_NORMAL);
而在"全屏"模式下这样设置:
pMyDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
如果它们的返回值为 DD_OK表示成功. 我们就可以把屏幕调节成我们想要的样子, 例如 640x480x8. 也就是256色. 究竟有那些屏幕模式可用取决于你的显示卡
pMyDD->SetDisplayMode( 640, 480, 8 );
现在, 我们已经有了一个屏幕, 不过还不能在上面画画, 我们需要步骤三来 替我们建立一个可供画画涂涂用的画板.
步骤三: 建立前后页(两块画板).
两块画板的好处是可以一边在一块上面画, 一边给别人看已经画好的另一块. 等这块画好了, 两块板就对调一下, 让别人看新画好的这块. 如果画的足够快, 换的足够快. 看的人就会看到动画了, 就象电影的效果一样. 我们把这叫做 Page Flipping.
这里先要介绍的是怎样在系统中建立两块画板( double buffering), 不过你也可以根据需要建立三块,四块画板.
DDSURFACEDESC ddsd; //这个结构描述"页"的特徵.
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;//指定我们用的是前页.
ddsd.dwSize = sizeof(ddsd); //尺寸
// 做前页:
HRESULT result;
result = pMyDD->CreateSurface(&ddsd, &pMyDDSFront, NULL);
当发生错误时, 要记得 Release对象.
if (result!=DD_OK)
{
pMyDD->Release();
pMyDD = NULL;
}
ddsd.dwWidth = scr_width; //设定后页的大小,
ddsd.dwHeight = scr_height;
//指定 我们要后页
ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
//做后页
result = pMyDD->CreateSurface(&ddsd, &pMyDDSBack, NULL);
}
步骤四: 给显示区加一个画框(裁剪板).
在窗口下. 为了防止 DirectDraw 画到窗口外面去. 需要加一个画框(裁剪板). 可以用 CreateClipper来 创建剪贴板.
result = pMyDD->CreateClipper(0, &pMyClipper, NULL);
创建后,把它套到窗口上去, 所以要知道是那一个窗口( Handle).
myWnd = AfxGetMainWnd()->GetSafeHwnd();// 从系统中拿到窗口的 Handle
result = pMyClipper->SetHWnd(0, myWnd);
// 把剪贴板加到窗口上去
result = pMyDDSFront->SetClipper(myClipper);
步骤五: 在后页画图, 前后页互换.
其实到这里才是真正开始写游戏的地方, 以前在 DOS下写游戏, 就是直接从 这个步骤开始的. 以上这些工作, 都是 Microsoft强加给我们的.
写游戏之前我们先来解决前后互换的问题.
// 如果前页的内存被 Windows"征用"了, 这里把它要回来. 这个检察常常会被忘记.
if (pMyDDSFront->IsLost() == DDERR_SURFACELOST)
pMyDDSFront->Restore();
DirectDraw 用来互换的语句有 Blt和 BltFast. BltFast据称比 Blt快10%.
result = pMyDDSFront->Blt(&rcTo, pMyDDSBack, &rcFrom, DDBLT_WAIT,NULL);
result = pMyDDSFront->BltFast( 0, 0, pMyDDSBack, &rcFrom, DDBLTFAST_SRCCOLORKEY);
如果程式工作在"全屏"模式下. 前后页互换容易得多, 只是一句:
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, 把上面用到的子函数的代码打入.
当然你还需要一个 .H file 来放变量名, 对象名和子程式名.
MFC(Microsoft Fried Checken)的 Wizard会帮你生成 ::InitInstance() 和 ::OnIdle(LONG lCount), 把你的 初始化部份, 建页等步骤放在 InitInstance子类里. 把"游戏逻辑"和换页放在 OnIdle里.
最后我想给大家一个完整的可运行的例子, 不过平均每分钟六个汉字的速度打得我头昏眼花. 四肢发 麻. 过两天再说.
相关推荐
NAT反向代理技术的实现(外网访问内网)
NAT反向代理技术的实现(外网访问内网)(版权所有,引用 请联系作者,注明出处) NAT技术是网络中的重要应用之一。当有一个场景:内网搭建了服务器,需要外网访问时,可以借助NAT映射来实现。如:单位建立了一个Web服务器,我们希望在员工回家之后,依然可以访问到它,那怎么实现呢? 下面的拓扑图,就用来示范这个应用反面场景的实现过程。 一、题目要求: 地址配置如图。使用静态路由: 1、配置右侧交换机2950T,实现单臂路由; 2、配置路由使网络连通; 3、配置NAT访问,实现外网对风网服务器的
LPDIRECTDRAW7编译错误的解决方法
用DirectX 7.0 SDK开发,编译时碰到了以下错误: syntax error : missing ';' before identifier 'lpDD' error C2501: 'LPDIRECTDRAW7' : missing storage-class or type specifiers 打开工具->选项,工程已经包含SDK的Include和Lib文...
【顾邦小讲堂】第二十四期 电源环路测试从入门到精髓:一文掌握环路测试原理与电压注入点选择依据
电源环路测试是评估开关电源、线性电源等闭环系统稳定性的核心手段,直接关系到电源的稳定性、输出精度、动态响应、抗干扰能力甚至可靠性
VC++ 屏幕捕获(DirectDraw)
1、初始化DirectDraw接口 #include <ddraw.h> LPDIRECTDRAW m_lpDDraw; LPDIRECTDRAWSURFACE m_lpDDSPrime; LPDIRECTDRAWSURFACE m_lpDDSBack; DDSURFACEDESC m_DDSdesc; #pragma comment(lib, "ddra...
Redis【实战篇】---- 分布式锁-redission
重入问题:重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码中,他的方法都是使用synchronized修饰的,假如他在一个方法内,调用另一个方法,那么此时如果是不可重入的,不就死锁了吗?所以可重入锁他的主要意义是防止死锁,我们的synchronized和Lock锁都是可重入的。不可重试:是指目前的分布式只能尝试一次,我们认为合理的情况是:当线程在获得锁失败后,他应该能再次尝试获得锁。
CANopen PDO 配置實戰:3步完成0x1800-0x1A00物件字典映射與事件觸發
本文详细解析CANopen PDO配置实战,通过3个关键步骤完成0x1800-0x1A00对象字典映射与事件触发设置。重点介绍COB-ID位域解析、映射参数配置及事件触发优化,帮助工程师实现工业自动化设备间毫秒级实时数据交换,提升系统通信效率。
DirectDraw程序设计指南
DirectDraw程序设计指南作者 Lan Mader译 冬草秋叶(Cocoaleaves) 目录DirectDraw总览1. DirectX API 成员2. 什么是DirectDraw3. 与WinG的关系4. DirectDraw页面 - 如何进入显存5. 从翻页(page f
从药企研发视角:如何用GNN提升分子水溶性预测准确率?PyTorch+ESOL全案例
本文从药企研发的实际需求出发,详细介绍了如何利用图神经网络(GNN)技术,结合PyTorch框架和ESOL数据集,构建并优化分子水溶性预测模型。通过完整的代码案例,深入探讨了分子图数据处理、GNN架构设计、超参数调优以及模型评估与解释等关键环节,旨在帮助研发团队提升预测准确率,从而更高效地筛选和优化候选药物分子。
写DIRECTDRAW中的第一个例子
呵呵,今天早上一起来就听到老婆的手机不行了,唉。我也想换一个,怎么舍不得咯。 不管了,我今天要学DirectDraw了。一定要在一周之内做完。 首先用的第一个例子是directdraw.chm 里面的一个DirectDraw入门程序 选择Link栏,在Object/Library modules中添入“Ddraw.lib”。 请注意:这一步骤是将DirectDraw的
深入了解BPM及BPM业务流程管理系统
BPM 即业务流程管理,是一种以规范化的构造端到端的卓越业务流程为中心,以持续地提高组织业务绩效为目的的系统化方法。它涵盖了业务流程的整个生命周期,包括流程的设计、执行、监控、分析和优化。BPM 作为一种先进的管理方法,对于企业提高运营效率、降低成本、提升客户满意度和增强竞争力具有重要意义。BPM 流程管理系统为企业实现 BPM 提供了强大的工具和支持,而 F2BPM 流程管理平台以其先进的技术架构、丰富的功能模块、简单易用的操作界面和强大的定制能力,成为企业实现业务流程管理的理想选择。
基于JeecgBoot 3.9.0 开源项目的企业管理平台
基于JeecgBoot 3.9.0 开源项目的企业管理平台
DirectDraw编程方法与技巧
1 概 述 DirectX是Microsoft为软件开发人员提供的一套精心设计的接口,用于开发高性能、实时的应用程序。它以COM(component object modal)为基本结构[1],位于硬件和软件之间,像gdi(graphics device interface)一样提供了硬件无关的API(application programming interface)接口;它和GDI有一重
机器学习扩散模型简介
扩散模型是生成模型,在过去几年中越来越受欢迎,这是有充分理由的。仅在 2020 年代发布的几篇开创性论文就向世界展示了 Diffusion 模型的能力,例如在图像合成方面击败 GAN[6]。最近,从业者将看到DALL-E 2(OpenAI 上个月发布的图像生成模型)中使用的扩散模型。
真是受不了blog.youkuaiyun.com的写客们
我只订了Delphi专题的rss,却看到众多的与此无关的文章: Dell 电话技术支持工程师答用户问(暴笑) 程序员——[小鸟语录] 两个小时学会DirectDraw编程 (转载) 从系统中取得指定资源图像(转载) 剖析VC中的文件操作程序员的求爱技巧追求不同血型女孩的对策一位老工程师的终告 (推荐)什么是句柄 DAO and MFC ODBC基本概念
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
TMS_WebGMaps_1.9.8.0_Full_Source
TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder
directx 2009.09 多语系版 官方正式版 下载 非凡软件站 软件下载
微软公司最新的多媒体技术,很多运行于windows 环境的新游戏需要directx。directx包含了对direct3d、directdraw、directplay、directsound、directinput等显示、声音以及系统的重要升级。新的directx 8使你获得更好的图像显示质量,使多人游戏具可伸缩性,以及包括更棒的音频效果。它强化了针对directdraw和direct3d的接口,...
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
GDI+ 中Image::FromStream ,用流的方式显示图像
网上到处都是说的用CMemFile用法,我用了一个小时调试,结果CMemFile获取的文件都是空长度,不知道为什么,我改为CFile方式直接调试通过 CFile cbfBmp; cbfBmp.Open( _T("xx.xxx"), CFile::modeRead); int iBmpSize = cbfBmp.GetLength(); HGLOBAL hMemBmp = GlobalAlloc...
STM32F407中文手册
STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。
DirectDraw 游戏编程基础(2)
例程1(DDEX1):DirectDraw 的基本知识 在使用 DirextDraw时,需要首先创建一个对象DirectDraw 的实体,该对象实体代表了微机显示适配器。然后,使用接口所提供的方法来操作该对象实体,使之完成有关命令和任务。接着,你还需要创建一个或多个 DirectDraw-surface对象的实体,以便能在图形表面(Surface)上展示你的游戏画面。 下面,在例程 DDEX1
游戏开发新手入门之DirectX入门
游戏开发新手入门之DirectX入门[文章导读] 今天我们要接触到令人敬畏的DirectX。它比Windows GDI要快好几倍,可用于不同的语言和多种平台[正文] ☆ 简介 今天我们要接触到令人敬畏的DirectX。它比Windows GDI要快好几倍,可用于不同的语言和多种平台,支持从绘制象素到高级3D图象,从播放简单声音到数字音乐,从键盘控制到反震手柄……它给你游戏编程所需的一
DirectDraw 编程指南
译者注:由于最近在学习DirectDraw的东西, 学了快两个星期了吧, 还是收获不少。今天周未闲来无事,实在无聊,总不能老想女朋友吧,呵呵,还是翻译点文章来打发时间。下面所有的DD表示DirectDraw。由于本人英语水平有限,可能翻译得不够人意,望体谅。亲爱的读者们,如果你发现有任何错误,请邮件指正:topgifts@163.com 原文地址:http://www.gamedev.
《Windows游戏编程大师技巧》中关于DirectDraw和创建DirectDraw知识笔记
《Windows游戏编程大师技巧》中关于DirectDraw和创建DirectDraw知识
8488



被折叠的 条评论
为什么被折叠?



