實作XNA FRAMEWORK中的INPUT操作 (三)

摘要:實作XNA FRAMEWORK中的INPUT操作 (三)

在鍵盤與滑鼠都設定完成以後,接下來就是編寫主程式的時候了。

在主程式的CLASS中,在一開始的時候加入,剛剛滑鼠與鍵盤的命名空間

Using Game.Input;

增加完畢以後,增加以下屬性在主程式
Model FD;       //
儲存3D Model的資訊
Camera camera;     //
建立攝影機的類別
MyKeyboard keyboard;   //
建立鍵盤的類別
MyMouse mouse;   //
建立滑鼠的類別
float Angle =0.0f;    //
旋轉的角度
float Rotation = 1.0f;       //
設定每次旋轉多少角度
Vector3 move = new Vector3();      //
建立移動的向量
Vector3 Position = new Vector3(-500.0f,300.0f,-400.0f);       //
觀察者的位置

 在建構子裡面,需要實作三個類別

camera = new Camera();
keyboard = new MyKeyboard();
mouse = new MyMouse();

LoadGraphicsContent方法中,加入讀取FBX 3D模型。
FD  = content.Load<Model>(@”.\mesh\FD”);

Update中,就是用來判斷,鍵盤或是滑鼠是否被按下等處理
float elapsedtime = gameTime.ElapsedGameTime.Milliseconds / 1000.0f;
//
因為電腦處理數度不同,有些電腦更新速度很快,執行的時候就會動的很快,對於醫些電腦配備不怎麼好的人,這樣對他們很不公平,所以XNA提供這個方法,可以來判斷現在用了多少時間執行那個動作。
move = Vector3.Zero;
keyboard.Update(); //
要求鍵盤資訊更新
mouse.Update();     //
要求滑鼠更新
if (keyboard.IsKeyHit(Keys.Escape))        //
判斷滑鼠是否被按下
   this.Exit();
if (keyboard.IsKeyDown(Keys.Left))       //
視野旋轉
   Angle += Rotation * elapsedtime;    //
角度加上旋轉角,在乘上過了多久的時間
if (keyboard.IsKeyDown(Keys.Right))      //
視野旋轉
   Angle -= Rotation * elapsedtime;
if (Angle > 2 * MathHelper.Pi)        //
判斷是否旋轉的視野超過2PI
   Angle -= (float)2 * MathHelper.Pi;
if (Angle < 2 * MathHelper.Pi)
   Angle += (float)2 * MathHelper.Pi;
if (keyboard.IsKeyDown(Keys.Down))     //
視野拉近
{
   move = Vector3.Normalize(Position);       //
這邊作的方式,就是現在眼睛所看的地方(向量),拉近。

   move += move * elapsedtime * 1000;

}

if (keyboard.IsKeyDown(Keys.Up))

{

   move = Vector3.Normalize(Position);

   move -= move * elapsedtime * 1000;

}

 

Draw中,呼叫DrawModel的函數。

 

DrawModel

Matrix[] transforms = new Matrix[FD.Bones.Count];

FD.CopyAbsoluteBoneTransformsTo(transforms);

 

Matrix S = Matrix.CreateScale(2.0f, 2.0f, 1.0f);

Matrix R = Matrix.CreateRotationY(Angle);

Matrix T = Matrix.CreateTranslation(0.0f, 0.0f, 0.0f);

Matrix World = S * R * T;

Position += move;

LookAt += move;

Vector3 Up = Vector3.Up;

camera.SetViewMatrixValue(Position, LookAt, Up);

float FOV = MathHelper.ToRadians(45.0f);

float aspectRatio = 800 / 600;

camera.SetProjectionMartixValue(FOV, aspectRatio, 1.0f, 10000.0f);

foreach (ModelMesh mesh in FD.Meshes)

{

   foreach (BasicEffect effect in mesh.Effects)

   {

      effect.EnableDefaultLighting();

      effect.World = transforms[mesh.ParentBone.Index] * World;

      effect.View = camera.View;

      effect.Projection = camera.Projection;

   }

   mesh.Draw();

}

 

DrawModel方法中,與之前類別相似。所以就沒有特別說明。

編譯過後可以看到一個可以選轉拉近的3D MODEL。

範例
稍後補上