资源描述:
《delphi实例10--深入OpenGL游戏开发》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实例十用OpenGL实现星空闪电图【程序说明】实例九实现的OpenGL星体没有什么使用功能,而本例的星空闪电图则有一定的实用价值,因为不仅实现了背景贴图和声音资源的播放,还实现在背景上加载了一个OpenGL几何实体。随着闪电的不断旋转,背景和闪电的颜色都不断忽明忽暗地变化着,很有星空闪电的效果。本例程序运行结果如图10-1所示。图10-1用OpenGL实现星空闪电图【编程思路】本例同实例九不一样的地方就是它是完全在Delphi环境下实现的。因此,我们可以从这个实例中一步一步地学会如何在Delphi环境下创建一个声影具备的OpenGL动画游戏。下面是这个实例的一些关键技术。1、在控制台环境下
2、创建自定义的窗口。2、Delpi环境下OpenGL初始环境设置。3、用OpenGL技术绘制场景和闪电。4、背景贴图技术。5、声音媒体的播放。这些技术的具体实现请参考后面的代码部分。【编程步骤】.1.按照前面介绍的方法,新建一个控制台应用程序。2.编写代码(1)在控制台环境下创建自定义的窗口,并根据具体情况初始化OpenGL设备环境。functionglCreateWnd(Width,Height:Integer;Fullscreen:Boolean;PixelDepth:Integer):Boolean;varwndClass:TWndClass;//窗口类型dwStyle:DWORD;/
3、/窗口风格dwExStyle:DWORD;//窗口扩张风格dmScreenSettings:DEVMODE;//屏幕设置PixelFormat:GLuint;//OpenGL渲染设置h_Instance:HINST;//当前实例pfd:TPIXELFORMATDESCRIPTOR;//OpenGL窗口相关设置ResHandle:THandle;//声音资源句柄begin…………(创建一个窗口,详细代码见光盘)//设置OpenGL窗口withpfddobeginnSize:=SizeOf(TPIXELFORMATDESCRIPTOR);nVersion:=1;dwFlags:=PFD_DRA
4、W_TO_WINDOWorPFD_SUPPORT_OPENGLorPFD_DOUBLEBUFFER;iPixelType:=PFD_TYPE_RGBA;//RGBA颜色格式cColorBits:=PixelDepth;//OpenGL颜色深度cDepthBits:=16;//指定深度缓冲区的深度iLayerType:=PFD_MAIN_PLANE;end;PixelFormat:=ChoosePixelFormat(h_DC,@pfd);//设置刚才设置的象素格式if(PixelFormat=0)thenbeginglKillWnd(Fullscreen);MessageBox(0,'不能
5、找到一个合适的象素格式!','错误',MB_OKorMB_ICONERROR);Result:=False;Exit;end;//设置象素格式if(notSetPixelFormat(h_DC,PixelFormat,@pfd))thenbeginglKillWnd(Fullscreen);MessageBox(0,'不能设置象素格式','错误',MB_OKorMB_ICONERROR);Result:=False;Exit;end;//创建一个OpenGL渲染环境h_RC:=wglCreateContext(h_DC);if(h_RC=0)thenbeginglKillWnd(Fulls
6、creen);MessageBox(0,'不能创建一个OpenGL渲染环境','错误',MB_OKorMB_ICONERROR);Result:=False;Exit;end;//设置当前的设备环境if(notwglMakeCurrent(h_DC,h_RC))thenbeginglKillWnd(Fullscreen);MessageBox(0,'不能激活OpenGL渲染设备','错误',MB_OKorMB_ICONERROR);Result:=False;Exit;end;SetTimer(h_Wnd,FPS_TIMER,FPS_INTERVAL,nil);//初始化计算帧数的定时器R
7、esHandle:=FindResource(hInstance,'Electric','WAVE');//初始化声音设置,加载声音资源SndHandle:=LoadResource(hInstance,ResHandle);ShowWindow(h_Wnd,SW_SHOW);SetForegroundWindow(h_Wnd);//设置当前窗口一直保持在最前面SetFocus(h_Wnd);//保证窗口可以正确地缩放g