一、 更新
更新是整个XNA游戏开发的重点,它代表了整个游戏的运行逻辑,从技术上讲可分为输入设备的获取和模型的变换两个方面。
1、 获取输入设备的输入信息
XNA目前主要支持三种输入设备:Xbox 360控制器、鼠标、键盘。我们暂时主要用到鼠标和键盘。
(1)、鼠标状态的获取
XNA鼠标包含左键、右键、中键的信息(ButtonState.Pressed、ButtonState.Released),鼠标的当前位置(X,Y)。
获取当前鼠标状态:
MouseState state = Mouse.GetState();
获取鼠标的当前位置:
state.X、state.Y
判断左键是否被按下:
state.LeftButton == ButtonState.Pressed
判断右键是否被按下:
state.RightButton == ButtonState.Pressed
注:XNA中没有左右键的单击事件和双击事件,但可以自己编写鼠标的单击双击事件类。
(2)、键盘状态获取:
XNA中键盘类主要提供了判断那个键被按下的功能。
获取当前键盘信息:
KeyboardState keyboardState = Keyboard.GetState();
判断某键(A)是否被按下:
if (keyboardState.IsKeyDown(Keys.A))
2、2D图片的变换
2D图形的变换是通过显示函数来实现的。
public void Draw (
Texture2D texture, /*图片信息*/
Vector2 position, /*屏幕坐标*/
Nullable<Rectangle> sourceRectangle, /*显示区域*/
Color color, /*颜色*/
float rotation, /*旋转变换*/
Vector2 origin, /*图片的原点坐标*/
Vector2 scale, /*缩放变换*/
SpriteEffects effects, /*特效*/
float layerDepth /*深度*/
)
spriteBatch.Draw(myTexture, spritePosition, null, Color.White, 0.5f ,
new Vector2(), 1.0f , SpriteEffects.None, 0.0f );
3、3D模型变换
XNA中3D模型的变换涉及到平移、旋转、缩放等。它的实现是通过设置3D模型的每个ModelMesh中的BasicEffect的World来实现的,我们通过获取鼠标、键盘等的状态信息并根据该信息来计算3D模型的World变换矩阵,并通过设置该矩阵来改变模型的位置、旋转、缩放等。通过平移变换我们可以实现3D模型的移动。如赛车的实现中,我们通过实时变换赛车的位置来驱动汽车的行使;我们通过设置汽车轮子的旋转变换来实现汽车轮子的转动效果以及仪表盘的转动;我们通过缩放来实现赛车与周围景物的协调一致。(在实现赛车的程序中,摄像机跟随汽车移动)
/*求取模型的wrold矩阵*/
Matrix.CreateTranslation(ref position, out matTranslation); /*平移矩阵*/
Matrix.CreateScale(ref scale, out matScale); /*缩放矩阵*/
Matrix.CreateFromYawPitchRoll(rotation.Y, rotation.X, rotation.Z,
out matRotation); /*旋转矩阵*/
world = matScale * matRotation * matTranslation; /*world矩阵*/
/*设置模型的world矩阵*/
foreach (ModelMesh mesh in model.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.World = world * boneTransforms[mesh.ParentBone.Index];
}
mesh.Draw();
}