我要发帖 回复

高级会员

109

主题

1366

积分

0

专家分

OSG-VR-GIS

忠于职守杰出贡献

:

私信
发表时间 : 2007-10-22 01:33:43 | 浏览 : 3253    评论 : 6
--------------------------------------------------------------------------------

        3D Game Development Tutorials
        Using SDL and OSG
        
        第二课

        SDL Setup:一个简单的Game Loop

                        ------FlySky
--------------------------------------------------------------------------------

引言

        在本节中,我们将使用SDL建立一个基本程序框架和Game Loop,形成了一个基础的三维游戏引擎。后来指南,将在此基础上设计,添加图形,代码和更多的功能,以游戏引擎。

基本概念概念

        基本c + +编程(Basic C++ programming)
        对象技术(Object Technology)
        SDL概念(SDL ConceptsSDL SDL)
        子系统初始化(Subsystem Initialization)
        事件循环(Event Loops)

代码清单

        Makefile         -用来'make'和'makeclean'我们的程序
        main.cpp           -包含Game Loopmodule_registry.h          -注册程序模块和关联内存管理
        module_registry.cpp system_controller.h         所有主要模块及处理事件循环
        system_controller.cpp
        window.h         SDL子系统,处理屏幕刷新
        window.cpp

SDL概念(SDL ConceptsSDL SDL)

        SDL是一个多媒体库,提供支持及处理用户输入和大多数的音频和视频功能,在接下来的课程中,我们将用SDL,为视频渲染,音频混合,处理鼠标键盘消息

子系统初始化(Subsystem Initialization)

        SDL是模块化的,当我们需要时,可以加载指定的子系统。 到目前为止,我们加载模块,这些子系统和相应的功能将无法使用。 在我们的程序中,因为我们加载的任何模块,我们需要卸下他们在他们终止时。

初始化SDL功能


        初始化:

        SDL_Init(<flags>) sdl_init ( <flags> )


        终止时恢复系统:

        SDL_Quit() sdl_quit ( )


        如果在一个地方,当sdl_init ( )被我们调用来初始化时,那么原先未初始化子系统中,我们必须使用不同的功能:

        SDL_InitSubSystem(<flags>) sdl_initsubsystem ( <flags> )


        flags:
        SDL_INIT_TIMER                 Initializes the timer subsystem.
        SDL_INIT_AUDIO                 Initializes the audio subsystem.
        SDL_INIT_VIDEO                 Initializes the video subsystem.
        SDL_INIT_CDROM                 Initializes the cdrom subsystem.
        SDL_INIT_JOYSTICK                 Initializes the joystick subsystem.
        SDL_INIT_EVERYTHING                 Initialize all of the above.
        SDL_INIT_NOPARACHUTE                 Prevents SDL from catching fatal signals.
        SDL_INIT_EVENTTHREAD                 Run the event manager in a separate thread.

        更多信息:http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fInit(在这里我就不写了,请见谅~)

        到目前为止,在我们的程序中,需要初始化视频子系统:

        SDL_Init(SDL_INIT_VIDEO) sdl_init ( sdl_init_video )

        这要求SDL来初始化视频子系统。它有一个返回值,为0成功,否则为-1。一旦这样做,我们有必要创造一个界面来渲染一些东西了:

        SDL_SetVideoMode(640, 480, 0, SDL_HWSURFACE) sdl_setvideomode ( 640 , 480 , 0 , sdl_hwsurface )


        在这种情况下,我们要求SDL创造一个硬件加速视频面尺寸640 x 480像素,配备了彩色深度0 ,默认为当前操作系统的颜色深度。现在我们有一个视频面来渲染了! 使用sdl_init和sdl_setvideomode ,会营造出一个与性能相对应的自然期待的操作系统的SDL窗口 。 窗口内将是一个黑色的画面部分;这是我们的视频渲染表面!但是,我们究竟如何来渲染呢?在以后的课程中,我将十分详细的描述视频渲染;首先,我们必须先看看SDL的其他部分。

事件循环

        SDL将为我们的游戏引擎处理输入/输出,因此我们需要一个事件循环。 一个事件循环功能几乎一模一样的,一听就知道:它是一个无限循环来等待事件,并在接到某些事件,调用函数调整物体的状态,在这个我们的程序中。一个事件循环的例子:

        while(true){
                      poll_for_event();
                      if(event is detected){
                           if(event is button press){
                                handle_button();
                   }
                   if(event is mouse movement){
                        handle_mouse_movement();
                                   }
                             }
                }


        在上面的例子中,我们使用一个事件循环检测玩家的输入。 当玩家按下某些键,游戏响应,因此,可能射击飞弹或打开一个盒子。 或者,其响应可能更简单:用户可能会要求退出程序。 退出程序是一个非常重要的操作,因为如果没有这项操作的话,我们的程序将不能以一种绅士(呵呵~)的方式来结束。 我们要避免程序以一种不绅士的方式来结束,所以对于这个例子,我们仅仅着重于输入的处理,以退出该程序。

        SDL提供了一个基于事件的子系统,可以方便地处理事件采用内置式结构:SDL_Event。SDL_Event是一个包含当前事件的子系统的简单快照的union,如键盘输入,鼠标移动,或其它基于窗口事件。SDL_Event由具体的SDL_Event结构组成,不过,它包含的信息远比我们所需要的多。 这个重要思想,在这里是SDL_Event所包含的信息对于此次事件。

        为了获得最新的事件,SDL_Event,我们需要检测或者等待一个事件。不过,SDL还提供了其他的许多方法,以更新的事件信息;我们可以这么做:

        SDL_PollEvent(<event pointer>) sdl_pollevent ( <event pointer> )


        这里参数我们用一个事件指针来关联事件信息,以便我们可以检测,并决定我们接下来应该做什么。我们也可以采取以下方式,但是这决不是唯一的方式:

        switch(event.type){
                      case SDL_QUIT:
                           return;
                     case SDL_KEYDOWN:
                   //key handling code
                }


        在这个例子里,我们检测了事件的类型,它是一个枚举描述型的结构。 sdl_quit相当于用户点击关闭按钮就关闭SDL_Window GUI。 sdl_keydown相当于用户点击键盘上的按键,如果我们进一步深入SDL_Event,将可以知道什么键被点击。SDL_Event的另一个重要的成员,就是SDL_KeyboardEvent  。 SDL_KeyboardEvent包含一个键盘信息, 利用这一点,我们可以准确地确定什么键按下,然后再决定如何处理该按键消息!

        if(event.key.keysym.sym == SDLK_ESCAPE){
                      return;
        }


        从上面可以看出,key.keysym.sym包含一个特定的按键消息。我们可以比较一下提供的sym枚举常量和sdl_key类,更多信息可以在这里找到,在这里我就不写了,太长了~请见谅
        
        http://www.libsdl.org/cgi/docwiki.cgi/SDLKey

        到目前为止,我们已经展现了一个基本的框架来处理键盘事件。然而,我们的这个例子并不能处理同时发生的多键按下和鼠标输入事件。不过,我将在以后的课程中详细地的讲解如何处理同时多键按下和鼠标输入的技术。

类的层次结构

        main.cpp实例了副本system_controller。这反过来又实例了副本module_registry和窗口。因此, system_controller是恰如其分地命名,因为它的作用就像一个枢纽,连接所有其他模块。

        如图附件一:

        在以后的教程中,这里将容纳更多的模块,并且module_registry将为这些模块处理所有的内存管理。



程序简单说明:

        注意:本课程中,所有的代码都有详细注解,在以后的课程中将被删除。 这样做是为了减少代码的篇幅,并保持代码看起来条理清晰。我想这应该不是一个问题吧,呵呵~由于概念的第一次引入,应该都是有案可稽的。当你下一次碰到它时,我想,你应该就可以理解吧。同时,这一制度,将让程序员阅读代码更快,因为只有评论的范畴,是重要的,即程序员需要关注的焦点。

        main

        main.cpp的唯一的目的主要是为了实例本地副本system_controller,成功创建事件循环。 其中还包括try/catch异常模块,以处理异常在执行我们程序的时候。 这些主要文件在以后的课程的代码中也不会改变的,正因为如此,将不会再提及。

        module registry

        module registry实在是不必要的class,但它的创建是为了这个目的,贮存所有的我们游戏引擎可以需要用到的资源。可以说这是一个非常重要的概念,在面向对象游戏引擎设计中,我们通常把所有的相关的东西设计为一个模块。对于发动机的设计,我们只要简单的插上电源,它就可以工作了,哈哈哈~由此,以及根据我以往的经验,我发现几乎每一个模块都需要获得其他模块,而非编码硬连接到其他单元作为私有数据成员,我决定要创造一个级别的来间接表示。 现在,如果一个模块需要用到另一种资源或模块,它会要求该模块注册处表示为资源。在每个模块只需要一个硬连接到module_registry本身。

        system controller

        system controller是建立在一个连接所有其他模块的思想上,并开始事件循环。它简单完美的设计,但在以后的教程中,它将会稍微复杂一点。

        window

        window,代表着我们SDL的窗口,并简单地包含开始说的功能。同时,它也将包含必要的代码,以完成窗口的刷新(帧) ,但现在,我们只需要履行初始化就可以了 。

参考文档:
http://www.libsdl.org/cgi/docwiki.cgi/


总结:

        运行代码,你应该可以看到一个黑色SDL窗口弹出。就是这样的了。 说的这一切,就是这一节课程所讲的了。不是很令人印象深刻吧,呵呵?等待吧!现在我们点击关闭按钮,程序就正常退出了。现在你可以去看一下代码了~~~~

          如图附件二:

        现在,你建立了自己的基本的框架。在以后的课程中,我们将继续建设我们的游戏引擎。我们已经知道如何启动和关闭sdl和如何处理键盘事件。 在以后的课程中,我们将学会如何将OSG加入到里面去。

附件一

附件一

附件二

附件二

最近VR访客


OSG中国官方网站:http://www.osgChina.org
OSG中国官方讨论区:http://bbs.osgChina.org

OSG专业群-OSG地形研究者 49668412
      OSG地形专业研究 45763709
FlySky 评论于2007-10-22 01:34:41
代码下载:

sdl_setup.tar.gz

5.1 KB, 下载次数: 46

sdl_setup.tar.gz


OSG中国官方网站:http://www.osgChina.org
OSG中国官方讨论区:http://bbs.osgChina.org

OSG专业群-OSG地形研究者 49668412
      OSG地形专业研究 45763709
FlySky 评论于2007-10-22 01:35:54
第二课已经出来了,请各位多指点,多支持~~~~~~呵呵~~~~~


OSG中国官方网站:http://www.osgChina.org
OSG中国官方讨论区:http://bbs.osgChina.org

OSG专业群-OSG地形研究者 49668412
      OSG地形专业研究 45763709
array 评论于2007-10-22 08:34:48
嘿嘿,支持~~
SDL我记得有几本外文教程,Programming Linux Games,Focus on SDL,还有C++ Game Programming With SDL。大家可以去Emule上面下~~我这里也有电子版
obuil 评论于2007-10-22 09:00:08
继续学习一下
FreeSouth 评论于2007-10-22 12:02:11
wangguanyu2000 评论于2007-10-23 16:14:44
学习学习

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-9-21 10:31 PM

返回顶部