用DirectX7.0开发3D效果

原创 2007年10月04日 09:32:00

DirectX 7.0终於支援VB了,让我们这些VB的爱好者也能享受到DirectX带来的便利,现在我在这里提出使用DirectDraw的心得。使用DirectDraw时可以不用安装DirectX7.0的SDK,只要确定有装DirectX7.0就可以了。

现在我们实际来使用DirectDraw:
在“工程(Project)”里点选“设定引用项目”,来引用DirectX物件。
接著将“DirectX 7 for Visual Basic Type Library”的那一行打勾,就可以开始使用DirectX了。

我们首先得建立DirectDraw物件,先宣告一个Direct物件和一个DirectDraw物件:
Dim objDX As New DirectX7
Dim objDD As DirectDraw7

接下来是使用DirectDrawCreate函式来建立DirectDraw物件:
Set objDD = objDX.DirectDrawCreate("")

然后必须设定是视窗模式还是全屏幕模式:
Call objDD.SetCooperativeLevel(Me.hWnd, DDSCL_FULLSCREEN Or DDSCL_ALLOWMODEX Or DDSCL_EXCLUSIVE)
第一个参数是设定DirectDraw的视窗是那一个,填入视窗的Handle代码而后面的参数是设定具备的能力,可以不止一个,使用Or组合起来。
DDSCL_FULLSCREEN 使用全屏幕(必须和DDSCL_EXCLUSIVE一起用)
DDSCL_ALLOWMODEX 使用Modex模式
DDSCL_EXCLUSIVE 使用独占模式
DDSCL_NORMAL 使用Windows的程式视窗
DDSCL_NOWINDOWCHANGES 禁止改变视窗大小

今天就先讲到这边,Direct实在很麻烦,一次不要太多比较好,下次就从建立Surface开始。  

设定完视窗模式或全屏幕模式后,如果你是设定成全屏幕模式的话(也就是独占模式),接著就必须设定显示模式。
objDD.SetDisplayMode 640, 480, 16, 0, DDSDM_DEFAULT
参数中的640,480指的是640x480的模式,而16指的是16万色,如果是8的话则是256色,想改变显示模式的话只要改变这三个变数就可以了,一般常用的模式有:
320x200 16万
320x240 256
640x480 256
640x480 16万

Surface简介:
Surface就是DirectDraw用的显示记忆体,图像就是要画在Surface上面,一般来说有分成几种类型。
primary surface 屏幕上可以看到的显示记忆体,图像画在上面就能显示在屏幕上。
backbuffer surface 这是一个能跟primary surface作快速切换的Surface。
offscreen surface 这是一个屏幕上看不见的Surface,可以用来存放图像。

我们现在就先来介绍建立primary surface的方法,首先得宣告一个Surface物件和一个DDSURFACEDESC结构。
Dim objDDPrimSurf As DirectDrawSurface7
Dim ddsd1 As DDSURFACEDESC2

'DDSURFACEDESC主要是记录一个Surface的结构,像是Surface的高度、宽度之类的,建立一个primary surface通常只要填入ddsCaps就可以了。
ddsd1.lFlags = DDSD_CAPS '设定DDSURFACEDESC结构中的ddsCaps有效。
ddsd1.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE '设定要建立的是primary suface。
Set objDDPrimSurf = objDD.CreateSurface(ddsd1) '呼叫CreateSurface后即建立完成。

'offscreen surface的建立法则是要设定DDSURFACEDESC结构中的ddsCaps、dwHeight、dwWidth。
Dim objDDOffSurf As DirectDrawSurface7
Dim ddsd1 As DDSURFACEDESC2

ddsd1.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH
'设定ddsCaps、lHeight、lWidth有效
ddsd1.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN '设定要建立offscreen surface
ddsd1.lWidth = 640 '设定Surface的宽度
ddsd1.lHeight = 480 '设定Surface的长度
Set objDDOffSurf = objDD.CreateSurfaceFromFile("img1.bmp", ddsd1)
'offscreen surface建立完成并把img.bmp图档读取到offscreen surface里面。

一般来说不会直接在primary surface上直接画图,我通常都是先在backbuffer surface上画,再利用切换的功能将Primary surface和backbuffer surface交换,所以在这里介绍backbuffer surface的建立方法,由於要跟primary surface一起建立,所以Primary surface的建立方法也就有点不同。
Dim objDDPrimSurf As DirectDrawSurface7
Dim objDDBackSurf As DirectDrawSurface7
Dim ddsd1 As DDSURFACEDESC2

ddsd1.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
'设定ddsCaps和lBackBufferCount有效
ddsd1.lBackBufferCount = 1 '设定Backbuffer surface的数量
ddsd1.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX
'设定要建立一个由primary surface和backbuffer surface 所构成的Surface
Set objDDPrimSurf = objDD.CreateSurface(ddsd1) 'primary surface建立完成

Dim caps As DDSCAPS2 宣告一个DDSCAPS结构
caps.lCaps = DDSCAPS_BACKBUFFER 设定要建立backbuffer surface
Set objDDBackSurf = objDDPrimSurf.GetAttachedSurface(caps) backbuffer suface 建立完成

Surface的部分讲完了,下一篇要说的是如何使用Blt和BltFast来作Surface间的图形的复制和搬移,就可以开始在Surface上画画罗。

上一次我们一共建立了三个Surface,分别是objDDPrimSurf(Primary surface)、objDDBackSurf(BackBuffer surface)、objDDOffSurf(Offscreen surface)。
现在我打算把objDDOffSurf拿来存放图片,再用BltFast()把图片给复制到objDDBackSurf上,然后用objDDPrimSurf的Flip来跟objDDBackSurf作交换的动作,因为objDDPrimSurf代表的就是显示记忆体,所以交换后图片就显示在屏幕上啦!

现在我先介绍BltFast()的用法:
BltFast(dx As Long,dy As Long,dds As DirectDrawSurface7,srcRect As RECT,trans As CONST_DDBLTFASTFLAGS) As Long

dx、dy
图形复制到目标Surface上的位置(座标)
dds
图片来源的Surface
srcRect
复制图形的范围
trans
复制图片的方式
DDBLTFAST_DESTCOLORKEY '使用目标Surface上的透明色
DDBLTFAST_NOCOLORKEY '直接复制图形
DDBLTFAST_SRCCOLORKEY '使用来源Surface上的透明色
DDBLTFAST_WAIT '若暂时无法执行的话就等到可以执行时

例:想把objDDOffSurf上640x480的图形复制到objDDBackSurf
Dim r1 As RECT

r1.left=0
r1.top=0
r1.right=640
r1.bottom=480

objDDBackSurf 0, 0, objDDOffSurf, r1, DDBLTFAST_WAIT

这样就把图形给复制到了objDDBackSurf上了,不过这样也只是在objDDBackSurf上而已,并不是在屏幕上,所以必须跟objDDPrimSurf作Flip才行,怎堋作呢?只要执行下面这一行就可以了:

objDDPrim.Flip Nothing, DDFLIP_WAIT

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android——ViewPager实现3D画廊效果(ViewPager的加载动画)

这里写链接内容这个例子相信很多人已经接触过了,我今天觉得好玩自己写了写,参照了网上大家的一些例子,现在总结下自己的感受吧。 ViewPager的用法 android:clipChildren=”fal...
  • u012230055
  • u012230055
  • 2016年11月03日 17:55
  • 688

IOS开发之 一起用Swift来玩一玩3D Touch

Swift 2.3 IOS 8.0 XCode 8.0 添加入口标签在这里只说下静态的好了,暂时还用不到动态的,e.g.UIApplicationShortcutItems ...
  • sbt0198
  • sbt0198
  • 2017年02月07日 14:45
  • 951

android 重叠gallery 3D效果实现

在看了iOS上面的CoverFlow后,感觉效果真的不错,就想在android上面实现一个,这个程序在网上参考了一此核心的代码,当然我添加了一些其他的东西,废话不多说,先看效果,不然就是无图无真相。 ...
  • u011467537
  • u011467537
  • 2016年09月19日 14:42
  • 1450

纯CSS实现图像3D悬停效果

今天来看一个纯CSS实现的图像3D效果,用div.img装载图像的上半段,.img:fefore伪类来实现图像的下半段、呈现图像标题,用.img:after伪类实现图像的阴影。...
  • whqet
  • whqet
  • 2014年02月16日 18:31
  • 4837

Android UI系列之3D星体旋转效果

转载自:http://blog.csdn.net/johnwcheung/article/details/52496652 在Android中,如果想要实现3D动画效果一般有两种选择:一是使用O...
  • qq_35559358
  • qq_35559358
  • 2017年07月13日 11:59
  • 361

css3绘制3d翻页效果

核心内容: 1.css3的transition属性来制作简单的动画 transition属性可以为指定的css属性添加动画效果,这个动画用到的是transform属性 transition:...
  • Yalishizhude
  • Yalishizhude
  • 2015年02月22日 23:21
  • 2047

iOS开发之实现图片自动切换(类似android画廊效果)

#import "ViewController.h" #define ImageViewCount 5 @interface ViewController () @property (weak, ...
  • violetIC
  • violetIC
  • 2015年02月03日 16:33
  • 1418

Android开发之实现最简单最酷炫的3D图片浏览效果(一)

本文转载自:http://blog.csdn.net/l1028386804/article/details/48052709 请看文章!
  • itluochen
  • itluochen
  • 2016年08月16日 23:05
  • 3339

ios开发之3D效果(一)

1.CATransform是加载在view的layer上的。 实现普通的放大,缩小,旋转等可用: imageView.layer.transform = CATransform3D...
  • u011238639
  • u011238639
  • 2015年08月25日 15:59
  • 315

HTML5和CSS3实现3D转换效果 CSS3的3D效果

上次,我们一起研究了css3的2d模块,这次我们一起来看一下css3的3d模块。   首先,我们来了解一下3d的坐标系,x轴在屏幕上为水平方向,y轴为垂直方向,而z轴为垂直于屏幕的方向。 ...
  • e62ces0iem
  • e62ces0iem
  • 2017年06月15日 13:39
  • 336
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用DirectX7.0开发3D效果
举报原因:
原因补充:

(最多只允许输入30个字)