想写游戏程序,却无法下手,最基本的directx都不知怎么用(100分)

  • 主题发起人 主题发起人 wlm_8888
  • 开始时间 开始时间
W

wlm_8888

Unregistered / Unconfirmed
GUEST, unregistred user!
想写游戏程序,却无法下手,最基本的directx都不知怎么用,如果有哪位高手知道怎么开始,请告诉我应该怎么才能开始,怎么才可以入门,或是教我图形方面的知识也可以,这里先谢谢了。
 
是我问题不请楚?还是都不会?
自己顶一下先
 
期待回答ing
 
opengl , dx3d 都可以, 我倾向于opengl, 下几个例子,文档, 自己写个小程序,就找到自信了。
有个http://www.gameres.com/ 挺不错, 可以去看看, 有游戏源码下载, 还有几个国外的网址,那天给你贴上来。。
 
opengl , dx3d 我都看过,好像都不怎么能看懂,那东西大部分都是用C,C++,ASM描述的,不好看,DELPHI的不知道这方面的书,哪本比较好一点。
 
这是在别的网站上看到的关于游戏初学者的一点经验,转帖上来,望和我一样的初学者共同进步:
游戏编程初学者常见问题解答

这里首先假设你使用VC这种IDE来写游戏,平台为win32,如果用Delphi或者VB等其他语言,情况类似,把编成语言及IDE换成对应的即可。

如果你想编游戏,而又有很多不清楚的问题,那请看这个:
1 语言编程:c/c++
2 编程基础一定要好:数据结构,c/c++语言
2 IDE集中开发环境:visual studio .net 2003
3 游戏开发SDK用DirectX9
4 Win32 api开始的时候不能学的太多
5 可以不用MFC(如果你c++基础好,MFC学起来很简单)
6 编网络游戏,使用winsock,通讯协议用TCP
7 多下载源代码,观看之
8 数学上的要求(其它基础文化课类似):不需要了解算法的来历、推导等,但一定要知道它们是干什么用的以及如何用
9 学习STL,必须C++要过关!否则会很难学。首先要学会如何用STL,再想深入的话,学习STL的内部代码。STL首先从list,vector学起。
 
提问的人太多了,顶顶
 
给C++初学者的50个忠告
  1.把C++当成一门新的语言学习(和C没啥关系!真的。);
  2.看《Thinking In C++》,不要看《C++变成死相》;
  3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看;
  4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境,而我们要学的是一门语言;
  5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点;
  6.会用Visual C++,并不说明你会C++;
  7.学class并不难,template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书;
  8.如果不是天才的话,想学编程就不要想玩游戏——你以为你做到了,其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住:学C++是为了编游戏的;
  9.看Visual C++的书,是学不了C++语言的;
  10.浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!?
  11.浮躁的人容易问:我到底该学什么;——别问,学就对了;
  12.浮躁的人容易问:XX有钱途吗;——建议你去抢银行;
  13.浮躁的人容易说:我要中文版!我英文不行!——不行?学呀!
  14.浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行;
  15.浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人;
  16.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;
  17.C++不仅仅是支持面向对象的程序设计语言;
  18.学习编程最好的方法之一就是阅读源代码;
  19.在任何时刻都不要认为自己手中的书已经足够了;
  20.请阅读《The Standard C++ Bible》(中文版:标准C++宝典),掌握C++标准;
  21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;
  22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;
  23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》;
  24.不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序;
  25.和别人一起讨论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好;
  26.请看《程序设计实践》,并严格的按照其要求去做;
  27.不要因为C和C++中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样;
  28.C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言,你一定不会把C和Z语言联系得那么紧密;
  29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已;
  30.读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++;
  31.学习编程的秘诀是:编程,编程,再编程;
  32.请留意下列书籍:《C++面向对象高效编程(C++ Effective Object-Oriented Software Construction)》《面向对象软件构造(Object-Oriented Software Construction)》《设计模式(Design Patterns)》《The Art of Computer Programming》;
  33.记住:面向对象技术不只是C++专有的;
  34.请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码;
  35.把在书中看到的有意义的例子扩充;
  36.请重视C++中的异常处理技术,并将其切实的运用到自己的程序中;
  37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去;
  38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路;
  39.C++语言和C++的集成开发环境要同时学习和掌握;
  40.既然决定了学C++,就请坚持学下去,因为学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的;
  41.就让C++语言的各种平台和开发环境去激烈的竞争吧,我们要以学习C++语言本身为主;
  42.当你写C++程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的错误并重新设计和编写(参见43);
  43.别心急,设计C++的class确实不容易;自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的;
  44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;
  45.每学到一个C++难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;
  46.记录下在和别人交流时发现的自己忽视或不理解的知识点;
  47.请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX;
  48.保存好你写过的所有的程序——那是你最好的积累之一;
  49.请不要做浮躁的人;
  50.请热爱C++!
 
关于怎么学习API (OpenGL/Direct3D等)
-针对初学者

最近很多人在问,我该如何学习OpenGL?我学完了OpenGL了,该怎么用?
我想在回答这些类似的问题以前先和大家谈谈怎么学习API的方法,或许谈完了,我就不需要回答了。 
首先,我认为API是工具,不是本质,OpenGL/Direct3D的本质是图形学,而不是OpenGL/Direct3D的本身,API的本身只是一些Interface而已.如果你明白图形学的原理.那么你很容易这些接口的作用,以及为什么要有这些接口的存在.所以,我要说的第一点是:你要学习3D编程,不是学会了OpenGL/Direct3D就可以了。甚至会不会这些API都不是那么的重要(虽然这么说,或许很多人不太赞同).最重要的,最根本的是,你要明白这些API背后的图形学的原理---因为那才是根本中的根本.
下面我来介绍我对API学习的看法.
我认为API的学习有两种方法:一是正向学习.二是反向学习.
一:正向学习,所谓的正向学习,就是学习API的本身.我觉得这种方法是一种Brute Force行为.不是很好.我们只要看看API的特性,有那些部分.就可以了。比如学习Direct3D的时候,我们要知道它如何初始化,以及它和操作系统的结合.它在Direct3D8里引入了VS/PS.最后就是创建一个Direct3D应用的步骤和方法.这些就足够了。要不然.Direct3D那么多的函数,每一个都会要了我的命.
正向学习的第二个作用就是你在熟悉了图形学和大概了解了API后,有空就来看看API的细节,然后思索一下API里提供的一些特性对你的程序有什么作用.比如Direct3D里的Two Side Stencil.OpenGL里的TextureCombine等。

二:逆向学习.这是根本的方法,到了这一步,你就可以真正的算是图形学入门了。这要求你要有一定的图形学基础.比如,你现在开始做一个demo.你预计你的demo里有一堆眩眩的效果,当然你也要明白你的这些眩眩的效果要怎么实现的.然后你去找API里对应的功能,我想如果你的想法正常,一般的功能在Direct3D/OpenGL里应该都会有的.当然你也会碰到你想要的功能在这些API里没有,但是这不重要,重要的是你又学到新东西了---这个特性在XX API里不支持^_^.

通常我是采用先正向,再逆向,同时再进行正向学习的方法.希望以上的建议,对各位初学者有一定的帮助.
 
从头学习DirectDraw



 在开始学习DirectDraw编程之前,有一些题外话要说明,以下内容均是个人的心得和体会,如果其中有什么谬误之处,敬请谅解,同时个人不对可能造成的后果负责。。
  以下几点是在编制DirectX应用程序时应该注意的:

尽管使用VB或DELPHI都可以制作DirectX应用程序,但考虑到代码的效率,还是应使用C或C++。其中,C++是面向对象的编程语言,可以使你的程序更易于维护,如果再考虑到代码的兼容性,我推荐使用Microsoft Visual C++ 5.0集成开发环境。当然,使用Borland C++ 5.0也是一个不错的选择。
你应该已经有编制Windows应用程序的经验,以及C++的基础。
熟悉你将要使用的编程工具的运用。例如,如何为集成开发环境设置各种参数,以及编译程序和连接程序的命令行参数。
确认你已下载了微软的DirectX 5.0 SDK中的相关文件,特别是头文件和库文件,这些都是编程所必需的。
确认你已经安装了DirectX 5.0或更高版本的运行时刻库,因为本教程的所有程序均使用了DirectX的新接口(Interface),必须要5.0或更高版本支持。

--------------------------------------------------------------------------------

DirectDraw是什么?

  DirectDraw是DirectX中的关于视频输入输出的基本部分,使用DirectDraw可以方便地编制出高效的视频处理程序,只要用户的硬件支持DirectDraw,就能保证你的代码可以处理它们。
  简单地说,一个DOS程序员可以方便地直接访问视频显存,从而高效地处理视频动画,而在Windows的32位环境中,使用DirectDraw可以做类似的工作(而且做得更好)。例如,在DOS环境中的320x200x256色图形模式中,你可以通过在地址A000:0000开始处的一片内存区进行直接读写的方式来处理视频操作,而在Windows环境中,DirectDraw也提供一片内存区供你直接读写,使你能更好地完成相似的操作。
  当然,DirectDraw提供的远不止这些,但一个游戏程序员可能更关心如何直接访问视频显存,以及如何高效地完成位块拷贝操作等等。


--------------------------------------------------------------------------------

让我们从消息循环开始

  DirectX最初是为游戏开发而推出的,编制游戏的程序员都很贪婪,他们会尽量榨取系统资源,并试图让自己的程序永远具有最高的效率。但Windows是一个多任务的操作系统,当它发现所有的程序都处于空闲时,便会减少给这些程序的资源,其中之一就是开始清理交换文件,为了让自己的程序给Windows以始终繁忙的假象,不妨用一些新的代码来代替常规的方法。

这是常规的消息循环处理

while(GetMessage(&msg,NULL,NULL,NULL)){

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;



//---------------



这是改进的消息循环处理

for(;;){

if(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE)){

if(msg.message==WM_QUIT) break;

TranslateMessage(&msg);

DispatchMessage(&msg)

}else
{

if(AppPaused) WaitMessage();

else
{

// 这里进行任何不基于消息循环的处理

// 例如动画制作

}

}

}

return msg.wParam;


  上例中,新的消息循环处理方式使得Windows认为程序始终繁忙,从而提高了程序的性能。注意,其中的AppPaused变量为真时表示程序未在前台运行,该变量的取值为WM_ACTIVATEAPP消息的wParam参数。


--------------------------------------------------------------------------------

第一个DirectDraw程序

  现在咱们开始编制第一个DirectDraw的应用程序,来示例如何建立一个全屏幕独占方式的应用程序,并利用HDC来实现简单的文本输出。
  这个示例与微软的示例程序不同,它使用了DirectX 5.0中的新接口,在制作最终可执行程序时应确保为LINK程序指定ddraw.lib和dxguid.lib这两个文件。
  示例程序的可执行程序由VC 5.0生成,只在基于Intel奔腾芯片、Windows95环境的机器上才能运行。

  下面重点介绍一下建立和销毁DirectDraw基本对象的方法,以及如何请求新接口。
首先来说明一下以后要用到的术语:

DirectDraw基本对象。
这个对象的实体由DirectX建立,程序只能通过指向该对象实体的指针来访问它,这一点与Delphi十分相似,在Delphi中,一个TLabel类型的变量实际只是一个指针,它指向一个TLabel类的对象。建立DirectDraw基本对象的函数是DirectDrawCreate(),该函数可在内部建立一个DirectDraw对象实体,并将指向该实体的指针返回给应用程序,以后的所有操作都基于这个指针。
主平面。
可以将主平面简单地理解为“视频显存区”,任何直接对主平面的访问都立刻反映到屏幕上。主平面也是一个对象(程序员只能使用指向该对象的指针),该对象封装了几乎所有的输入输出操作,包括直接访问、利用设备相关(DC)访问以及位块拷贝(Blt)操作等等。主平面可以附带一个或多个“后台缓冲区”。
后台缓冲区。
后台缓冲区同样也是一个对象,也同样只提供一个指向该对象的指针供程序员使用。后台缓冲区与主平面的操作方式几乎一样,不同的是所有对后台缓冲区的操作不直接反映在屏幕上,例如,你可以在后台缓冲区中放置好图片,然后通过位块拷贝操作(或“弹出”操作)将后台缓冲区中的内容快速映射到主平面(即屏幕),这种操作方式可以避免出现不愉快的闪烁现象。
位块拷贝。
位块拷贝是将一块矩形区域从一个平面拷贝到另一个平面,可以进行缩放、旋转、镜像、透明等附加动作。DirectDraw提供的位块拷贝方法效率十分高,程序员勿需自行编制代码来完成相似工作。
“弹出”操作。
Flip这个单词有反转、弹出等含义,在DirectDraw中,可以将其理解为迅速互换两个平面,这种互换操作并不是内容的互换,而只是指针的互换,因此其速度比位块拷贝快得多。例如,在全屏幕独占方式下,可以利用“弹出”操作快速地将后台缓冲区与主平面互换(指针的互换),从而获得高速的视频动画效果。只有具有可“弹出”属性的平面才能使用“弹出”操作。
释放。
在DirectX中,各个对象均有Release方法,这个方法(成员函数)并不见得就是销毁对象,它只是对内部计数器进行递减操作。例如,用DirectDrawCreate()函数建立了DirectDraw基本对象后,该对象的内部计数器就置为值1,如果此时再调用该对象的Release方法,就会使内部计数器减去1,若结果为零则该对象被销毁,但若在调用Release方法之前又为该对象请求新的接口(如IDirectDraw2),则内部计数器又会加一,需要两次Release方法才能完全销毁该对象。
  在示例程序一中,从WinMain函数开始,在登记了窗口类并建立了程序主窗口后,就开始建立DirectDraw的基本对象了:

ddrval = DirectDrawCreate(NULL, &_lpDD, NULL);

if (ddrval!=DD_OK){

// 失败

}


  函数DirectDrawCreate在成功时返回DD_OK(零),若是失败则返回一个32位(HRESULT)的错误代码。不止是这个函数,所有DirectX对象的成员函数(方法)均采用这种方式来返回表示成功或失败的值。
  不必去管该函数的第一个和第三个参数,现在只需要把它们设为空值即可,而第二个参数是一个指针,这个指针指向了一个LPDIRECTDRAW类型的变量,而该变量实际上也是一个指针,如果函数成功则指向IDirectDraw对象实体--------是不是有一点绕来绕去的?
  当基本对象成功建立后,就需要将它“变”成较新的对象以增进性能,这也正是本示例程序为什么需要5.0版本的DirectX来支持的缘故。

ddrval=_lpDD->QueryInterface(IID_IDirectDraw2, (void **)&lpDD);

_lpDD->Release();

if (ddrval!=DD_OK){

// 失败

}


  下一步是利用新建立的基本对象来建立与该基本对象相关联的主平面,这个主平面实际上就是可视的屏幕,所有对主平面的访问都直接反映在屏幕。在建立主平面之前我们首先将基本对象的属性设为全屏幕独占方式,这样才能改变显示模式,以及建立可“弹出”的平面集。具体的设置方法参见源程序。
  在设置了全屏幕独占方式并设置了适当的显示模式之后,程序建立了一个主平面,这个主平面附带一个后台缓冲区,程序员可以使用“设备相关把柄(HDC)”或直接访问的方式(以后再讲)来对后台缓冲区进行图形操作,所有对后台缓冲区的操作并不能反映在屏幕上,在图形操作完成后,可以利用“弹出”操作来将后台缓冲区“弹”至主平面,从而在屏幕上显示出来。
  本示例程序在进行图形操作示例时,首先获取后台缓冲区的HDC,然后用标准的GDI函数来绘制文本,一旦绘制完毕,就立刻释放刚获取的HDC,因为任何一个平面的HDC被获取后,该平面就被隐式地锁定,无法进行位块拷贝或弹出操作,只有当该HDC被释放后,一个隐式的Unlock才被调用,程序才能对该平面进行前述操作。
  完成后台缓冲区的图形绘制后,程序调用主平面的成员函数(方法)Flip来将后台缓冲区弹至主平面,你将看到屏幕内容已被改变。

  这是我个人搞的一个小封装,可用于非C++的编程语言(如Delphi)。使用此封装库可比较容易地编制DirectDraw应用程序。此封装为静态链接库,提供Visual C++和BorlandC++两种版本,其中包括:
Visual C++版库文件
Borland C++版库文件
相关的头文件
两个示例源程序
说明文档(HLP文档格式)
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
684
import
I
后退
顶部