怎樣創怎样创建3d设备D

围棋虚拟会馆
博客等级:
博客积分:
博客访问:
关注人气:
相关博文
推荐博文
谁看过这篇博文
加载中…
字体大小:
如何创建Direct3D对象和设备的例子
(2008-04-15 15:22:09)
标签: 如何创建Direct3D对象和设备的例子
来源:ChinaITLab
收集整理 作者: 时间:2005-4-5
  //*********************************************
  //功能:创建Direct3D对象和设备例子
  //*********************************************
  //防止链接出错
  #pragma comment(lib,"d3d9.lib")
  #pragma comment(lib,"d3dx9.lib")
  #pragma comment(lib,"di ut8.lib")
  #pragma comment(lib,"dxguid.lib")
  #include//windows程序你不包含着是不可能的
  #include//即然是DX9程序那肯定是需要包含着个头文件的
  //接下来定义一个Windows类的宏名称
  #define MY_WINCLASS_NAME "Direct3d"
  //养成好习惯先声明一下
  HRESULT InitMy3D(HWND hWnd);
  void Cleanup();
  LRESULT WINAPI MsgProc(HWND hWnd,UINT msg ,WPARAM wParam,LPARAM
lParam);
  int APIE***Y WinMain(HINSTANCE hI tance, HINSTANCE
hPrecI tance, LPSTR lpCmdLine, int nCmdShow) ;
  //记着程序是Direct3d编程时,我们必须先创建Direct3D对象,在程序结束的时候,也必须最后释放该对象。
  //为了保存创建的Direct3D对象和设备,那我们就需要以下的两个全局变量
  //在这碰到点问题编译的时候到这不能正常编译,再把下面这两个在手工的重写一边,别偷懒,一个字一个字的敲。
  //LPDIRECT3D9    pD3D =
NULL;   //定义Direct3D对象的指针,初始化为空
  //LPDIRECT3DDEVICE9 pDev =
NULL; //定义Direct3D设备的指针,初始之为空
  LPDIRECT3D9   pD3D = NULL;
  LPDIRECT3DDEVICE9 pDev = NULL;
  //到这就要开始写方法了既然是DX9程序那就要初始化D3D的环境
  //---------------------------------------------------------
  //方法名:InitD3D()
  //功 能:初始化D3D环境,函数创建了Direct3D对象和Direct3D设备。
  //注 意:函数返回E_FAIL表示失败,返回E_OK表示成功
  //    说到这了就需要提到一些额外的知识
  //
 在Direct3D中,提供了两个宏专门用于测试函数是否调用成功。
  //    1.
FAILED()----对该函数返回的错误进行测试,如果函数返回任何错误信息,该测试之为真。
  //    2.SUCCEEDED()--对函数执行是否成功进行测试,如函数执行成功,值为真.
  //---------------------------------------------------------
  HRESULT InitMy3D(HWND hWnd)
  {
  //创建Direct3D对象,这是使用Direct3D的第一步操作
  if(NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION )))
  return E_FAIL;
  //获取当前Windows桌面的显示模式,保存到定义的d3ddm结构中
  D3DDISPLAYMODE d3ddm;
  //到这用到了上面“注意”中提到的宏。
  //看好了当写到pD3D-时输入了">"这个符号而没有出现下拉列表那就是前面你写错了,赶快去查错。
  if( FAILED( pD3D-GetAdapterDi layMode(
D3DADAPTER_DEFAULT,&am d3ddm)))
  return E_FAIL;
  //定义Presend结构
  D3DPRESENT_PARAMETERS d3d   
  //把结构清零,创建设备时,结构成员值为0表示使用缺省值
  ZeroMemory(&am d3d ,sizeof(d3d ));
  //制定创建的Direct3D是支持窗口的设备
  d3d .Windowed = TRUE;
  //指定交换效果为D3DSWAPEFFECT_DISCARD,即把后台表面显示到前台表面以后
  //原来的后台表面包含的信息自动丢失
  d3d .SwapEffect = D3DSWAPEFFECT_DISCARD;
  //后台缓冲区的点格式与当前显示模式的点格式一致
  d3d .BackBufferFormat = d3ddm.Format;
  //D3D对象都创建了那就该创建Direct3D设备了
  //1。使用主显卡创建设备,参数D3DADAPTER_DEFAULT.(如果你的计算机里插了两块显卡那你就的指定清楚,看来微软早遇见了PCI_E的出现)
  //2。设备类型为硬件抽象设备,使用硬件加速能,参数D3DDEVTYPE_HAL
  //3。使用前面创建的窗口用于目标表面的显示,参数hWnd
  //4。指定设备对于顶点的处理能力为软件处理顶点,这是为了让所有的显卡制持,参数
  // D3DCREATE_SOFTWARE_VERTEXPROCESSING
  if(FAILED(pD3D-CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&am d3d ,&am Dev)))
  {
  return E_FAIL;
  }
  return S_OK;
  //把上面的看明白了最后的三行你就知道是干吗的了
  }
  //-----------------------------------------------------------------------------------------------
  //方法名:Cleanup()
  //功 能:释放创建过的Direct3D对象和设备
  //注 意:C++可不是J***A有垃圾回收机制,你得把你申请的资源在用完后还给电脑
  //-----------------------------------------------------------------------------------------------
  void Cleanup()
  {
  //释放时的顺序为先释放创建的设备后释放对象
  if(pDev !=NULL)
  pDev-Release();
  //Direct3D对象最先创建,但需要最后释放
  if(pD3D != NULL)
  pD3D-Release();
  retur   //如果你不明白为何这样释放,去把你的C++在复习一下
  }
  //-------------------------------------------------------------------------------------------------------------------
  //方法名:MsgProc()
  //功 能:Windows的详细处理函数
  //注 意:消息是游戏程序的另一个重点,它用于处理键盘,鼠标,遥杆的响应以及触发的事件
  //    如:主角挥剑砍怪物会发生剑和怪物的碰撞,就需要把这一消息处理是打怪物没打上还是打上,打伤了如何计算伤害等等。
  //-------------------------------------------------------------------------------------------------------------------
  LRESULT WINAPI MsgProc(HWND hWnd,UINT msg ,WPARAM wParam,LPARAM
lParam)
  {
  switch(msg)
  {
  case WM_DESTROY:
  PostQuitMe age(0);
  return 0;
  case WM_PAINT:
  //清除渲染目标表面,使用的颜色是RGB(255,255,255),即白色
  pDev-Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(255, 255,
255),1.0f,0);
  //把渲染的目标表面显示到窗口的客户区域
  pDev-Present(NULL,NULL,NULL,NULL);
  ValidateRect(hWnd,NULL);
  return 0;
  }
  return DefWindowProc(hWnd,msg,wParam,lParam);
  }
  //--------------------------------------------------------------------------------------------------------------------
  //方法名:WinMain()
  //功 能:Windows主函数,程序启动时,从这里开始
  //注 意:你要是不写他,你就完了
  //--------------------------------------------------------------------------------------------------------------------
  int APIE***Y WinMain(HINSTANCE
hI tance,  //hI tance:表示该应用程序的句柄
   HINSTANCE
hPrecI tance,//hPrevI tance:为了保持与16位windows应用程序的兼容性
   LPSTR
lpCmdLine,    //lpCmdLine:指向命令行参数字符串的指针
   int nCmdShow)     
//nCmdShow:指定应用程序窗口显示方式的整数
  {
  //定义一个类,指定消息的处理函数为MsgProc
  WNDCLASSEX wc =
{sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0l,0l,
   GetModuleHandle(NULL),NULL,NULL,NULL,NULL,
   MY_WINCLASS_NAME,NULL};
  //注册这个窗口类
  RegisterCla Ex(&am wc);
  //创建应用程序窗口
  HWND hWnd =
CreateWindow(MY_WINCLASS_NAME,"3D游戏编程--创建Direct3D对象和设备",
  WS_OVERLAPPEDWINDOW,100,100,400,300,
  GetDesktopWindow(),NULL,wc.hI tance,NULL);
  //调用InitMy3D函数对3D对象和设备初始化,传入的参数为窗口的句柄hWnd
  if(SUCCEEDED(InitMy3D( hWnd)))
  {
  //显示窗口
  ShowWindow(hWnd,SW_SHOWDEFAULT);
  UpdateWindow(hWnd);
  //程序主循环,进行窗口消息的分发,消息的处理在MsgProc函数中完成
  MSG msg;
  while(GetMe age(&am msg,NULL,0,0))
  {
  Tra lateMe age(&am msg);
  Di atchMe age(&am msg);
  }
  }
  //调用Cleanup函数清除3D对象和设备
  Cleanup();
  //注销窗口类
  UnregisterCla (MY_WINCLASS_NAME,wc.hI tance);
  return 0;
  }
 责编:admin 
相关文章
推荐文章
· · · · · 分享
已投稿到:
加载中,请稍候......
前一篇:
后一篇:
评论 评论加载中,请稍候...
发评论 登录名:
密码:
记住登录状态
昵 称:
分享到微博 评论并转载此博文
验证码:
匿名评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。
< 前一篇
后一篇 gt;  
 ***:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正
Copyright © 1996 - 2011 SINA Corporation,
All Rights Reserved
新浪公司#1楼 得分:0
回复于:2004-10-11 15:31:31
Enable3dControls(); ??
等 级:
#2楼 得分:0
回复于:2004-10-13 00:30:05
创建一个新CyEdit类,加入以下函数还是不行?
BOOL CMyListBox::PreCreateWindow (CREATESTRUCT&am cs)
{ if (!CyEdit::PreCreateWindow (cs)) return FALSE; cs.dwExStyle |= WS_EX_CLIENTEDGE; return TRUE;
(lubiao)
等 级:
#3楼 得分:0
回复于:2004-10-13 18:38:44
用 CreateEx 把
xxx.CreateEx (WS_EX_CLIENTEDGE, ... ...) ;
(lubiao)
等 级:
#4楼 得分:0
回复于:2004-10-13 18:40:23
3D 外观属于 扩展 风格
等 级:
#5楼 得分:0
回复于:2004-10-17 03:52:40
CreateEx不能用于Edit
等 级:
#6楼 得分:0
回复于:2004-10-17 03:56:39
你有办法?请把你的完整代码传上来,还有如何给创建的Edit改变背景和文本颜色?
(lubiao)
等 级:
#7楼 得分:0
回复于:2004-10-17 10:32:54
听谁说的? CreateEx不能用于Edit
m_edit.CreateEx (WS_EX_CLIENTEDGE, _T ( LISTBOX ), NULL,
WS_CHILD | WS_VISIBLE |ES_LEFT , CRect(200,200,400,400), this,ID);
(lubiao)
等 级:
#8楼 得分:0
回复于:2004-10-17 10:36:19
哦 上一帖有错误
m_edit.CreateEx (WS_EX_CLIENTEDGE, _T ( EDIT ), NULL,
WS_CHILD | WS_VISIBLE |ES_LEFT , CRect(200,200,400,400),this,ID);
(lubiao)
等 级:
#9楼 得分:0
回复于:2004-10-17 10:41:56
你应该把代码 放在 OnGreate 里面 不要放在构造函数里面
改变背景可以用 SetCla Long
等 级:
#10楼 得分:0
回复于:2004-10-17 19:47:32
你的最后一个参数“ID”指的是什么?
等 级:
#11楼 得分:0
回复于:2004-10-17 19:58:25
明白,谢谢,这个方法也行,你是怎么改变颜色的,我是从Edit继承新类CyEdit如第二贴加入CtlColor的
HBRUSH CMyEdit::CtlColor(CDC*pDC,UINT nCtlColor)
{ pDC- SetTextColor(RGB(0,255,0));
pDC- SetBkColor(RGB(255,0,0)); return (HBRUSH)m_hRedBrush; }如何创建3D旋转倒影
当前离线
人称草上飞
919 帖子
1107 精华
4 积分
5441 威望
291 点 银子
6895 两 金子
262 两 阅读权限
100 在线时间
743 小时 注册时间
2007-11-8 最后登录
2011-8-2 威望
291 点 银子
6895 两 跳转到
字体大小:
发表于 2010-3-16 18:40
如何创建3D旋转倒影
本帖最后由 eko 于 2010-3-17 09:12 编辑
在这次的HOW-TO栏目中,我将展示如何创造一个简单的3D图形倒影。我们使用渐变遮罩以及FlashPlayer10中的3D方法去实现这个效果。关于渐变遮罩的的讨论可以参看这里How to Create a Gradient Mask in ActionScript 3.(
),而不对于旋转的倒影可以参阅:How to Create a Simple Image Reflection in AS3.(
看看效果
源文件:
代码解析:
我们导入一张160X160的图片到库里面,shuttle160m.jpg,在库中“链接”类:Shuttle
var picWidth:Number=160;
var picHeight:Number=160;
//gap,图像和倒影的距离。
var gap:Number=1;
var goLeft:Boolean=false;
var goRight:Boolean=false;
Shuttle 继承自BitmapData类,可以在运行时被实例化。接下来我们要实例化两个Bitmap,“topImg”和“reflImg”,分别是图片和倒影。
var imgBD:BitmapData=new Shuttle(160,160);
var topImg:Bitmap=new Bitmap(imgBD);
var reflImg:Bitmap=new Bitmap(imgBD);
既然我们要通过y轴旋转图片和倒影,我们就要创建两个容器“topCont”和“reflCont”分别将两个Bitmap放置在容器,并将注册点设置在中心。因为我们希望他们有统一透视投影,所以我们为两个容器再创建一个容器“ Cont”。
var topCont:Sprite=new Sprite();
var reflCont:Sprite=new Sprite();
var Cont:Sprite=new Sprite();
this.addChild( Cont);
topCont.addChild(topImg);
topImg.x=-picWidth/2;
topImg.y=-picHeight/2;
reflCont.addChild(reflImg);
reflImg.x=-picWidth/2;
reflImg.y=-picHeight/2;
//我们垂直翻转倒影图片
reflCont.rotationX=180; Cont.addChild(topCont);
topCont.x=picWidth/2;
topCont.y=picHeight/2;
topCont.z=0; Cont.addChild(reflCont);
reflCont.x=topCont.x;
reflCont.y=topCont.y+picHeight+ga reflCont.z=0;
var :Per ectiveProjection=new Per ectiveProjection(); .fieldOfView=55; .projectionCenter=new Point(picWidth/2,picHeight/2); Cont.tra form.per ectiveProjection= /*
我们将 Cont的投影中心放置在顶端图像(top image)的中心。如果你改变了 Cont的x和y属性,投影中心将不受影响。然而,如果你应用了 Cont的任何3D方法,比如说指定了一个z坐标。投影中心就将移动到舞台的中心。如果你想改变 Cont的z属性,就改变了topCont和reflCont的z坐标。
我们将顶端图像放置在舞台中心上方80像素处。
*/ Cont.x=250-picWidth/2; Cont.y=220-picHeight/2-80;
/*为了创建渐变投影,我们将为“reflimage”创建一个渐变遮罩*/
var maskingShape:Shape=new Shape();
//遮罩本身不可见,但是必须把它添加进显示列表中。
reflCont.addChild(maskingShape);
maskingShape.x=reflImg.x;
maskingShape.y=reflImg.y;
//我们调用一个函数,之后会在脚本中定义
//将在”maskingShape”中画一个渐变
drawInMask();
接下来两行是渐变遮罩的关键:遮罩与被遮罩的显示对象都必须作为位图缓存。否则,整个渐变区域(除完全透明区域)就失去渐变遮罩的效果了。
reflImg.cacheAsBitmap=true;
maskingShape.cacheAsBitmap=true;
//将“maskingShape”作为“reflImg”的遮罩
reflImg.mask=maskingShape;
下面定义的函数在“maskingShape”中画了一个线性渐变,如果你想看到渐变,注释掉上面那行。你会看到一个被旋转了90度的,从红到透明的线性渐变。旋转发生在渐变区域中:
mat.createGradientBox(picWidth,picHeight,90*(Math.PI/180));
90转为弧度单位:90*(MathPI/180)
function drawInMask():void {
var mat:Matrix= new Matrix();
var colors:Array=[0xFF0000,0xFF0000];
var alphas:Array=[0,0.7];
var ratios:Array=[10,255];
mat.createGradientBox(picWidth,picHeight,90*(Math.PI/180));
maskingShape.graphics.lineStyle();
maskingShape.graphics.beginGradientFill(GradientType.LINEAR,colors,alphas,ratios,mat);
maskingShape.graphics.drawRect(0,0,picWidth,picHeight);
maskingShape.graphics.endFill();
给两个按钮注册***。结合ENTER_FRAME,我们将创建旋转。
btnLeft.addEventListener(MouseEvent.ROLL_OVER,leftOn);
function leftOn(e:MouseEvent):void {
goLeft=true;
btnLeft.addEventListener(MouseEvent.ROLL_OUT,leftOff);
function leftOff(e:MouseEvent):void {
goLeft=false;
btnRight.addEventListener(MouseEvent.ROLL_OVER,rightOn);
function rightOn(e:MouseEvent):void {
goRight=true;
btnRight.addEventListener(MouseEvent.ROLL_OUT,rightOff);
function rightOff(e:MouseEvent):void {
goRight=false;
this.addEventListener(Event.ENTER_FRAME,onEnter);
function onEnter(e:Event):void {
if(goLeft){
topCont.rotationY+=4;
reflCont.rotationY+=4;
if(goRight){
topCont.rotationY+=-4;
reflCont.rotationY+=-4;
复制代码
大家可以看这篇教程了3D到2D的解透视投影How to Set Per ective Projection of Di lay Objects - Experiments in Flash CS4.(
如何自定义倒影
这里有两个变量是可以控制的,通过它们你可以轻松的改变倒影的外观:alphas与ratios。
alphas数组中的元素是0-1的数字,尝试着改改看:
将var alphas:Array=[0,0.7];改成var alphas:Array=[0,1];或者var alphas:Array=[0,0.5];
然后观察变化
Ratios数组中的元素是0-255的数字,改改看:
将var ratios:Array=[10,255];改成var ratios:Array=[100,255];或者var ratios:Array=[0,100];
然后观察变化
附件:
您需要
才可以下载或查看附件。没有帐号?
评分人数 威望 + 1 点
金子 + 2 两
赐本贴
两 诏曰:
楼主的最近发帖
Replies
2011-05-22
Replies
2011-05-22
Replies
2009-12-15
Replies
2009-12-15
Replies
2009-12-12
最新新闻与技术资讯
Replies
一天内
Replies
一天内
Replies
一天内
Replies
一天内
Replies
一天内
最新精华帖
Replies
一天内
Replies
一天内
Replies
2011-08-01
Replies
2011-07-28
Replies
2011-07-27
当前离线
43407 帖子
154 精华
0 积分
957 威望
41 点 银子
918 两 金子
76 两 阅读权限
50 在线时间
126 小时 注册时间
2009-7-30 最后登录
2011-5-16 威望
41 点 银子
918 两 发表于 2010-3-16 19:07
very good~ perfect!!
向黑羽师兄学习~~~~干炒Ta~~~
当前离线
26189 帖子
123 精华
0 积分
129 威望
0 点 银子
108 两 金子
0 两 阅读权限
20 在线时间
55 小时 注册时间
2009-2-16 最后登录
2011-7-29 威望
0 点 银子
108 两 发表于 2010-3-16 22:25
推荐订阅
先收下了,有时间在慢慢看
当前离线
45280 帖子
116 精华
0 积分
126 威望
0 点 银子
130 两 金子
0 两 阅读权限
20 在线时间
103 小时 注册时间
2009-8-18 最后登录
2011-7-21 威望
0 点 银子
130 两 发表于 2010-3-17 08:41
收藏了 沒有夢想的人生是失敗的
当前离线
45280 帖子
116 精华
0 积分
126 威望
0 点 银子
130 两 金子
0 两 阅读权限
20 在线时间
103 小时 注册时间
2009-8-18 最后登录
2011-7-21 威望
0 点 银子
130 两 发表于 2010-3-17 08:58
应该是导入160*160的图片 不是16*16
评分人数
认真观察奖 银子 + 4 两
赐本贴
两 诏曰:
认真观察奖
沒有夢想的人生是失敗的
当前离线
30910 帖子
246 精华
0 积分
277 威望
1 点 银子
383 两 金子
0 两 阅读权限
30 来自
河北石家庄 在线时间
209 小时 注册时间
2009-4-8 最后登录
2011-7-28 威望
1 点 银子
383 两 来自
河北石家庄 发表于 2010-3-17 10:05
很不错~!
永远不重复做轮子
当前离线
58690 帖子
65 精华
0 积分
69 威望
0 点 银子
157 两 金子
0 两 阅读权限
20 在线时间
36 小时 注册时间
2010-1-25 最后登录
2011-6-13 威望
0 点 银子
157 两 发表于 2010-3-17 10:14
好东西 收藏了 顺便说一下 楼主文件是用cs4编译的 flash player要用10 或以上版本
评分人数
热心补充奖 银子 + 4 两
赐本贴
两 诏曰:
热心补充奖
一路狂飙只为不让悲伤追上~
(纳兰容若)
当前离线
778 帖子
876 精华
4 积分
2561 威望
110 点 银子
1421 两 金子
88 两 阅读权限
100 在线时间
1051 小时 注册时间
2007-10-31 最后登录
2011-8-2 威望
110 点 银子
1421 两 发表于 2010-3-17 10:21
不错,楼主最近很是努力啊!加油!
红花漫天,天地威武!
当前离线
62927 帖子
231 精华
0 积分
241 威望
0 点 银子
132 两 金子
0 两 阅读权限
30 在线时间
101 小时 注册时间
2010-3-5 最后登录
2011-7-29 威望
0 点 银子
132 两 发表于 2010-3-17 15:41
谢谢楼主,收藏一下,然后我去试试
当前离线
53555 帖子
113 精华
0 积分
118 威望
0 点 银子
2 两 金子
0 两 阅读权限
20 来自
安徽合肥 在线时间
51 小时 注册时间
2009-11-18 最后登录
2011-6-14 威望
0 点 银子
2 两 来自
安徽合肥 发表于 2010-4-9 14:16
fla文件打不开,你什么写的啊。
烽火王城
当前离线
67850 帖子
96 精华
0 积分
99 威望
0 点 银子
56 两 金子
0 两 阅读权限
20 在线时间
30 小时 注册时间
2010-4-1 最后登录
2010-11-22 威望
0 点 银子
56 两 发表于 2010-11-5 19:50
谢谢分享~~~~~ 哈哈 江湖传闻
我们似乎忘记了,Flash的原始状态,就是为我们带来网页上体积更小,更流畅的绚丽效果。在本篇专题中,我们将一起来感受Flash带给我们视觉和操作上优秀的用户体验 ...
) 电子公告服务(BBS)审批 浙BBS2010014
GMT+8, 2011-8-2 23:52,
Proce ed in 0.060656 second(s), 9 queries, Gzip enabled
Powered by
2001-2009

参考资料

 

随机推荐