基于VisualC的游戏开发与设计.doc
引言关于游戏的一些基本理论的介绍电子游戏定义:采用电子手段玩的游戏称为电子游戏,电子游戏主要由两类构成:单机游戏和网络游戏。这两类游戏的共同特点是都需要游戏硬件和游戏软件的支持,网络游戏又需要有互联网的支持。单机游戏定义:单机游戏以独立的软硬件设备为依托,主要供单人或有限数量的人(例如少于4人)玩的游戏。单机游戏可分为如下几种:l PC单机游戏:在PC上运行的游戏软件。是一种具有娱乐功能的计算机软件。PC游戏产业与电脑硬件、电脑软件、互联网的发展联系甚密。l 视频控制台单机游戏:运行于游戏主机上、并借助电视机和其他视频器为显示器的游戏软件。l 掌上设备单机游戏:指使用便携式电子设备游玩的电子游戏。现在包括有掌上游戏机游戏和手机游戏两大类。l 街机游戏:运行于大型游艺器上的游戏软件。网络游戏定义网络游戏是利用TCP/IP协议,以Internet为依托,可以多人同时参与的游戏项目。网络游戏有两种存在形式:一是必须连接到互联网才能玩,而单机状态则不能玩,这种形式有的游戏需要下载相关内容或软件到客户端,有的则不需要;第二种则必须在客户端安装软件,此软件使游戏既可以通过互联网同其它人联机玩,也可以脱网单机玩。网络游戏具有如下特点:l 真实性强。随着互联网的发展,众多游戏用户真正有了一个能够相互交流与竞技的地方。用户所面对的不再是那些在电脑控制下的机器人物,而是具备真正的游戏伙伴。通过网络游戏使人与人之间的较量和结盟成为可能,大大增加了网络游戏的真实性、竞争性、刺激性和团队性。l 互动沟通性好。真人之间的共同参与,使沟通是在人与人之间进行的,这种沟通是相互和平等的,虽然看不见对方,但能感受到对方的存在,大大增加了游戏过程中的互动沟通性。网络游戏公司以游戏为纽带建立起来的社区,成为吸引用户参与游戏的重要因素,这也大大加强了网络游戏对用户的吸附作用。l 产业相关性大。网络游戏不仅象其它游戏一样同计算机硬件厂商、软件厂商、销售及服务商、媒体及出版相关,同时它极大的同电信运营商、网络设备供应商、游戏运营商等相关,从而带动更多产业的发展。网络游戏部分网络游戏的分类可从两个角度进行,一是游戏运行的平台,二是游戏的内容架构。按照游戏运行平台的游戏分类:l PC网络游戏:以PC为硬件平台的网络游戏。可以是不安装任何游戏软件,直接上互联网玩的游戏。l 视频控制台的网络游戏:以专门的视频控制台加上电视或显示器为平台玩的网络游戏。视频控制台如Sony的PS/2或微软的Xbox等。l 掌上网络游戏:在掌上电脑、手机等掌上设备玩的网络游戏。l 交互电视(iTV)网络游戏:在交互式电视上玩的网络游戏,交互式电视是具有上网及信息处理功能的电视,它也是信息家电的一种。按照游戏内容架构的游戏分类:l 角色扮演类 (RPG) Role-playing Game 由玩家扮演游戏中的一个或数个角色,有完整的故事情节,强调的是剧情发展。用户通过在游戏中扮演虚拟社会中的角色的生存和成长,来体验现实生活中无法触及到的感受, 或对缓解现实社会给予自身的压力,以满足自己的愿望、梦想或成就感。目前RPG游戏有传奇、魔力宝贝、决战、石器时代、精灵、金庸群侠传online、千年等。l 策略类或战略类 (SLG) Strategy Game 用户运用策略与电脑或其它用户较量,以取得各种形式胜利的游戏。策略类的游戏多以历史题材为剧情,并且侧重于战略和战术的使用。如命令与征服系列、魔兽争霸系列、帝国时代系列、星际争霸、三国志系列、幽浮系列等。l 动作类 (ACT) Action Game 用户控制游戏人物用各种武器消灭敌人以达到过关目的的游戏类型,几乎没有什么故事情节。设计的核心思想面向大多数用户,以纯粹的娱乐为主要目的,不强调剧情。如魂斗罗、超级马里奥等。l 冒险类 (AVG) Adventure Game 由用户控制游戏人物进行虚拟冒险的游戏,与RPG不同的是,AVG的故事情节往往是以完成一个任务或解开某些迷题的形式出现,而且在游戏过程中刻意强调谜题的重要性,使之成为一种专门考验大脑的活动。如生化危机系列、古墓丽影、第七位访客系列、凯兰蒂亚传奇系列、猴岛小英雄系列等均属于这类游戏。l 模拟类游戏 (SLG) Simulation Game 模拟类游戏又可分为以下三种,一类是飞行模拟类游戏,由用户控制各种飞行物(主要是飞机)完成任务或过关的游戏,如微软飞行模拟系列、苏一27 等等。另一类是模拟经营类游戏,此类游戏给予用户一个特定的环境,并赋予其一定的权利与角色,让其对该环境予以改造,使该环境得以良性发展,如模拟人生Online)、过山车大亨、主题公园等属于这类游戏。三是其它模拟类游戏,如心跳回忆、青涩宝贝、世界足球经理等。l 棋牌类休闲类 制作者将棋类和牌类线下娱乐活动移植到网络上,形成一种基于互联网的竞技活动,使参与者具有更广阔的地域性。如联众。l 运动类 (SPT) Sports Game 在电脑上模拟各类竞技体育运动的游戏,如FIFA系列、实况足球系列等。l 赛车类 (RCG) Racing Game 在电脑上模拟各类赛车运动的游戏,没什么剧情,但非常讲究图像音效技术,往往是同期电脑游戏技术的领先者。如极品飞车、摩托英豪等属于这类游戏。第一章 游戏软件设计与制作的基本理论知识 如果要盖一幢高楼,参与盖楼的有蓝图设计师、建筑师、装潢制作师等工种。盖一幢高楼首先需要有一幅详细的制作蓝图,它说明了高楼所建的位置、高楼所表现的设计风格、每一层的建筑格局等;建筑师首先根据设计蓝图的要求进行施工,当楼宇的基本构造已经完成后,装潢制作师则按照设计蓝图的指示,开始对建筑均外观进行装饰美化,经过以上儿步,一幢美观的高楼就可以竣工交付使用了。游戏同样如此,游戏制作是一门系统的开发工程,需要多工种的配合。一般来说,制作一部游戏软件需要有策划、程序制作、美工音效等多工种的配合。策划如同蓝图设计师,他将决定一个游戏的内涵与外在表现方式,而程序制作人员则起到了建筑师的作用,他需要根据策划的要求,将程序及数据结构构造好,美工音效就相当于装潢制作师一样,要对整个游戏的外在表现进行包装和润色。只有这几大部分分工协作,共同努力才能制作出好的游戏。.1游戏的前期创意及文字工作笼统的说,一个游戏只包括想和做两部分,想就是游戏制作前期头脑中的创意以及后来把这些创意付之书面形成的各种策划书和文档。做则是基础上按照各种文档所规定的要求将创意用程序代码表示出来。二者是紧密联系在一起的。基本创意的形成 想创作出一个好的电脑游戏必须先从其制作创意着手,创意就是游戏玩家能从这个游戏中体会到的内涵。游戏内涵是不需要用长篇大论进行表达的,它只是一个概念,当有了这个基本概念后,游戏策划师必须再根据这个原始概念来产生游戏的思想基础,有了思想基础就可以从简到繁,派生和演化出许多其它附加的内容,这样慢慢的一个游戏雏型就产生出来了。著名的电脑游戏创世纪系列从其第一代到第七代之间的开发历程经过了近十年的时间、这个游戏之所以著名就是因为其能自始至终坚持最初的游戏创意并在每一代软件中突出原始创意的升华。这就是内在思想主线集中,表现形式丰富的设计之成功所在。l 创作思想与动机开发一套电脑游戏软件,首先我们必须明确创作思想与动机,这也就是所谓的基本思想,然后我们就应坚持这种创作思想,并让这种思想主宰整个游戏的内容与风格走向,然后就该考虑有哪些事件可以适用到这套游戏中去?增加哪些故事内容就能让游戏更为丰富多彩而又不违背主题,真正合理的取舍游戏内容是游戏前期制作的关键之一。l 原创性游戏思想及其操作性的原创性( Original)是非常重要的,如果在游戏设计时一味的去模仿其它游戏的思想或内容,这样虽然会使开发难度降低不少,但往往又会使自己的游戏在思想主线上陷人脆弱与单调的囚笼,就游戏的制作过程来说,由于具原创性的游戏因没有先例可以遵行,全靠自己摸索,所以在设计与开发上会比那些单纯模仿其它游戏的设计要有难度的多。但这种原创性游戏因为构思新颖,前所未见,往往能比其它游戏更能获得玩家的青睐。l 游戏思想底层一个好的游戏创意仅靠原创性还是不够的。还必须构造更为完善的游戏思想底层才行,这个思想底层必须包括以下几点:1.定游戏的所属类型(RPG,策略、动作、智育等)。 2.游戏中故事所发生的年代定位。 3.故事主人公的角色定位。 4.设定游戏的大体情节( 如果设计是关卡制的话,则应该大体想一下每关的设计 )。5.设定故事所蕴含的教育意义。制作游戏策划书策划书是大地图,它引导你在茫茫大海上航行时找到正确的航向。 高桥宪行,日本策划专家在游戏设计之初,最重要的莫过于制作游戏策划书。策划书的内容很多很杂,它既包括了制作这个游戏的意义,还需要分析这个游戏的市场前景;既要谈到了游戏情节定位,还要理顺游戏开发的全过程。内容之大、之多是其它策划书所不能比拟的。策划书的 5W3H一般策划书要求必须要有 5W3H: What (为什么) 本软件的开发目的与开发方式; Who (谁) 参加本次开发的人员组成; Where (何处) 游戏所表现的类型及格; When(何时)游戏的开发时间测算; Why (为什么) 进行本次开发的理由( 经济效益与社会效益两方面 ); How(如何1) 如何进行开发,开发的方法及整个开发组的运转过程; How(如何2)如何博取多数人好感的方法(游戏的几种目标);How much(多少)本次开发所需资金及设备预算表。游戏策划书所需要的准备工作 游戏策划书是一种提炼于成熟构思上的书面材料,你是一份报告,但与一般分析文章不同的是,游戏策划书不仅要有构思,还要说明计划完成的方法。当准备好这两点后,再开始收集游戏所需的其它相应资料,最后将收集到的这些资料进行整理成文,到此方才可以开始游戏策划书的写作。策划书的写作顺序是: 进行市场调查,取得第一手的材料; 草拟策划书的大纲( 包括确定策划书的每个章节及其所占重点 ); 开始构思策划书每章的内容; 按照所需的轻重缓急来相应的收集并整理资料及数据; 开始写作策划书的各个章节; 完成策划书初稿后,要仔细按照写作大纲的重点分配来修改策划书初稿。 电脑游戏既是一种文化又是一种商品,所以在电脑游戏制作之前,先进行一次市场调查与摸底是极其有必要的。当发现市场需求与自已制作的游戏目的相违背时,应及时地调整游戏目的,以期满足市场要求,这样做就可以达到既叫好又叫座的结果。写游戏策划书需要有完善的写作大纲,这个写作大纲中包括了策划书所设定的每段章节的大体内容及其所占重点比例的多少。简而言之,写作大纲是一部游戏策划书的写作底层。游戏策划书的大体基本结构游戏策划书的大题结构可以分为以下几个方面: 封面及标题 ( 必备 )封面力求简洁明了,能让人一目了然。在封面上要注明策划书的标题(x x的策划书)、策划的主体(策划书所服务的公司或部门)、策划时间(从准备到写作完成的时间)、策划相关人员(策划人姓名、资料收集人姓名、市场调查员的姓名等)、策划书的档案编号。 序文( 非必备) 在这部分中,序文主要是招个策划书的基本概要,字数不应太多,大体在45百字左右,力求简明扼要.起到概括主题的作用。 目录(必备)目录的编写也比较重要,这里的重点主要是策划书的章节安排,如果一般人能从目录的章节分配上大体了解整个策划书的全貌,那么这个目录就已经写的十分完备了 前言(必备) 前言的作用与序文的作用十分相近.都是对策划书起到了概括作用,但前言的作用更为重要,策划书的部分精华就在于前言。应力求能使读者在阅读前言后就对整个策划书有一定的了解.即使不用将策划书完整的看完,也已经了解到了策划书的大体内容。 进行本次开发的主要目的(必备) 为什么进行本次软件开发,开发后发有什么收益(从社会角度或从经济角度)如何进行本次开发,这几个问题都应在本节中获得解答。 游戏的情节及内容设定(必备) 这是整个策划书中最关键的一部分,游戏的内容及情节的设定直接会影响游戏品质的好坏,而游戏品质的好坏又同市场认可度紧密相关。市场认可度高,该游戏最初策划所估计的社会效益与经济效益就能得到保障;如果认可度低,就可能导致游戏无法达到最初策划时对社会效益与经济效益的估计。游戏开发工具 Visual C+ 不仅仅是一个编译器。它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的 C+ 来开发出专业级的 Windows 应用程序。Visual C+是在C语言的基础上发展起来的,具有高级程序设计语言的语句结构,接近于自然语言和人类的逻辑思维方式。Visual C+语句简单易懂,其编辑器支持彩色代码,可自动进行语法错误检查,同时具有功能强大且使用灵活的调试器和编译器。Visual C+是解释型语言,在输入代码的同时,解释系统将高级语言分解翻译成计算机可以识别的机器指令,并判断每个语句的语法错误。在设计Visual Basic程序的过程中,随时可以运行程序,而在整个程序设计好之后,可以编译生成可执行文件(.EXE),脱离Visual C+环境,直接在Windows环境下运行.1. 4对象的链接与嵌入对象的链接与嵌入(OLE)将每个应用程序都看作是一个对象(object),将不同的对象链接(link)起来,再嵌入(embed)某个应用程序中,从而可以得到具有声音、影像、图像、动画、文字等各种信息的集合式的文件。OLE技术是Microsoft公司对象技术的战略,它把多个应用程序合为一体,将每个应用程序看作是一个对象进行链接和嵌入,是一种应用程序一体化的技术。利用OLE技术,可以方便地建立复合式文档(compound document),这种文档由来自多个不同应用程序的对象组成,文档中的每个对象都与原来的应用程序相联系,并可执行与原来应用程序完全相同的操作。1.5动态数据交换利用动态数据交换(Dynamic Data Exchange)技术,可以把一种应用程序中的数据动态地链接到另一种应用程序中,使两种完全不同的应用程序建立起一条动态数据链路。当原始数据变化时,可以自动更新链接的数据。Visual Basic提供了动态数据交换的编程技术,可以在应用程序中与其他Windows应用程序建立动态数据交换,在不同的应用程序之间进行通信。6游戏剧本的写作如果说游戏策划书是一部小说的纲要,那么游戏剧本就是这部小说的中心内容与思想。同是剧本,游戏剧本同电影剧本有本质的不同:电影是单线剧情,剧本作者只要按自己的创作思路运用电影手法去创造一个类似真实的环境供观众去感受就可以了;而游戏,尤其是角色扮演类游戏,具有多线制剧情的安排,所以虽然游戏剧本的作者可以按照自己的思路去写剧本,但在写作同时必须考虑玩者可能的举动,并据此而设计出许多条游戏途径供玩家选择。这种写作方式既要使游戏程序便于程序员开发,又需要能让玩者自由发挥,因此从文学写作上来说难度是比较高的。游戏剧本并不像小说那样注重人物心理的细节描写,也不像电影剧本那样采用直线式的场景和人物分镜。他主要是通过将那些有可能发生的一切情节有机的罗织下来。借游戏画面给玩者以亲身感觉。再通过玩者的操作转而进人不同的情节安排。这也就是说,游戏剧本的制作要充分考虑到玩者的各种可能反应及反应所带来的不同结果,真正做到剧情安排既合乎情理又方便程序制作。7游戏中各种参数的预先设定仅凭软件策划书与剧本来制作电脑游戏还是不够的。因为策划书只是陈述了制作方面的构思,软件剧本也只是软件内容的一种书面上的详细介绍,对游戏程序设计来说这一切都还很模糊。程序设计需要有程序参数设定书,这才是整个游戏制作中从策划工作过渡到程序开发工作过程中的主要关键。参数设定相当于制定游戏规则,由于每个游戏都各有不同,所以他们各自的参数设定也不一样。动作类游戏的监参数设定着重于打斗时的损伤计算和武术招数的威力设定,而策略类游戏的参数设定则偏向于人物属性和策略功能的执行方式。游戏的参数设定多种多样,但只要设定抓住游戏的客观本质,在游戏细节上下一番功夫,就可以攻克这一关。第二章游戏软件的几大功能模块一部游戏程序软件不管其所属那一类游戏类型,其程序部分一般都是由以下几大部分功能模块构成的. 2.1计算机内存控制和处理功能 计算机在运行计算机程序时,必须将这些程序代码放到计算机内存中以便管理,内存中既有运行程序代码,也有动画图形、音乐音效等数据资料,而且由于游戏程序在不断的运行,内存中的动画图形也不断的被利用和更新所以存储的数据可能经常性的出入内存。为了更好的对内存进行管理,就需要计算机内存管理程序来全权负责整个内存仓库部分的进出操作。它负责规定机内各个运行程序的程序代码所应该存放的位置,并随时按控制要求管理程序代码和数据的调配使用情况。调用频繁又讲究执行速度的代码数据就会被放到计算机的基本内存中,以便最快速地进行调用。而一般不常调用的数据及程序代码就会被内存管理程序放到高端内存或暂存到硬盘中,等到真正要调用时才载人运行,这样就不会占用过多的计算机内存。游戏程序所用的图形数据、动画数据就分被安排到显示内存上备用,程序可随时调用播放以加快处理速度。2.2输入信息控制管理功能玩家就是通过游戏操纵杆来指定或控制游戏中主角作各种各样的动作完成故事剧情,游戏中的主角在遇到敌人时,是选择逃跑还是战斗都由玩家来决定。游戏操纵杆根据玩者的控制,将一些特定的信号发给电脑处理,而电脑则靠游戏程序中关于输人控制处理的专用程序来进行判断。这些专用控制程序必须先对输人设备的特定信息进行定义,规定哪些是战斗信息,哪些是逃避信息,然后再通过接收并处理这些特定信息以达到控制游戏主角的目的。当然除了刚才我们介绍的游戏操纵杆外,电脑还有一些其它的输入设备如键盘、鼠标,大多数电脑游戏都对这些输人设备进行定义和控制。2.3游戏主体情节的处理功能电脑游戏与动画片相比,动画片是由始至终的单一剧情,而游戏的主体情节部分则相当于是多线制的动画片剧情,因为游戏需要根据玩者从输人设备上发出的信息来控制游戏的剧情发展。那些输入信息的不同会导致剧情有不同的走向,例如在一部打斗游戏中,玩家按动游戏操纵杆的上方向键,按照前面对游戏输人及控制程序的定义,这可以解释成为是一个让游戏主角临空飞跃的控制信号,计算机在接收得到这个控制信号后,再通过游戏主体情节程序的控制处理,可得知这个临空飞跃的动作将会让游戏主角跳过一个暗藏的陷阱。在游戏的多线制剧情中,将会判断这一飞跃信号输人的时机,种情况是信号输入的太迟,则表示玩者反应较缓慢,这时在游戏中游戏主角将因为未能及时跃起而掉人陷阱中去,这时就不可能再进行跳跃了。另一种情况是玩者及时的按动游戏操纵杆,临空飞跃。这一输人信号来的正是时机,游戏主角在陷阱的边缘,及时的跃起顺利跳过危险境地游戏主体情节控制部分就根据游戏剧情发展的要求,再结合判断玩者输人操作的时机。总结发出不同的信号给屏幕输出部分以便输出结果。2.4屏幕输出控制功能 ( 即图形、动画显示播放部分)本程序部分就是通过处理游戏主体情节程序发出的不同信息,来相应产生的不同剧情画出。当主题情节控制部分所发出的是第一种情况的信号时,则表示游戏主角未能及时的跃起,这时屏幕输出部分将选择播放主角掉人陷阱画面。而如果主体情节控制部分发出的是第二种情况的信号时,就代表着游戏主角及时的跳跃起来,这时屏幕输出部分将会播放主角跳过陷阱后继续奔跑的画面,所以说按照游戏主体情节的安排来播放这些不同的动画片,就是游戏屏幕输出部分的主要工作任务。第三章 游戏引擎什么是游戏引擎引擎是赛车的心脏,决定着赛车的性能和稳定性,赛车的速度、操纵感这些直接与车手相关的指标都是建立在引擎的基础上的,游戏也是如此。游戏引擎负责处理各种琐碎的事物:组建游戏,确保它正确运行以及关闭它。虽然这些任务确实是任何程序都需要的,但是初始化,运行以及在游戏结束后进行清理等工作的某些方面确实是游戏所特有的。因此,重要得是,游戏引擎能够满足游戏的独特需求,并帮助使围绕引擎开发游戏的过程尽可能简单和直接。有了一个设计优良的游戏引擎,会发现,在开发游戏所需的代码比不使用游戏引擎时要少的多其思想是一次性开发某些核心游戏程序,将其粘贴在游戏引擎中,然后只有在绝对必要时才再次处理它们。例如,在编写了加载图像并在屏幕上绘制它的代码之后,就没有什么理由要重写这种代码了。加载和绘制图像是所有游戏引擎都需要的一个基本功能。将游戏分解为事件 每一个WINDOWS程序都可以分解为事件,即在程序运行时发生的事件,例如单击鼠标和更改窗口大小。正如WINDOWS程序包含必须处理的事件一样,游戏也有其在开发过程中必须考虑的一组特有事件。可以将游戏的初始化过程视为一个事件,它负责加载游戏的图形和声音,清空游戏区域,将得分归零。类似地游戏中也有用户输入,意味着单击鼠标和按键操作是游戏必须自己处理的事件。此外还有一点,在WINDOWS中,可以最小化某些游戏或者将其至于后台,意味着可能希望暂停游戏。可以使用两个事件来表示这个激活和停用过程。可能许多游戏事件当然都可以包括在游戏引擎之中,本游戏只包括:初始化,启动,结束,激活,停用,绘制,循环。初始化事件在一开始运行游戏时发生,这时游戏将执行重要的初始设置任务,包括创建游戏引擎本身。启动和结束事件对应于游戏的开始和结束,这时很适合执行与特定的游戏会话相关联的初始化和清理任务。在最小化游戏或者将其发送到后台,然后再恢复时,就将它激活和停用事件。当游戏需要绘制自身时,将发送绘制事件,就是VisualC+中的_PAINT消息。最后循环事件使游戏执行一个单独的游戏周期。开发游戏引擎开始创建游戏引擎的第一步是创建与游戏事件对应的处理函数。当游戏中产生一个事件时,就会调用相应的事件处理程序,使游戏有机会做相应的响应。下面给出的函数,它们直接对应于游戏事件。Bool gameinitalize (HINSTANCE hinstance);Void gameStart(HWND hwindow);Void gameEnd();Void gameActiveate(HWND hwindow);Void gameDeactivate(HWND hwindow);Void gamePaint(HDC hdc);Void gamecycle(); 第一个函数gameinitalize()可能是惟一需要特别说明的函数,主要在于传入它的参数,我指的是属于HINSTANCE类型的hinstance参数。这是一种in32数据类型,引用了一个应用程序实例。应用程序实例上是已经加载到内存中并在Windows中运行的一个程序。虽然在游戏事件处理程序与游戏引擎之间存在着紧密的联系,但是二者实际上是独立的。因为就结构而言,将游戏引擎放在它自己的VisualC+中会更好,所以这样很有必要。这个类型名为GameEngine。GameEngine类的定义揭示了游戏引擎的设计Class GameEngine Protected: /member Variables Static GameEngine* m_pGameEngine; HINSTANCE m_hinstance; HWND m_hwindow; TCHAR m_szwindowclass32; TCHAR m_szTitle32;WORD m_wicon,m_iheight;Int m_iwidth,m_iheight;Int m_iFrameDelay;BOOL m _bsleep;上面是游戏引擎成员变量记录的重要信息,例如图标,宽度,高度,帧的延迟和休眠状态等。Public;gameEngine(HINSTANCE hinstance,LPTSTR szWindowClass, LPTSTR szTitle, WORD wicon, WORD wsmallicon ,int iwidth=800, int iHeight=600);游戏引擎构造函数使用默认的屏幕大小()创建游戏,这是实际的游戏区。Virtual GameEngine();Static GameEngine GetEnginge () ( return m_pGameEngine;);BOOL Initialize(int icmdshow );LRESULT HandleEvent(HWND hwindow, UINT msg , WPARAM wparam, LPARAM lparam);HINSTANCE GetInstance() return m_hInstance;HWND GetWindow() return m_window;Void SetTitle() (HWND) m_hwindow=hwindow;LPTSTR GetTitle()return m_szTitle;WORD GetIcon()return m_wIcon;WORD GetSmallIcon() return m_ GetSmallIcon;Int GetWidth() return m_iwidth;Int GetHeight() return m_iHeight;Int GetframeDelay () return m_iFrameDelay;Void SetFramerate( int iFrameRate ) m_iFrameRate=1000/iFrameRate;指定帧速率(每秒的帧数),意味着值为会使游戏以帧秒的速度运行。BOOL Getsleep()return m_bsleep;Void Setsleep(BOOL bSleep)m_bsleep=bsleep; ameEngine类的定义揭示命名类的成员变量时使用m_开始,表示它们是类成员。此外,在命名全局变量名是以g_开始,表示变量是全局的。这种约定很有用,它有助于快速区分程序中的局部变量,成员变量以及全局变量。GameEngine类的成员变量全部都使用了这种命名约定。GameEngine类定义了一个指定自身的静态指针m_pGameEngine,它用于游戏程序的外部访问。使用m_hInstance和m_hWindow成员变量将游戏程序的程序实例和主窗口句柄存储在游戏引擎中。窗口类的名称和主游戏窗口的名称存储在m_szWindowClass和m_szTitle成员变量中。游戏的两个程序图标的数字ID存储在m_wlcon和m_wSmallIcon成员中。游戏屏幕的宽度和高度存储在m_iWidth和m_iHeight成员中。一定要注意,这个宽度和高度与游戏屏幕(或着游戏区)的大小而不是整个程序的窗口的大小相同,之后更大一些,包括了边框,标题栏,菜单等。m_iFrameDelay成员变量表示游戏周围之间间隔的时间(单位是ms)。m_bSleep是一个布尔变量成员变量。表示游戏是否正在休眠(暂停)。第四章 使用键盘和鼠标控制游戏41游戏与输入 如果一个游戏不能交互,那么世界上的所有图形都无法挽救这个游戏。没有用户交互的游戏有一个名字屏幕保护程序!虽然用户可以来自几个不同的位置,但是通常都可以将它们归类为一个简短的用户输入设备列表:键盘,鼠标,和游戏杆。到目前为止,键盘和鼠标是计算机上的两个最标准的用户输入设备。并且所有计算机都支持它们。用户输入是用户与游戏进行交互的途径。考虑一下这个事实:用户输入包括了游戏玩家与游戏之间的所有通信,游戏中的用户输入支持将直接影响游戏的可玩性。当用户输入不够有效时,游戏的品质就会下降。42 接受键盘输入自从键盘出现以来,它一直是理想的输入设备。虽然鼠标设备,游戏杆,飞行手柄,虚拟现实手套以及其它许多用户输入设备都给游戏玩家带来了扩展功能,但是任何一种都没有键盘那样被广泛接受。至少,总是可以指望游戏玩家拥有一个键盘。对于各种类型的游戏而言,键盘是一种极其有用的输入设备。键盘的数量本身就使键盘对于需要大量用户输入的游戏很有吸引力。对于那些需要快速移动和开火的游戏而言键盘更有用的地方在于按键繁荣那种自然感觉。只要看看许多街机游戏仍然在使用按钮,就可以看出键盘的作用,使用组合键就更容易。我们知道,在win32API中有大量使用消息提交有关各种事件的通知,如创建窗口,破坏窗口,激活窗口,停用窗口等。这个相同的信息传递系统也用来传递在键盘上的按键通知。更具体的说,Win32 API 定义了名为WM_KEYDOWN和WM_KEYUP的消息,只要按下或释放一个键,它们都会通知你。在Windows程序中,这两个消息是很容易处理的。但是有一个问题,这个问题就是标准的Windows消息传递系统传输键盘消息的速度慢的令人无法接受的。实际上,在游戏编程总存在某种解决办法的,在WINMain函数中建立了游戏引擎机制。WinMain()函数包括一个不断重复的程序循环,它处理程序的消息。当这个函数没有处理消息时,它就会将时间用来处理游戏引擎的周期。换句话说,游戏引擎利用主程序循环的空间时间来实现与游戏有关的任务。这种空闲时间就是在按下或释放键盘上的键时可以利用的一点。 这种处理键盘事件的灵活方法背后的思路是不断地检查键盘,了解是否按下了任何感兴趣的按键,而不是静静地坐在那里,等待Windows最终向发送一个键盘消息。如果按下了键盘上的键,那么游戏就立即触发动作并有效地响应键盘。如果没有按下键,那么游戏引擎将继续运行而没有中断。避开标准的Windows方法,这最终会得到反映更加灵敏的键盘控制。43 跟踪鼠标在移动鼠标的时候,将会引发一系列事件,这些事件与键盘所引发的那些事件非常相似。实际上,Win32 API包括了一系列用来传递事件的鼠标消息,与键盘消息传递事件的方式相似,但Win32键盘消息不适合为游戏提供有效输入的任务。鼠标事件的内置Win32方法对游戏很适合。下面是用来向WIN32程序通报鼠标消息的。WM_MOUSEMOVE 任何鼠标移动WM_LBUTTONDOWN按下鼠标左键WM_LBUTTONUP释放鼠标左键WM_RBUTTONDOWN按下鼠标右键WM_RBUTTONUP释放鼠标右键WM_MBUTTONDOWN按下鼠标中间WM_MBUTTONUP释放鼠标中间 第一个鼠标消息是WM_MOUSEMOVE,只要移动了鼠标,这个鼠标消息就会让你知道。其他消息分别对应鼠标左键。右键和中键的单击。单击鼠标的一个按钮包括按下一个按钮,之后释放这个按钮。通过记录下和释放鼠标按钮的时间并查看这段时间内的鼠标移动,就可以实现鼠标拖动功能。对鼠标移动感兴趣还是对单击鼠标按钮感兴趣,鼠标的指针的位置都是鼠标的一个重要性质。前面所有鼠标消息都提供了鼠标指针的位置。传递给GameEngine:HandleEvent()方法的IParam参数中包括这一消息。44 向游戏引擎添加输入支持因为需要游戏引擎来完成与游戏管理有关的各种任务,所以将用户输入处理结合到游戏引擎中是很有意义的。当然,处理用户输入的某个方面是游戏所支持的,因此必须在每个单独游戏的代码中进行处理。不过键盘和鼠标处理存在一些通用的地方,可以将它们结合到游戏引擎中,从而简化特定游戏代码所需要完成的工作。一个游戏中提供GamePaint()函数来绘制游戏屏幕。虽然从技术上说,游戏引擎提供GamePaint()函数代码,但是它确保了无论何时需要游戏窗口都会调用它。使用消息处理键盘的标准Windows方法对于游戏来说是不够的,处理键盘输入的更好方法是反复检查键盘状态,查看是否有按下了特定的键,然后做出反应。使用这个策略,键盘输入处理的很多工作就转移给了游戏代码,这意味着游戏引擎主要是负责调用一个键盘处理函数,使游戏有机会响应按键。下面是这个函数的原形:Viod Handlekeys();Handlekeys()函数必须作为游戏代码的一部分提供,因为它不包含在游戏引擎之中。如果不希望游戏支持键盘输入,那么只需要使Handlekeys()为空即可。当然,游戏引擎必须确保以足够快的速度调用Handlekeys()函数,从而使游戏能够立即响应。这是在游戏引擎代码的WinMain()函数中实现的。下面是对这个函数所做的修改。If (iTickCount>iTickTrigger iTickTrigger=iTickCount+ GameEngine:Getengine ()->GetFrameDelay(); Handlekeys(); GameCycle();对WinMain()代码来说的唯一一处改动是对Handlekeys()函数的新调用。注意,这个调用刚好是在GameCycle()函数之前发生,着表示游戏在每个游戏周期之前都会获得响应键盘输入的机会。鼠标输入的处理仍然采用消息的方法。着并不是说鼠标比键盘消息更有效,而是很难注意到缓慢的鼠标输入。鼠标消息的速度非常快,足以准许你创建一个反映灵敏的鼠标窗口,而键盘消息则无法做到这一点。要想支持鼠标消息与这些鼠标处理函数联系起来,游戏引擎必须检查适当的鼠标消息并做出相应的响应。下面的代码包括了GameEngine:HandleEvent()方法的一部分内容,它负责处理传递主游戏窗口的鼠标消息。Case MW_LBUTTONDOWN: /处理按下鼠标左键事件 MouseButtonDown(LOWORD(IParam),H