(5)
变换
平移
旋转
缩放
平移
通过重绘的方式对一个精灵进行平移变换
简而言之,是从一个坐标延直线移动到另一个坐标位置
tx 和ty 分别叫做沿着x轴和y轴的移动距离
T(tx, ty) 叫作平移向量
旋转
沿着圆形路径转动
定一个旋转变换需要:
– 角度
– 重心点(旋转的参考点)
– 旋转轴(在二维平面中垂直x轴、y轴组成的平面的轴—z轴)
– 顺时针还是逆时针
注意,正旋转的角度是逆时针方向的转角,反旋转的角度
是顺时针方向的转角。
缩放
缩放改变其尺寸
2维空间中需要sx 和sy
分别表示x轴和y轴方向上的比例
将x、y两个轴向分别乘以缩放比例就得到了缩放结果
例如, 如果有一个向量(x,y),如下的方法得到缩放结果:
x’ = sx * x
y’ = sy * y
如果sx = sy , 即是等比放缩
矩形碰撞
每一帧都是一个矩形图片
精灵的边缘是矩形的
通过计算两个精灵边缘(矩形)的相对
位置,可以判断出他们是否发生碰撞
检测碰撞或交叉
第一个矩形的边缘: L=1, R=3, T=3, B=1
第二个矩形的边缘: L’=2, R’=4, T’=4, B’=2
得到如下结果:
Max(L,L’)=Max(1,2)=2
Min(R,R’)=Min(3,4)=3
Max(B,B’)=Max(1,2)=2
Min(T,T’)=Min(3,4)=3
计算边界交叉:
– Max(Max(L,L’)-Min(R,R’), Max(B,B’)-Min(T,T’)) <= 0
– Max(2-3, 2-3)) <= 0
– Max(-1,-1) = -1
– -1 <= 0, 因此发生了交叉
这两个矩形边界交叉后
形成了新的矩形: L=2,
R=3, T=3, B=2
检测碰撞或交叉
第一个矩形的边缘: L=1.2, R=2.8, T=2.6, B=1
第二个矩形的边缘: L’=3.6, R’=5.3, T’=4.5, B’=3
可得:
Max(L,L’)=Max(1.2,3.6)=3.6
Min(R,R’)=Min(2.8,5.3)=2.8
Max(B,B’)=Max(1,3)=3
Min(T,T’)=Min(2.6,4.5)=2.6
计算边界交叉:
– Max(Max(L, L’)-Min(R,R’), Max(B,B’)-Min(T,T’)) <= 0
– Max(3.6–2.8, 3–2.6)) <= 0
– Max(0.8, 0.4) = 0.8
– 0.8 > 0, 因此没有交叉
由于结果由于结果是正值那么说明他
们没有形成一个新的矩形
其它的坐标系统
屏幕坐标系统采用坐上角为原点(0,0)
在前面的判断式中稍作修改:
– 左右方向没有变化
– 由于顶部比底部的坐标值小:
Max(B,B’) 变成Min(B,B’)
Min(T,T’) 变成Max(T,T’)
– 判断等式变成了:
Max(Max(L, L’)-Min(R,R’), Min(B,B’)-Max(T,T’)) <= 0
速度
速度, V(x,y), 表示了一个对象的移动步长和方向
步长
– 步长是向量V(x,y)的长度
– 例如:
S = (x2 + y2)^(-2)
方向
– 单位向量是一个长度为“1”的向量
– 用来表示方向
– 例如: uv(x/L, y/L) ,其中L是原向量V的长度:
L = (x2 + y2)^(-2)
(6)
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.
输入
按下键盘
“按”是一个按键的状态。
键盘输入在按键被按下时被执行。
为了获取键的状态(即是否被按下),调用‘IsPressed’ 方法。
这个方法将返回一个Boolean 值
例如:下面的代码将检查是否‘up arrow’键是否被按下
Keyboard.IsPressed(Key.UpArrow)
触发
这是键的另一种状态,当键未被按下到按下。
为了获得这种状态(是否改变了状态),调用‘IsTriggered’方法
这个方法将返回一个Boolean 值
例如:下面代码检查空格键是否改变了它的状态
Keyboard.IsTriggered(Key.Space)
游戏实现
在游戏中,方向键用来控制骑兵的移动
按Up 方向键控制骑兵向上,同样按Down 方向键控制向下
当空格键被触发时,骑兵将发射一个子弹。(子弹是被动态创建的)
if (Keyboard.IsTriggered(Key.Space))
{
Fire fire = (Fire)StarTrooper.Fire.Clone();
fire.Position = new PointF(Position.X,Position.Y -35);
fire.Velocity = new Vector2(0, -4);
Game.Add(fire);
}
(7)
声音
效果音
效果音:在游戏中当某个事件发生的时候播放的声音。
一般是进行某些特定动作时的声音,比如:
发射子弹
坦克爆炸
弹子球碰撞墙壁
像游戏当中添加一个效果音
添加效果音首先创建一个Sound类的实例,然
后指定一个WAV的文件
public static Sound Shoot;
向游戏中添加声音对象
Game.Add(Shoot);
注意:音效的WAV文件所在文件夹的路径,在
StarTrooperGame类的初构函数中指定。
创建Sound对象
Shoot = new Sound("Shoot.wav");
Sound
在‘StarTrooperGame.cs’添加如下代码,声明效果音
public static Sound Shoot;
public static Sound Die;
在‘InitializeResources’方法中添加如下代码:
Shoot = new Sound("Shoot.wav");
Game.Add(Shoot);
Die = new Sound("Die.wav");
Game.Add(Die);
背景音乐
在游戏运行当中,我们把背景音乐成为Music
背景音乐既可以循环播放,也可以只播放一次
背景音乐也可以随情节改变
背景音乐既可以是MIDI, WAV, 也可以是压缩格式,如Ogg Vorbis or MP3
向游戏中添加背景音乐
背景音乐是Music类的对象,并指定了一个WAV的文件
public static Music Music;
向游戏中添加Music对象
Game.Add(Music);
注意:背景音乐的WAV文件所在文件夹的路径,在StarTrooperGame类的初构函数中指定。
创建Music对象:
Music = new Music("music.wav");
背景音乐在游戏中是循环播放的,下面的代码
用来播放WAV文件
Music.Play();
为了能够循环播放背景音乐,我们在‘StarTrooperGame.cs’文件的‘Update’ 方法中加入下面的代码
if (!Music.IsPlaying)
Music.Play();
文本
文本是什么?
文本是显示在屏幕上的字符串
文本拥有以下属性:value, font, color, position,visible, active
为什么使用文本?
用于显示文本文件的内容
显示变量的值
在游戏进行过程中显示特定的消息
向游戏中添加文本
第一,先要选择字体
字体是Font类的对象
创建一个新的字体对象要设定:type, size和style属性然后添加到游戏中
Font font = new Font("Arial", 14.0f, FontStyle.Regular);
Game.Add(font);
然后创建基于字体创建一个Text2D对象用来显示游戏分数
public static Text2D Score;
Text2D Score = new Text2D(font);
将文本对象添加到游戏中
然后设置文本对象的text, position, color属性
Score.Text = "Score: 0";
Score.Position = new Point(150, 0);
Score.Color = Color.Red;
最后将游戏分最后将游戏分数添加到游戏中
StarTrooper.Score = Score;
Game.Add(Score);
注意:为了添加一个新的文本类,你可以添加一个文件,如‘YourText.cs’,然后从Text2D类派生一个名叫‘YourText’的类
(8)
行为介绍
行为是用户定义的一系列功能
行为描述了游戏或者游戏对象是如何进行运动或如何发生行为的
我们可以自己定义象精灵和文字这样的游戏对象的行为
把功能指派给游戏行为后功能的发生是连续的
游戏对象行为
在星际骑兵游戏中,游戏行为是分配在构成游戏的多个对象中
这些对象包括:
骑兵
秃鹰
文件
骑兵对象行为是多种行为的组合
运动
射击
秃鹰的行为依靠于碰撞检测
如果秃鹰与子弹发生碰撞,那么将发生爆炸,并且得分增加
如果秃鹰与骑兵碰撞,则秃鹰死掉,并得分减少
子弹行为很简单:
子弹碰撞到秃鹰后将消亡,否则将继续运动
秃鹰行为
创建包括所有冲突精灵的列表
每一个元素均在列表中
如果元素是子弹对象,为冲突执行子弹行为
如果元素是骑兵对象,为冲突执行骑兵行为
子弹行为
如果子弹击中秃鹰,则子弹将消失(与秃鹰行为同事发生)
如果子弹没有击中任何对象,如果子弹已经经过游戏画面的顶端,则将应从游戏中删除
if (y < -100)
Game.Remove(this);
如果空格键是发射键,那么一个子弹精灵行为被创建的同时
发射的声音效果将被执行
开火的文本将增加并显示
if (Keyboard.IsTriggered(Key.Space))
{
Fire fire = (Fire)StarTrooper.Fire.Clone();
fire.Position = new PointF(Position.X, Position.Y -35);
fire.Velocity = new Vector2(0, -4);
Game.Add(fire);
StarTrooper.Shoot.Play();
m_Shoots++;
StarTrooper.Shoots.Text = "Shots:" + m_Shoots.ToString();
}