游戏程序设计基础(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-23 14:40:01

点击下载

作者:杨长强,高莹

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

游戏程序设计基础

游戏程序设计基础试读:

前言

计算机相关专业的学生在学习游戏程序开发前,一般已经学习过数据结构、操作系统和面向对象程序开发等专业课程,有些学生还学过计算机图形学等课程,但没有游戏程序开发系统方面的知识。目前市场上适合本科教学的游戏开发教材匮乏。

本书从游戏开发的角度,以理论和实践相结合的方式,系统介绍了计算机游戏开发方法。目前市场上的计算机游戏主要分为二维游戏和三维游戏,针对这样的情况,教材内容安排如下:

第1章介绍了计算机游戏的相关概念和分类。

第2章~第7章讲解利用 Windows API函数完成二维游戏制作,内容包括 Windows程序窗口生成和消息机制,贴图,交互,碰撞等内容。

第8章~第13章讲解利用 Direct 3D进行三维游戏的制作,内容包括三维游戏的基本原理,Direct 3D的安装和初始化过程,Direct 3D图形绘制基础、变换、光照和纹理映射等。

第14章到第19章讲解 Unity进行游戏开发的方法。内容主要从初学者入门的角度去讲解 Unity游戏开发,无论有无编程经验都可以阅读本部分,从而快速掌握如何使用 Unity引擎制作 3D游戏。内容包括 Unity安装方法,Unity程序开发框架和编辑器的使用,资源和游戏对象,脚本程序和用户界面以及动画系统等。

本书有如下几个鲜明特点:

1.由浅入深

一般本科生在刚刚完成一、二年级的相关课程学习后,实际动手进行程序开发的能力还未形成,本教材充分考虑到这种普遍存在的情况,在二维游戏、Direct 3D 游戏开发和Unity游戏开发前,细致地进行了环境搭建的讲解。

2.内容全面

本教材全面介绍了 Windows二维游戏和三维游戏的开发方法,既讲解了利用 Windows API开发二维游戏,Direct 3D开发三维游戏这些底层游戏开发方法,也详细讲解了利用目前最流行的一款游戏引擎 Unity开发游戏的方法。

3.提供框架程序

在讲解二维游戏、Direct 3D游戏和 Unity游戏开发时,对于每一部分内容,首先详细介绍了框架程序的构建过程,以后的内容在框架程序的基础上完成,降低了学生的学习和开发难度。

4.理论讲解与实践密切结合

在每一章的讲解中,首先对相关理论进行介绍,然后详细讲解相关函数,最后在对应的程序框架内,利用本章学到的函数完成相关功能的演示。

由于本课程的独特的特点,教材没有安排课后习题,学生只需在程序框架内独立完成教材相关代码的演示,就能掌握相关章节内容。

本教材的教学讲义已在教学实践中使用,所有教学内容、案例均在教学实践中使用。全部内容的课堂教学 54学时,实验 20学时,综合实训 24学时。

本教材根据教学讲义改编而成,教学讲义编写过程中参考了大量游戏开发的书籍和资料,包括荣钦科技出版的《Visual C++游戏编程》教材,毛星云编写的《Windows游戏编程之从零开始》,《Unity 4.X从入门到精通》和《Unity开发网站》等,在此表示衷心感谢。

第1章 游戏程序设计概述

本章学习要求:

了解计算机游戏的相关概念、分类,游戏设计的要素及发展趋势。

1.1 计算机游戏的概念

游戏在英文中的单词是 Game,意译为“比赛、竞争、游戏”,通过非对抗性的、友好的体力与技巧比赛,使得游戏参与者在体力上得到锻炼,同时在精神上也得到了乐趣。因此游戏可以如下定义:游戏是具有特定行为模式、规则条件、身心娱乐和胜负判定的一种行为表示。

在游戏的定义中,行为模式表示游戏特定的流程模式,这种流程模式是贯穿整个游戏的行为,例如,猜拳游戏中包括剪刀、石头、布三种行为模式。规则条件是游戏参与者必须遵守的规则。身心娱乐是游戏所带来的娱乐性,是游戏的精华所在。一个没有输赢胜负的游戏,仿佛少了它存在的意义,因此可以说,胜负是所有游戏的最终目的。

随着计算机技术的发展,计算机参与进原本人与人之间的游戏,以计算机来代替原来必须由人来承担的角色,这样的游戏称为计算机游戏。可以从游戏技术,游戏内容和玩家角度三个方面体会计算机游戏的本质。

从游戏技术上看,计算机游戏是“以计算机系统为平台,通过人机互动形式实现的,能够体现当前计算机技术较高水平的一种新形式的娱乐方式”。计算机游戏的实现技术基础是计算机技术。

从游戏内容看,计算机游戏是一个让玩家追求某种目标,并且让玩家可以获得某种“胜利”体验的娱乐性文化产品。计算机游戏具有丰富而独特的表现力,能表现出许多鲜明生动的艺术形象,从这个意义上说,计算机游戏和戏剧、电影一样,是一种综合性艺术,并且是融合了技术的、更高层次的综合艺术。有人把计算机游戏称为继绘画、雕刻、建筑、音乐、诗歌(文学)、舞蹈、戏剧、电影(影视艺术)之后的人类历史上的第 9种艺术。计算机游戏的艺术性体现在世界观、剧情、人物、规则上,再加上表现这些的媒体(音乐和画面)。计算机游戏建构了一个虚拟的世界,游戏的创作人员要使得这个虚拟的世界具有“价值”,才能被玩家接受,因此要创作出这个世界中的历史、各种力量和它们的均衡、善恶准则,甚至要创作出具有特定人文特色的风俗习惯等,然后再在这个虚拟世界中加入玩家的角色,制定好相关的游戏规则。

从玩家角度看,计算机游戏能够提供其他艺术形式无法提供或无法满足的内容。例如,可以为玩家提供挑战的机会和场所;由于计算机游戏具有虚拟的社会性,可以给玩家提供与朋友进行交流的机会;提供玩家独处的经历;提供满足感;提供情感的体验;提供幻想等。

1.2 计算机游戏的分类

1.2.1 角色扮演游戏

RPG(Role-Playing Game,角色扮演游戏)通常以科幻故事或历史题材为背景来构造完整的故事情节,玩家在游戏中扮演一个或多个人物,通过练级或发展剧情来完成游戏。目前流行的 RPG分为回合制和即时制,回合制游戏注意剧情推动游戏进程,强调故事性,代表作有《仙剑奇侠传》、《最终幻想》等;即时制游戏的规则性强,故事会带有奇幻色彩,代表作有《暗黑破坏神》。

RPG强调对人生的模拟,如果说飞行模拟类、体育类、动作类等类型的游戏都是对现有的某项人类活动的再现与模拟的话,那么 RPG 体现的则是对整个人生的模拟,因此 RPG所构造的情感世界是所有类型的游戏中最为强大的,能带给我们深刻的体验感,这种体验感来源于每个人内心深处对人生的感悟和迷茫、无奈与苛求、失意与希望,这些体验可以在 RPG所构造的虚拟人生的情感世界中得到共鸣。

RPG 可以用一个三维坐标系统来定位,如图 1-1所示。构成 RPG 的艺术性、故事性和交互性三大特性分别构成该坐标系的三个轴,若把每个坐标轴的最大坐标值定为 1,那么坐标点(0,0,1)代表纯粹的艺术作品,如视觉艺术和音乐作品等;(1,0,0)点代表完全的操作性活动,如体育运动;(0,1,0)点则代表故事情节及其纯线性的展现和播放,如电影剧本、VCD和录像带。而 RPG则位于点(x,y,z),其中 0<x﹤1,0﹤y﹤1,0﹤z﹤1。而不同类型的 RPG,在这个三维空间所处坐标不同。偏重交互性的,其 x值较大;偏重故事性的,其 y值较大。需要指出的是:x,y,z的值都不能为 0,因为构成 RPG 的三大特性缺一不可。图1-1 RPG游戏定位

在艺术性方面,RPG借助于多媒体视听技术,综合利用了美术、动画、音乐、音效、文学、戏剧等多种艺术娱乐表达形式。在故事性方面,RPG和电影的关系密切,其“情节”是由“剧本”严格限定的,也就是单线发展的。与被动欣赏的电影不同的是 RPG给游戏者提供了与游戏交互的能力,玩家在游戏中有一定的主动性,但这种主动性改变不了原本设定的故事情节,RPG模型一般由各个事件顺序链接而成,在每个事件中玩家具有交互能力。1.2.2 动作类游戏

ACT(Action Game,动作类游戏)最初是家用游戏机上最流行的游戏类型,游戏画面以横卷轴方式展开,玩家要从左向右一关一关地闯过去,最终打倒大魔头。

目前流行的动作游戏通常为第一视角类游戏,该类游戏中,角色对手都被武装起来,游戏通过角色视觉变化发展。动作游戏通常有多个玩家同时在线,游戏对手往往是人控制,而不是计算机操作的,想在游戏中获胜需要快速的反应、良好的手眼协调能力,并且要熟悉游戏中的武器装备。也有一些动作游戏是按照第三视角完成的,玩家可以看到自己的游戏角色以及游戏角色所处的虚拟世界。

ACT的代表作包括《超级玛丽》,目前三维 ACT游戏典型的例子为《古墓丽影》系列。1.2.3 实时策略游戏

在 RTS(Real-Time Strategy Game,实时策略游戏)中,游戏双方往往都是人,实时是指游戏一方在生产、制造和布阵的同时,另一方也在进行各种操作。当一方停下来的时候,敌方不会停下来,这样双方时刻在进行生产和制造的竞争,使得游戏更加紧张刺激。策略从广义角度讲是通过资源采集、生产、后勤、开拓和战争来振兴本种族或国家,战胜其他种族或国家;从狭义角度讲是指用来击败敌人的各种军事指挥手段。许多计算机技术的出现是从 RTS中提出来的,比如寻径算法、人工智能、指令序列等,这些技术后来又被应用到其他类型的游戏中。

大多数 RTS 的游戏规则都遵循“采集—生产—进攻”三部曲原则。即通过对几种资源的采集和利用,来构建基地或城市,生产武器,组建军队,然后向敌方发起进攻。RTS 最重要的两个要素是资源管理和狭义的战争策略。

RTS代表作包括“星际争霸”(Starcraft),“魔兽争霸”(Warcraft)和“帝国时代”(Age of Empires)。1.2.4 第一视觉射击游戏

FPS(First-Person Shooter,第一视觉射击游戏)起源于早期苹果机上的迷宫游戏和游戏机上的 ACT,通过引入第一视角和三维图形使得游戏的表现力得到极大提高。首先是置入感的提高:三维世界和第一视角的应用使得玩家第一次能够感到他们“面对”着一个真实的三维世界。其次是交互性的提高:三维地图使得玩家们摆脱了 ACT由一个路线前进的限制,玩家可以沿多种路径到达终点,更增加了搜索前行的乐趣和不确定性。NPC(Non-Player Character)概念的提出使得玩家所要面对的对手有了一定的智能和适应性,不再是像 ACT中的敌人那样定点定时出现。

FPS的要素有以下三点:(1)三维关卡(3D Level):关卡这个要素是从 ACT 游戏中继承的。整个游戏由一系列关卡组成。每个关卡有自己独特的三维场景。(2)任务(Mission):任务就是玩家在一个关卡里要完成的使命和要达到的目的。不管是夺取旗子也好,还是安置炸弹也好,达到这个目的才能通过这一关,进入下一关。任务可以是相互嵌套的,比如一个主任务的完成需要先完成几个子任务。(3)NPC:NPC 是具有一定智能和适应性的,不是由玩家来控制的敌方或者友方。游戏业人工智能技术的应用最初就是从 NPC 上发展起来的。NPC 要阻碍(敌方)或者帮助(友方)玩家完成任务。《Quake》(雷神之锤)系列和《Unreal》(虚幻)系列是 FPS 的代表作,《Half-Life》被认为是 FPS 的突破性作品。

目前 FPS 的发展趋势是:第一,提高 NPC 的人工智能,引入小组机制,使得 FPS 不仅仅是疯狂扫射和冲锋,而有了战术配合。第二,被 FPS长期忽视的故事性也越来越得到强化。第三,联网对战使得 FPS 更加刺激。受到空前好评的《Half-life》(半条命)就代表了这三种趋势。1.2.5 模拟游戏

SIM(Simulation Game,模拟游戏)包括策略模拟类游戏,如《三国志》系列,恋爱模拟类游戏,如《心跳回忆》系列。模拟类游戏的共有特征是复杂的数字式管理,如在《三国志》中的各城市各武将的数值,在《心跳回忆》中有各种各样表达人物状态的数字,因此模拟游戏实际上是用一个非常粗糙的数学模型和数字式管理来实现的。1.2.6 体育类游戏

SRT(Sports Game,体育类游戏)涵盖三个层次:管理、战术、技能。技能方面指单纯的模拟某项运动,比如赛车游戏;战术是指足球的团队配合和排兵布阵等;管理,包括俱乐部的管理和球员的培训。这类游戏有《FIFA》系列足球游戏。

以上介绍的几种游戏类型的划分并不严格,因为游戏制作时会根据实际需求运用各种技术,游戏类型的分类是一种习惯和约定俗成,其实用性大于理论性,游戏类型的主要作用是有利于业界人士之间和业界和玩家之间的沟通。

1.3 设计游戏的要素

游戏设计包括四个要素,即策划、程序、美术和音乐。1.3.1 策划

游戏策划制定出整个游戏的规划、流程与系统。策划人员必须编写出一系列的策划书供其他游戏参与人员阅读。通常,策划人员所要做的工作可以归纳为下列几点:(1)游戏规划:游戏制作前的资料收集与环境规划。(2)架构设计:设计游戏的主要架构、系统与主题定义。(3)流程控制:绘制游戏流程与控制进度规划。(4)脚本制作:编写故事脚本。(5)人物设置:设置人物属性及特性。(6)剧情导入:把故事剧情导入引擎中。(7)场景分配:场景规划与分配。1.3.2 程序

程序是实现游戏的载体,在策划书中的内容必须利用程序来加以组合成形。程序由框架师和程序员完成,框架师必须了解策划人员的构想计划,根据他们的想法与理念,将设计转化成实际游戏,框架师还要具备拆解策划书的能力,将分解出来的游戏功能分配给程序员编写,在程序员完成相关代码后,将各个代码正确应用到系统中,以达到策划人员所要求的画面或功能。

程序设计人员所要做的工作,可以归纳为下列几点:(1)编写游戏功能:编写策划书上的各类游戏功能,包括编写各种编辑器工具。(2)游戏引擎制作:制作游戏核心,而核心程序足以应付游戏中发生的所有事件及图形管理。(3)合并程序代码:将分散编写的程序代码加以结合。(4)程序代码除错:在游戏的制作后期,程序人员可以开始处理错误程序代码,及重复进行侦错的动作。1.3.3 美术

对于玩家而言,最直接接触他们的就是游戏中的画面,在玩家尚未真正操作游戏的时候,可能会先被游戏中的绚丽画面所吸引,进而去玩这款游戏,因此优秀的美术人员是非常重要的。美术人员所要做的工作,我们可以将它归纳为下列几点:(1)人物设计:不论是 2D 还是 3D 的游戏,美术人员必须根据策划人员所规划的设置,设计与绘制游戏中所有需要的登场人物。(2)场景绘制:在 2D 游戏中,美术人员要一张张地画出游戏所需要的场景图案;在3D 游戏中,美术人员必须绘制出场景中所有必须要使用到的场景对象,以提供给地图编辑人员使用。(3)界面绘制:除了游戏场景与人物之外,还有一种经常在游戏中所看见的画面,那就是使用界面。这种用户界面就是让玩家可以与游戏引擎做直接沟通的画面。美术人员要把亲和性与方便性作为设计用户界面的原则。(4)动画制作:游戏中少不了会有几个串场的动画,美术人员会根据策划书的需求制作出音效十足的动画。1.3.4 音乐

音乐的衬托能够增强游戏的娱乐性,音乐制作人员需要根据具体的场景和情节做出游戏中所需要用到的音效与相关的背景音乐。

1.4 计算机游戏的发展趋势

计算机游戏的发展与计算机技术的发展密不可分,主要依托虚拟现实、人工智能、计算机图形学、计算机视觉和交互技术等学科的发展。

从玩家的角度来看,计算机游戏的发展主要归纳为以下三个方面。1.4.1 沉浸感

所谓沉浸感,就是沉浸在计算机构建的虚拟环境中。为了使玩家获得这种感觉,首先要在计算机中构建并渲染出与现实世界尽可能相同的环境,另外尽量减少现实世界对玩家的干扰。1.4.2 交互性

游戏作为一种娱乐形式,第一要实现置入感,构建一个虚拟的游戏世界;第二要提供交互性,使得玩家可以和这个虚拟的游戏世界进行交流。交互性体现在两方面:交互手段、交互的可能反应。我们用一个简单的例子来说明这两个概念。

假定在一个游戏中,游戏人物需要从山崖上摘一朵花献给自己的女友。首先我们遇到的问题是如何让玩家操纵游戏人物去摘花。可以有以下 4种设计方案。

最简单的一种设计:当玩家操纵游戏人物走到距花朵的一段距离内时,弹出一个窗口,显示提示“花朵在附近,是否摘下?”,提示下方有“是”和“否”两个按钮。玩家可以在“是”的按钮上点一下以摘下花朵。

复杂一点的设计,可以让玩家操纵游戏人物移动到花的旁边,然后改变屏幕光标的形状,改成手的形状,同时显示一个信息条:“在花朵上按鼠标按钮即可将其摘下!”这时候,玩家按一下鼠标,花朵被摘下来了。

更复杂的设计,是类似于《黑与白》中的姿势识别与控制系统:玩家所控制的人物走到花朵的旁边,玩家移动鼠标使得屏幕光标位于花朵上方,这时屏幕光标改变成一只张开的手的形状,当玩家在花朵上按下鼠标按键后,屏幕光标显示一只收拢的手的形状,玩家必须按住鼠标按键不松开,拖动光标到主角的身上,然后松开。这样,屏幕上才会显示信息:“花朵被摘下。”同时,屏幕光标的形状恢复到张开手的形状。

最复杂的设计,从玩家角度讲又是最简单的设计,是采用 VR 系统:玩家头戴头盔式显示器,手戴触感手套,眼前是一个全三维的虚拟世界,当他“走”到花朵旁边时,他向花朵伸出了手,握住了花枝,将其拔起。

上面所列举的四种设计方案,实际上是四种不同的交互手段。第一种是标准的菜单选择式的交互,简单而又乏味;第二种是使用图标和对图标的直接操纵进行交互,有了一定的变化(时态性);第三种是在第二种基础上引入连续时间的概念,使得操作更复杂,含义更丰富;而第四种则是使用 VR 系统来最大限度地模拟我们在真实世界中的交互,对玩家来说最直观简单。

当玩家在使用一定的交互手段进行输入时限制越少,效果越真,则交互性越强。仍以摘花为例:

在玩家摘花之前,对可摘之花有何限制?是否只有那样特定的一朵花是可以摘的?还是游戏中所有的花都可以摘?显然后者给玩家的自由度更大,更近似于真实世界,需要构建的游戏世界也更宏大,游戏世界的驱动规则也更复杂。

当玩家摘花之后,以何种形态去反映摘花这个事件的效果,早期二维 RPG游戏中,屏幕上不能做出复杂的变化,最多就是在物品菜单里面显示一下。三维游戏中,可以用三维动画显示花朵被摘下的过程;而使用 VR 系统,则可以从玩家的视角显示花朵被摘下的过程,更为真切;而更登峰造极的,是可以利用电子香味发生器,当玩家把花摘下移近鼻子的时候,散发出更浓烈的香味。显然上面所列举的几种效果一种比一种更真实生动。1.4.3 国际化

沉浸感和交互性讲的是技术方面的趋势,而国际化讲的是游戏开发中文化方面的内容。近几年来,可以明显感受到的一个趋势是游戏设计更趋国际化了,在游戏设计时往往需要对相关国家的历史传统和文化习俗做深入的了解。

思考题

1.计算机游戏的分类有哪几种?

2.试举例说明计算机游戏交互设计的方法。

第2章 Win32应用程序

本章学习要求:

掌握 Win32应用程序的建立过程,重点和难点是窗口建立过程和消息机制的原理。另外需要对框架程序充分熟悉,以利于以后各章的学习。

计算机游戏虽然是计算机应用程序的一种,但与编写其他软件有很大的区别,更加强调计算机图形学的知识和计算机资源的高效利用。在 Windows平台上进行游戏开发(包含利用游戏引擎),通常采用 C++编程语言结合 Windows API函数和图形开发库完成。这是因为一款成功的游戏必须具有流畅的用户体验,游戏程序需要进行大量的图形绘制,所以开发游戏程序时,最需要关注的地方就是程序的执行效率。C++执行效率高,在 Windows系统中能够利用 Windows API 函数,再配上能直接与显卡打交道的图形库(Direct X 和OpenGL),所以 C++是 Windows游戏程序的最佳选择。

本教材选用的 C++编译环境是 Visual Studio 2010,其创建 Windows应用程序的方式有 3中,分别为使用 Windows API的方式、MFC方式和 Windows Forms方式。其中MFC方式和 Windows Forms方式已构建出相应 Windows程序框架,这些框架中包括了我们游戏程序用不到的一些资源,必然影响游戏程序的运行效率。另外,直接使用这些框架也不利于教学中对 Windows程序运行机制的理解,所以本教材利用 Windows API方式进行游戏开发。

Windows API 就是 Windows应用程序接口(Windows Application Interface),是针对Windows 操作系统家族的系统编程接口,其中 32 位 Windows 操作系统的编程接口称为Win32 API,这些函数是 Windows提供给应用程序与操作系统的接口,利用这些接口函数可以构建出界面丰富、功能灵活的应用程序。API函数是构筑整个 Windows框架的基石,API函数下面是 Windows的操作系统核心,上面则是 Windows应用程序。

2.1 Visual Studio 2010中Win32应用程序创建过程

本教材游戏程序框架为 Win32应用程序,其创建过程如下:

首先启动 Visual Studio 2010,得到如图 2-1所示的 Visual Studio启动界面,在图 2-1中单击【New Project】选项,即可进入如图 2-2所示界面。图2-1 Visual Studio启动界面

在图 2-2中单击【Empty Project】选项,并在 Name栏输入项目名称,单击确定即可进入如图 2-3所示界面,即 Win32工程界面。图2-2 创建空的 Win32项目图2-3 Win32工程界面

在创建的 Win32工程中,单击【Project】→【Add New Item】选项,进入如图 2-4所示对话框。图2-4 向工程添加项目对话框

在图 2-4中选择 C++文件,并输入文件名称,然后将该文件加入到工程中。在创建的C++文件中输入框架代码,并运行,即得到如图 2-5与图 2-6所示的结果。图2-5 游戏框架代码图2-6 游戏框架运行结果

2.2 Windows主函数

基于 Win32的 Windows应用程序默认入口函数是 WinMain(),在该函数中主要完成两项工作:一项是设计并创建窗口,另一项工作是建立消息循环。这两项工作分别在 2.3 与2.4节详细介绍,WinMain()的函数原型为:

参数:

■第1个参数为 HINSTANCE类型的 hInstance,表示应用程序当前实例的句柄。

■第2个参数为 HINSTANCE类型的 hPrevInstance,表示应用程序上一个实例的句柄,对于基于 Win32的程序,该参数为空。

■第3个参数为 LPSTR类型的 lpCmdLine,在命令行程序中使用,指向一个以空来结尾的字符串,不包含程序名。

■第4个参数为 int类型的 nCmdShow,该参数指定窗口如何显示,参数可以是下列值,见表 2-1。表2-1 nCmdShow参数的值

返回值:

如果函数成功,且当收到 WM_PAINT 消息时终止,它应该返回一个包含在消息的wParam参数中的 exit值。如果函数在进入消息循环前终止,应该返回 0。

2.3 窗口建立过程

建立窗口过程主要分为以下四个步骤:1.设计窗口类,2.注册窗口类,3.创建窗口,4.显示及刷新窗口。

1.设计窗口类

设计窗口类的过程即定义一个 WNDCLASS对象,该对象是一个结构体,其中各个成员表示出要设计窗口的属性,WNDCLASS具体结构及成员变量的含义如下:

2.注册窗口类

在定义了一个 WNDCLASS对象并给其成员赋值后,使用 RegisterClass函数来注册,注册的目的是使系统获得设计好的窗口类的信息,以便由 CreateWindow使用。RegisterClass函数的原型为:

参数:lpWndClass为 WNDCLASS结构的指针,在导入前必须已赋值。

返回值:如果函数成功,返回值为一个原子值,该值唯一地标志注册的类,原子值ATOM其实就是一个 Word,有一个 ATOM 表指向一个该表中一个字符串的引用。如果失败,返回 0。可以调用 GetLastError值看错误信息。(注:现在常用 WNDCLASSEX结构和 RegisterClassEx来设计和注册窗口类。)

3.创建窗口

创建窗口的函数为 CreateWindow(),该函数原型如下:

CreateWindow()的部分参数说明如下:

■ 第1个参数为 LPCTSTR类型的 lpClassName,指向已注册的窗口类名。

■ 第2个参数为 LPCTSTR类型的 lpWindowName,为指向窗口名字的指针。

■ 第3个参数为 DWORD类型的 dwStyle,给定了创建的窗口风格,具体参数选择参考 MSDN。

■ 第8个参数为 HWND类型的 hWndParent,给出了该窗口父窗口的句柄。

■ 第9个参数为指向 Menu的指针 hMenu,或者指定一个子窗口标志的标志。

■ 第10个参数为 HANDLE类型的 hInstance,为和窗口相关的模块实例的句柄。

■ 第11个参数为 lpParam,该参数在 WM_CREAT消息中传递,通过 CREATSTRUCT结构传给窗口的值的指针。

返回值:如果成功,返回一个新窗口的句柄。如果失败,返回 NULL。在返回之前,该函数发送一个 WM_CREATE消息给 Windows进程。

4.显示及刷新窗口

窗口对象创建完成后,需要调用 ShowWindow()将窗口从屏幕上显示出来,该函数原型为:

参数:

■ 第1个参数为 HWND类型,为窗口句柄。

■ 第2个参数指明窗口的显示风格。

UpdateWindow(HWND hwnd)可以给系统发送 WM_PAINT消息,从而完成窗口用户区的刷新。

2.4 Windows消息循环

在显示窗口以后,要对该窗口内的消息进行分发和处理,消息 MSG 为一个结构体,包含了来自一个进程的消息队列中的消息,该数据类型如下所示:

GetMessage()从调用线程消息队列中读取消息,并把它放在指定的消息结构体中,其函数原型为:

GetMessage()的部分参数说明如下:

■ 第 1个参数为 LPMSG类型,指向消息结构体。

■ 第 2个参数为窗口句柄,消息即从该窗口中获取。其中 NULL表示从属于该进程的所有窗口中和通过调用 PostThreadMessage传递给的进程中获取消息。

■ 第 3个参数为最小的消息。

■ 第 4个参数为最大的消息。

返回值:如果函数得到一个非 WM_QUIT消息,返回值非0;如果是 WM_PAINT,返回0;如果出错,返回-1。

TranslateMessage()函数用来翻译消息,其原型如下:

参数 lpMsg为一个 MSG指针。

该函数把虚键值翻译成字符消息,字符消息被发送给调用进程的消息队列,当进程下一次调用 GetMessage或者 PeekMessage函数时被读出。

返回值:如果消息被翻译(即字符消息被传给进程消息队列),返回非 0;或者如果消息是 WM_KEYDOWN,WM_KEYUP,WM_SYSKEYDOWN,WM_SYSKEYUP时,不管翻译情况,都返回非 0;如果没有翻译,返回 0。

DispatchMessage()函数把消息分发给窗口进程,其函数原型如下:

参数为指向 MSG结构的指针。

返回值为窗口进程返回的值,经常被忽略。

2.5 窗口过程函数

窗口消息处理函数是回调函数,被 Windows系统所调用的,函数的名称在设计窗口类时指定,对应的语言为:wndClass.lpfnWndProc=WndProc;其函数形式如下:

参数说明如下:

■ 第 1个参数 HWND类型的为窗口句柄。

■ 第 2个参数指定消息。

■ 第 3个参数为 WPARAM类型的 wParam,指定消息的内容。

■ 第 4个参数为 LPARAM类型的 lParam,指定消息的内容。

返回值:消息处理的结果,取决于所发送的消息。

消息处理函数的最后必须调用 DefWindowProc,这是 Windows内部默认的消息处理函数。另外要有 WM_DESTROY消息的处理过程。

2.6 Win32应用程序示例

2.7 游戏程序框架

为了更简洁地展示程序框架,并且更好地进行相关学习,本节将对 Win32应用程序重新组织,主要改变如下方面:(1)将窗口形式定义和窗口注册的相关代码放到 MyWindowsClass()函数中。(2)将窗口的产生和显示的相关代码放到 InitInstance()函数中。(3)将窗口内容的绘制放到 MyDraw()函数中。(4)增加了播放音乐的相关代码。音乐的播放利用 PlaySound()函数完成。

具体代码如下,与本书配套的程序集中也有该程序。

思考题

1.试举例说明 Windows程序窗口的建立过程。

2.试举例说明 Windows程序消息机制和消息相应函数的建立过程。

第3章 Windows绘图函数

本章学习要求:

本章介绍了 GDI绘图的相关概念,重点是画笔、画刷和文字等 GDI绘图对象和相关的绘图函数。本章的难点是 GDI坐标系的相关概念及坐标系间的映射。

3.1 屏幕绘图的相关概念

GDI(Graphic Device Interface)意为“图形设备接口”。Windows的架构不允许使用者直接存取 VGA 显卡上的内存,所以在 MFC 中提供了图形设备接口类,用来让使用者显示数据。GDI中包含了 CBitmap、CBrush、CFont、CPallete、CPen、CRgn等绘图类,并提供了这些类的绘图函数。GDI 中各种绘图类是从 CGdiObject 继承而来的,而这些类必须配合设备上下文 DC(Device Context)来使用。可以将 DC想象成一个图形绘制的区域。当要在屏幕上绘图时,应用程序就必须先取得“屏幕的 DC”才可以进行绘图,当使用者要操作其窗口绘图时,就必须先取得“操作窗口的 DC”,接着再把要绘制的图形放到各个 DC中,这时在该 DC所代表的区域中,就会显示所绘制的图形了。在 Windows应用程序中,每个窗口都关联有 DC,只要获取到窗口的设备上下文,就可以在窗口中绘制各种图形图像等信息。3.1.1 窗口和视口

窗口指的是 DC中用于绘图的矩形区域,而视口指的是在屏幕上看到的视图客户区域。在 Windows中绘制图形时,并不是把图形直接绘制到屏幕上,而是首先在 DC中建立逻辑坐标系,将图形绘制到逻辑坐标系的窗口中,然后再将这个窗口中的内容映像到绘图设备对应的视口中。如果是映像到屏幕上就实现了图形的显示,如果是映像到打印机等输出设备上就实现了图形的打印输出。

窗口原点、视口原点和坐标系中的原点三者的概念是不同的。窗口原点和视口原点指的是同一点在窗口逻辑坐标和视口设备坐标系的坐标值,它决定了图形由窗口映射到视口时的相对位置。3.1.2 GDI 坐标系

1.逻辑坐标系和设备坐标系

Windows坐标系分为逻辑坐标系和设备坐标系两种,GDI支持这两种坐标系。逻辑坐标系是面向 DC的坐标系,它不考虑具体的设备类型,在绘图时,Windows会根据当前设置的映射模式将逻辑坐标转换为设备坐标。设备坐标系是面向物理设备的坐标系,坐标以像素或设备所能表示的最小长度单位为单位,X 轴方向向右,Y 轴方向向下。设备坐标系可以改变其设置方式,所以原点位置(0,0)不限定在设备显示区域的左上角。

一般而言,GDI 的文本和图形输出函数使用逻辑坐标,而在客户区移动或按下鼠标的鼠标位置是采用设备坐标。设备坐标系分为屏幕坐标系、窗口坐标系和客户区坐标系三种相互独立的坐标系。

屏幕坐标系以屏幕左上角为原点,一些与整个屏幕有关的函数均采用屏幕坐标,如:GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。弹出式菜单使用的也是屏幕坐标。

窗口坐标系以窗口左上角为坐标原点,它包括窗口标题栏、菜单栏和工具栏等范围。(注意:这里的窗口坐标系指的是一个应用程序对应的窗口,而不是用户坐标系中用来显示时对应的矩形窗口。)

客户区坐标系以窗口客户区左上角为原点,主要用于客户区的绘图输出和窗口消息的处理。鼠标消息的坐标参数使用客户区坐标,CDC类绘图成员函数使用与客户区坐标对应的逻辑坐标。

2.逻辑坐标向设备坐标的映射

映射方式定义了 Windows如何将 GDI函数中指定的逻辑坐标映射为设备坐标。习惯上将逻辑坐标所在的坐标系称为窗口,将设备坐标所在的坐标系称为视口。“窗口”使用逻辑坐标,单位可以是像素、毫米等,视口使用设备坐标,单位是像素。

CDC 中 SetMapMode()函数设置设备环境的映射方式,映射方式定义了将逻辑单位转换为设备单位的度量单位,并定义了设备的 X、Y轴的方向。该函数的原型为:

参数 nMapMode指定映射方式,可以取下面列出的一个值:

● MM_ANISOTROPIC:逻辑单位转换成具有任意比例轴的任意单位,用SetWindowExtEx和 SetViewportExtEx函数可指定单位、方向和比例。

● MM_HIENGLISH:每个逻辑单位转换为 0.001英寸,X的正方面向右,Y的正方向向上。

● MM_HIMETRIC:每个逻辑单位转换为 0.01毫米,X的正方向向右,Y的正方向向上。

● MM_ISOTROPIC:逻辑单位转换成具有均等比例轴的任意单位,即沿 X轴的一个单位等于沿 Y 轴的一个单位,用和函数可以指定该轴的单位和方向。图形设备界面(GDI)需要进行调整,以保证 X 和 Y 的单位保持相同大小(当设置窗口范围时,视口将被调整以达到单位大小相同)。

● MM_LOENGLISH:每个逻辑单位转换为 0.1英寸,X正方向向右,Y正方向向上。

● MM_LOMETRIC:每个逻辑单位转换为 0.1毫米,X正方向向右,Y正方向向上。

● MM_TEXT:每个逻辑单位转换为一个图素,X正方向向右,Y正方向向下。

● MM_TWIPS;每个逻辑单位转换为打印点的 1/20(即 1/1400英寸),X正方向向右,Y方向向上。

● MM_TEXT 是默认的映射方式,这时应用程序以设备像素为单位来工作,像素的大小根据设备不同而不同。MM_HIENLISH、MM_HIMETRIC、MM_LOENGLISH、MM_LOMETRIC和 MM_TWIPS方式对必须用物理意义单位(如英寸或毫米)制图的应用程序是非常有用的。MM_ISOTROPIC 方式保证了 1:1 的纵横比。MM_ANISOTROPIC方式允许对 X和 Y坐标分别进行调整。

3.自定义坐标原点

在 DC中设定窗口坐标系原点的函数为 SetWindowOrg(),其原型为:

参数 x,y,point指定窗口中坐标系原点的位置,这些参数取值在逻辑坐标系内,且必须在设备坐标系范围内。

返回值为 CPoint对象,是窗口初始位置的前一次取值(逻辑单位)。

在设备坐标系中也可以调整坐标原点的位置,对应的函数为:

参数 x,y,point指定视口中坐标系原点的位置,这些参数取值在设备坐标系内,且必须在设备坐标系范围内。

4.自定义坐标轴方向和单位

当映射方式为 MM_ANISOTROPIC或者 MM_ISOTROPIC时,可以改变坐标轴的方向和比例,具体的方法如下:

● SetWindowExt(int Lwidth,int Lheight)的参数的单位为逻辑单位(Logical),SetViewportExt(int Pwidth,int Pheight)的参数的单位为像素(Pixel)。

● 将 Pwidth/Lwidth就可以得到绘图时 x方向一个逻辑单位对应的像素数,同理 Pheight/Lheight可以得到绘图时 y方向一个逻辑单位对应的像素数。

● 当 Pwidth/Lwidth为负数时,表示逻辑坐标系与设备坐标系 x方向相反;当 Pheight/Lheight为负数时,表示逻辑坐标系与设备坐标系 y方向相反。

示例:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载