游戏制作详解自----OpenGL入门教程(四)(转)

游戏制作详解自----OpenGL入门教程(四)(转)[@more@]

  OpenGL是一种基于客户/服务器和管道(PipeLine)的图形库。即一个应用程序(客户)将各种命令和数据写入管道,这命令和数据将被暂时保存起来,图形库(服务器)直到收到一条专门的指令才会开始处理它们,并将处理结果通过管道传给用户。

  所以OpenGL应用程序的基本结构就是:

  

  建立管道

  根据需要向管道中写入数据和指令

  关闭管道

  在Windows95/NT环境中,这个管道就是OpenGL着色环境――(OpenGL Render Context)简称RC。因此建立管道实际上就是获取一个可用的RC。

  

  而在Windows的GDI系统中进行图形显示是通过图形设备上下文――(Device Context)简称DC――进行的。所以获取RC就是:

  ①先获取一个DC,

  ②调整这个DC的象素格式(PixelFormat)以便OpenGL库进行绘制,

  ③用DC去调用wglCreateContext(hDC)建立一个RC,

  ④调用wglMakeCurrent(hRC,hDC)将刚才建立的RC指定为当前的RC。

  

  当一个RC不再使用时就可以删除它,方法是:

  

  使RC不是“当前RC”:

  wglMakeCurrent(NULL,NULL); //不再有当前RC

  wglMakeCurrent(hAnotherRC,hDC); //另一个RC成为当前RC

  wglDEleteContent(hRC); //删除之

  

  为了避免反复建设/删除RC所带来的不必要的开支,我们在TForm1中定义了hDC、hRC以保存DC和RC,并在TForm1的构造函数中建立并保存RC,直到清除这个Form即Destory()成员函数运行时才删除RC和DC。

  

  主要代码如下:

  

  void __fastcall TForm1::CreateParams(TCreateParams& Params)

  {

  //再次说明:只在MDI应用有必要进行修改。2000.2.17.

  TForm::CreateParams(Params); //调用原有函数预处理

  Params.Style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;//加上必要的属性

  }

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

  

  __fastcall TForm1::TForm1(TComponent* Owner)

  : TForm(Owner)

  {

  hDC=GetDC(Handle); //获取一个DC,TForm1.Handle中保存有Form的窗口句柄

  SetDCPixelFormat(hDC); //调整该DC的象素格式

  hRC=wglCreateContext(hDC); //用这种DC去创建一个RC

  wglMakeCurrent(hDC,hRC); //指定当前DC、当前RC为hDC、hRC

  }

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

  

  void __fastcall TForm1::SetDCPixelFormat(HDC hDC)

  {

  //本函数用于调整DC的象素格式,如缓冲区、颜色数等

  //先不深究,只要知道它的作用就行

  int nPixelFormat;

  static PIXELFORMATDESCRIPTOR pfd = {

  sizeof(PIXELFORMATDESCRIPTOR),    // Size of this structure

  1,                  // Version of this structure

  PFD_DRAW_TO_WINDOW |         // Draw to Window (not to bitmap)

  PFD_SUPPORT_OPENGL |         // Support OpenGL calls in window

  PFD_DOUBLEBUFFER           // Double buffered mode

  PFD_TYPE_RGBA,            // RGBA Color mode

  24,                  // Want 24bit color

  0,0,0,0,0,0,             // Not used to select mode

  0,0,                 // Not used to select mode

  0,0,0,0,0,              // Not used to select mode

  32,                  // Size of depth buffer

  0,                  // Not used to select mode

  0,                  // Not used to select mode

  PFD_MAIN_PLANE,            // Draw in main plane

  0,                  // Not used to select mode

  0,0,0 };               // Not used to select mode

  // Choose a pixel format that best matches that described in pfd

  nPixelFormat = ChoosePixelFormat(hDC, &pfd);

  // Set the pixel format for the device context

  SetPixelFormat(hDC, nPixelFormat, &pfd);

  }

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

  

  void __fastcall TForm1::FormPaint(TObject *Sender)

  {

  //该Form的绘制响应函数

  glClearColor(0.5,0.7,0.9,1.0); //指定背景颜色(依次为RGBA)

  glClear(GL_COLOR_BUFFER_BIT); //用背景色清窗口

  RenderScence();         //场景绘制

  SwapBuffers(hDC);

  //切交缓冲区,这就是可以启动图形库处理流程并得相应结果的两条命令之一

  //如果当前RC相联DC具有DoubleBuffer的PixelFormat则用本命令

  //否则就是单缓冲DC,用glFlush(void)进行更新。

  }

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

  

  void __fastcall TForm1::FormDestroy(TObject *Sender)

  {

  wglMakeCurrent(NULL,NULL); //取消当前RC和当前DC

  wglDeleteContext(hRC);   //删除该RC

  DeleteObject(hDC);     //删除Windows DC。

  }

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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8225414/viewspace-951747/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8225414/viewspace-951747/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作者对游戏的说明: 首先,您应当以一种批判的眼光来看待本程序。这个游戏是我制作 的第一部RPG游戏,无任何经验可谈,完全按照自己对游戏的理解进 行设计的。当我参照了《圣剑英雄2》的源码之后,才体会到专业游 戏引擎的博大精深。 该程序的内核大约有2000余行,能够处理人物的行走、对话、战斗, 等等。由于该程序的结构并不适于这种规模的程序,故不推荐您详 细研究该程序。所附地图编辑器的源程序我已经添加了详细的注释, 其程序结构也比较合理,可以作为初学VC的例子。 该程序在VC的程序向导所生成的SDI框架的基础上修改而成。它没有 使用任何关于VC底层的东西。程序的绝大部分都是在CgameView类中 制作的,只有修改窗口特征的一段代码在CMainFrm类中。其他的类 统统没有用到。另外添加的一个类是CEnemy类。 整个游戏的故事情节分成8段,分别由Para1.h ~ Para8.h八个文件 实现。由于程序仅仅能够被动的处理各种各样的消息,所以情节的 实现也只能根据系统的一些参数来判断当前应当做什么。在程序中 使用了冗长的if……else if……结构来实现这种判断。 当然,在我的记录本上,详细的记录了每个事件的判断条件。这种 笨拙的设计当然是不可取的。成都金点所作《圣剑英雄II》采用了 剧本解读的方式,这才是正统的做法。但这也需要更多的编程经验 和熟练的code功夫。 下面列举的是程序编制过程中总结出来的经验和教训。 第一,对话方式应该采用《圣剑英雄II》的剧本方式。 现在的方式把一个段落中所有的对话都混在一个文件中,然后给每 句话一个号码相对应。这样做虽然降低了引擎的难度,却导致剧情的 编写极其繁琐。 第二,运动和显示应当完全分开。 现在的程序中,运动和显示是完全同步的。即:在定时器中调用所有 敌人的运动函数,然后将主角的动画向前推一帧,接着绘制地图,调 用所有敌人的显示函数、重绘主角。这样的好处是不会掉帧,但带来 的问题是,如果要提高敌人的运动速度,那么帧数也跟着上去了。所 以当DEMO版反馈说速度太慢的时候,我修改起来非常困难。而这个问 题到最后也仅仅是将4步一格该成了2步一格。 第三,VC中数组存在上限。如果用“int aaa[1000000000]”定义一个 数组,编译器肯定不会给分配那么大的内存空间。而在这个程序中, 地图矩阵、NPC矩阵都超过了VC中数组的上限。但这一点知道的太晚了。 在1.0版本中已经发现地图最右端缺少了几行,但不知道是什么原因 造成的。(地图编辑器中未出现此问题,因为地图编辑器是用“序列 化”的方式存盘读盘的。)解决这个问题的方法是用“new”来分配 内存空间。 第,由于不知道应该如何使用“new”和“delete”,几乎所有的DC 都使用了全局变量。这是完全没有必要的。程序运行期大约会耗用20 多M的内存空间,相当于一个大型游戏所使用的内存空间了。 另外,在游戏的剧情、美工方面也有许多问题,总之一个词“业余”。 我就不总结了。下一部作品,我将争取在程序上有一个质的飞跃。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值