视频游戏开发学习笔记(1)

(1)
实时的并发事件交互
实时的  快速相应
并发 同时发生  大量输入
事件    当发生一件事情时 如何处理 DX调用方法
 eg.滚动背景
交互    得到事件后 反馈给用户

如何编写一个支持并发事件
的应用程序?
能够在同时执行多行指令
理想情况下每个事件都会被分配一个CPU :-)
通常,只有一个CPU来处理所有的事件
所有的事件需要共享一个CPU
为每一个事件分配一小段CPU时间
玩家就认为所有的事件都是同时发生并处理的

游戏中的循环
需要重复若干步骤让游戏“动”起来
多长时间重复一次?
“循环”周期的长度影响着游戏的速度
每一个循环或反复称作一个“帧”

(2)
Direct X 名称空间
Microsoft.DirectX.AudioVideoPlayback
The AudioVideoPlaybackapplication programming interface (API) provides for basic playback and simple control of audio and video files.

Microsoft.DirectX.Direct3D
Microsoft Direct3D is a low-level graphics application programming interface (API) that enables you to manipulate visual models of 3-D objects and take advantage of hardware acceleration.

Microsoft.DirectX.DirectInput
Microsoft DirectInput is used to process data from a keyboard, mouse, joystick, or other game controller.

Microsoft.DirectX.DirectSound
Microsoft DirectSound provides a system to capture
sounds from input devices and play sounds through
various playback devices using advanced 3-D
positioning effects, and filters for echo, distortion,
reverberation, and other effects.

Microsoft.DirectX.PrivateImplementationDetails
The PrivateImplementationDetailsnamespace contains
structures and interfaces that allow the managed
application programming interface (API) to have access
to the unmanaged portions of the Microsoft DirectXAPI.

Microsoft.DirectX.Security
Controls permissions related to Microsoft Direct3D,
Microsoft DirectInput, Microsoft DirectPlay, and Microsoft
DirectSound.

(3)
二维图形技术
二维图形技术是基于2D数学模型的(文本,绘图,地
图等等)
2D图片可以沿X轴和Y轴移动

矢量绘图vs. 位图绘图(也成为光栅绘图)大
用于存储2D 图像的技术数量很多
采用矢量方式存储数据相对于位图存储最多可以压缩1/1000
采用矢量方式存储的图像可以任意放大缩小
大多数计算机能够显示位图图片

三维图形技术
三维图形技术使用的是3D的模型和对象
因为多了一个维度的信息,所以3D图形需要存储更多的数据
通常3D绘图更像进行雕塑,而2D绘图更像是绘画
3D图像可以任意在X,Y,Z三个轴自由移动
旋转也可以在三个轴上进行
这三个轴的旋转分别叫做倾斜(pitch),偏航( yaw), 滚动( roll)
3D运动中的旋转
倾斜Pitch – 绕X轴旋转
偏航Yaw –绕Y轴旋转
滚动Roll –绕Z轴旋转

矢量绘图法
存储诸如几何图形的信息,如:点,直线,多边形,曲线等等。
应用在文本和图表的效果非常好
可以轻松的放大缩小,并且可以非常精确的控制图像的大小和位置。
位图绘图法
图像在计算机的屏幕上表现为一个像素的表格
每一个像素的颜色都可以被表示为一个红绿蓝三种基本颜色不同比例的组合(RGB)
每一个基本颜色的亮度可以存储为一个字节,所以每个颜色都需要占用3个字节的存储空间(24位色)  +阿尔发通道(32位色)
颜色越丰富,需要的信息量就越大。
只有黑白两种颜色的图像需要的数据量最小,因为每个象素只需要一个二进制位(bit)表示。
图像的质量取决于图像的分辨率(总的像素数量)和颜色的色深(每个象素的信息量)
像素需要的数据位越多,颜色和颜色之间的过渡就越平滑
分辨率越高,图像的颗粒感越不明显。

位图绘图法
一个640x480图片包含307,200像素
一个1280x1024图片包含1,310,720像素
在24位的颜色模式下, 640x480需要921,600字节在48位色, 需要1,843,200字节
一个运行在1600x1200分辨率,32位色的高分辨率显示器的屏幕抓图将需要7,680,000字节.一幅图片大约7.6 MB
因为位图图片的空间占用太大,所以我们一般使用压缩的办法存储图片,代价是图片质量有所降低
我们可以找到很多的图片压缩格式,例如JPEG和PNG(可存阿尔发通道),他们的压缩比很大,而质量的降低几乎难以察觉

声音
非压缩格式
最常见的格式就是WAV,扩展名是.wav的文件
所有的计算机都能播放这种文件
WAV文件是对声音的忠实地记录
WAV文件是原始的,未经压缩的文件
这种文件提供极好的音质,但是却非常巨大
一个典型的例子,5分钟的歌曲,大约需要40 -
60 MB 的存储空间
非压缩格式
Musical Instrument Digital Interface (MIDI) 是另一种在游戏当中常用的格式
MIDI音乐一般通过在电子合成器上演奏或者录制制作而成
MIDI文件非常非常小
MIDI不包含任何“声音”信息
唯一包含的信息就是音乐是如何被制作出来的。
声卡根据这些信息转换成为你听到的声音
这样可以允许你第一次用钢琴演奏,然后再用吉他演奏同一首歌
压缩格式
MP3是一种非常流行的音频压缩格式
全称是MPEG-1/MPEG-2 Layer 3压缩比很高
压缩后的文件通常只有原文件的1/10 到1/12
压缩后的文件的音质比原来略有降低
音质的差别非常小,几乎难以察觉
压缩的方法就是忽略原来声音中人耳难以察觉的部分压缩格式

声音
3D 音效
这是一中全新的技术,被称为“3D声音定位”更为恰当
很像3D绘图,你可以听到来自3维空间的声音效果
这种技术可以让听众感觉到声音是来自身后还是来自身旁
大大加强了游戏的真实感
互动游戏音效
没有互动的音效是静态的,不跟随游戏的进展或级别而改变这样很容易让人厌烦
互动游戏音效随着你或者他人在游戏中做的事情而发生变化
比如当反面角色登场的时候,游戏音乐会变得紧张而急促
穿越地牢,前往黑暗之门或者匍匐前行的时候,音乐也会响起,就好像电影中一样

(4)
“世界”维度
在“世界”是什么样子的?
整个游戏发生的环境
是被定义了长度和宽度的矩形

视点
什么是视点
在“世界”的坐标系中要被显示的窗体
窗体定义显示区域
视点定义什么区域被显示
视点是显示窗口中的一个矩形区域
默认情况下,它是整个应用程序窗口
视点以像素为单位变化

位图
什么是位图
一张位图是由数千个像素组成
每个像素都有自己的位置和质量
像素质量包括颜色值、亮度等
RGB 亮度
显示器显示的颜色是由红、绿、蓝三种颜色组成
每个像素有一个由红、绿、蓝组成的值
基础颜色的亮度可以创造一个颜色
换句话说,颜色其它是由红、绿、蓝三种颜色变化亮度组成的

背景
什么是背景
背景是一张图片或位图,它将在“世界”中代替一个固定位置
游戏对象可以显示在背景的上层
位置
背景会在“世界”中被指定显示位置

“动画”
什么是“动画”
一系列图片,按照顺序播放,并在播放每张图片间有特定的延迟
每张图片(帧)有细微的不通
当我们连续播出的时候,就给人以动画的效果
当“动画”播完我们将如何做?
再次从第一帧开始播放
设置从特定的帧开始播放
保持最后一帧


什么是“帧”
帧就是一张简单的图片
图片是动画的一部分
动画是由每一帧组成的
当每一帧被顺序播放时,动画的感觉就产生了

帧和透明
一帧是由一张图片(位图)组成
图片是一个矩形或方形的点的矩阵,不是所有的图片都是矩形外形
在矩形中不被使用的区域,将被填充为透明
在播放中将忽略已经被设定为透明的像素
换句话说,透明的像素将不被重绘

精灵
精灵是显示在背景上层的画
也被称为游戏对象
通常,精灵表示游戏中所有运动的部分
精灵可以包括:
 敌人
 背景活动的部分
 子弹
精灵的状态是根据图片、位置、色值等变化的
因为如此,精灵需要存各种信息
 即时位置
 即时速度
 即时方向
 可见度
 帧
 动画

精灵活动性
精灵可以设定为活动或不活动
当精灵不活动时,所有的行为是失效和不可见的
不活动的精灵在游戏循环中不能执行操作
不活动的精灵在需要精灵原型时候经常被使用
精灵原型在运行时用于创造同样的精灵
精灵可视性
在每个游戏循环中,代码将处理所有的游戏对象
处理游戏对象包括运用和绘制
当精灵可见时,它将被运用和绘制
当精灵不可见时,它也可以被运用,但不被绘制
伴随着精灵创建过程,有一帧或多帧的动画将被显示出来
当精灵需要可见时,游戏对象需要一个视觉上真实的动画存在

ZOrder
为了让大家理解ZOrder,
我们必须先要模拟一个3D坐标系
Z轴表示深度
ZOrder值越大说明屏幕上面的对象越深
图片1的ZOrder 值比图片2的ZOrder值低,所以球形图片应显示在人物图片下方
因为是2D的应用程序,所以ZOrder只能影响图片显示的顺序不能影响图片的尺寸
所有的游戏对象都会受到ZOrder轴的影响

背景精灵
背景是指定的图片,并且需要两个相同的背景图片(精灵)
这是为了容易滚动
因为背景是一张图片,所以必须被作为精灵添加到游戏中

添加背景
在游戏中直观的表现精灵就是动画
一个动画由一帧或多帧组成
每一帧是由一张图片和一个延迟组成
一张图片是一个位图文件
所有的创建精灵的代码都将在
StarTrooperGame.cs文件中的StarTrooper类中执行

每张图片都是图片类对象用每张图片都是图片类对象用于存储位图
Picture background = new Picture("Background.bmp", Color.FromArgb(0, 255, 0));
第一个参数是位图名字,第二个参数是透明度
图片对象被添加到游戏中是为了作为帧使用的
Game.Add(background);
帧是使用图片的帧帧是使用图片的帧类的对象
Frame backGroundFrame = new Frame(background, 0);
第一个参数是图片对象,第二个参数是图片延迟
动画对象是由若干帧组成
Animation backGroundAnimation = new Animation();
每一帧添加到每一帧添加到动画对象中
backGroundAnimation.Add(backGroundFrame);
创建一个BackGround对象bg,Background类是由Spirte类派生的
把已经创建的动画对象添加到bg对象中
Background bg = new Background();
bg.Add(backGroundAnimation);
设设置精灵位置
bg.Position = new Point(320, 240);
涉及bg对象的宽和高
把bg对象的ZOrder属性设置为10
bg.ScaleX = 640.0f / background.Width;
bg.ScaleY = 480.0f / background.Height;
把精灵添加到游戏中
Game.Add(bg);
重复添加其它的精灵对象
Background bg2 = (Background)bg.Clone();
bg2.Position = new Point(320, -240);
bg2.ScaleX = 640.0f / background.Width;
bg2.ScaleY = 480.0f / background.Height;
bg2.ZOrder = 10;
Game.Add(bg2);
这时我们已经创建我们自己的精灵对象,并添加到了游戏中

添加骑兵
Picture trooper01 = new Picture("trooper01.bmp", Color.FromArgb(0, 255, 0));
Game.Add(trooper01);
Picture trooper02 = new Picture("trooper02.bmp", Color.FromArgb(0, 255, 0));
Game.Add(trooper02);
Picture trooper03 = new Picture("trooper03.bmp", Color.FromArgb(0, 255, 0));
Game.Add(trooper03);
Picture trooper04 = new Picture("trooper04.bmp", Color.FromArgb(0, 255, 0));
Game.Add(trooper04);
Picture trooper05 = new Picture("trooper05.bmp", Color.FromArgb(0, 255, 0));
Game.Add(trooper05);
Picture trooper06 = new Picture("trooper06.bmp", Color.FromArgb(0, 255, 0));
Game.Add(trooper06);
骑兵是动画,所以骑兵是动画,所以需要几张图片
每张图片被添加到游戏中
每张图片都将被作为一帧被创建
每张图片被用于每张图片被用于创造一帧
Frame afTrooper01 = new Frame(trooper01, 5);
Frame afTrooper02 = new Frame(trooper02, 5);
Frame afTrooper03 = new Frame(trooper03, 5);
Frame afTrooper04 = new Frame(trooper04, 5);
Frame afTrooper05 = new Frame(trooper05, 5);
Frame afTrooper06 = new Frame(trooper06, 5);
每帧都被添加到游戏中
Animation trooperAnimation = new Animation();
trooperAnimation.Add(afTrooper01);
trooperAnimation.Add(afTrooper02);
trooperAnimation.Add(afTrooper03);
trooperAnimation.Add(afTrooper04);
trooperAnimation.Add(afTrooper05);
trooperAnimation.Add(afTrooper06);
使动画可以循使动画可以循环播放
创建一个骑兵
添加这个动画
设置骑兵的位置
把骑兵添加到游戏,并且设置它的原型
trooperAnimation.Play();
trooperAnimation.Loop = true;
Trooper trooper = new Trooper();
trooper.Add(trooperAnimation);
trooper.Position = new Point(320, 450);
Game.Add(trooper);
Trooper = trooper;

添加秃鹰
秃鹰也是动画,它也秃鹰也是动画,它也是多图片的
象创建骑士一样,我们把每张图片添加到游戏中,并且为
动画创建一帧
Picture condor01 = new Picture("condor01.bmp", Color.FromArgb(0,255, 0));
Game.Add(condor01);
Picture condor02 = new Picture("condor02.bmp", Color.FromArgb(0,255, 0));
Game.Add(condor02);
Picture condor03 = new Picture("condor03.bmp", Color.FromArgb(0,255, 0));
Game.Add(condor03);
Picture condor04 = new Picture("condor04.bmp", Color.FromArgb(0,255, 0));
Game.Add(condor04);
使用每张图片创使用每张图片创建一帧
Frame afcondor01 = new Frame(condor01, 5);
Frame afcondor02 = new Frame(condor02, 5);
Frame afcondor03 = new Frame(condor03, 5);
Frame afcondor04 = new Frame(condor04, 5);
把每一帧添加到动画中
Animation condorAnimation = new Animation();
condorAnimation.Add(afcondor01);
condorAnimation.Add(afcondor02);
condorAnimation.Add(afcondor03);
condorAnimation.Add(afcondor04);
当游戏显示时,秃鹰是第二个动画,第二个动画与当游戏显示时,秃鹰是第二个动画,第二个动画与第一十
分相似
Picture condorExplosion01 = new Picture("condorExplosion01.bmp",
Color.FromArgb(0, 255,
0));
Game.Add(condorExplosion01);
Picture condorExplosion02 = new Picture("condorExplosion02.bmp",
Color.FromArgb(0, 255,
0));
Game.Add(condorExplosion02);
Picture condorExplosion03 = new Picture("condorExplosion03.bmp",
Color.FromArgb(0, 255,
0));
Game.Add(condorExplosion03);
使用每张图片创建一帧
Frame afcondorExplosion01 = new Frame(condorExplosion01, 4);
Frame afcondorExplosion02 = new Frame(condorExplosion02, 3);
Frame afcondorExplosion03 = new Frame(condorExplosion03, 4);
把每一帧添加到动画中
Animation condorExplosion = new Animation();
condorExplosion.Add(afcondorExplosion01);
condorExplosion.Add(afcondorExplosion02);
condorExplosion.Add(afcondorExplosion03);
condorExplosion.Play();
使动画不能循使动画不能循环播放
创建一个秃鹰
把两个动画添加到秃鹰对象
为秃鹰设定原型
condorExplosion.Play();
Condor condor = new Condor();
condor.Add(condorAnimation);
condor.Add(condorExplosion);
Condor = condor;

posted on 2006-02-14 11:14  小峰子  阅读(552)  评论(0编辑  收藏  举报

导航