跳轉至內容

使用 Unity 遊戲引擎建立遊戲/遊戲 3 XtremeCurling

來自 Wikibooks,開放世界開放書籍


遊戲 3 : Loui Roui 的 Xtreme Curling 錦標賽模擬器 2K14

[編輯 | 編輯原始碼]

作為選修課“Xbox 程式設計”的一部分,基於 XNA Xtreme 模擬遊戲“Loui Roui 的 Xtreme Curling 錦標賽模擬器 2K14”,可以使用 QWERTY 鍵盤和 Xbox 控制器進行控制。

遊戲的構思

[編輯 | 編輯原始碼]

基本思想是基於對冰壺比賽的現實模擬程式設計。旨在增加趣味性的將透過遊戲中不同的聲音沉澱,從而突顯情緒。此外,對我們來說,使用真實的物理引擎至關重要。這些計算已提前完成,以便在後續步驟中使用兩塊冰壺石之間的碰撞行為。速度和撞擊角度都是關鍵因素。

為了進一步增強遊戲,我們已經同意開始在冰壺場上整合多個攝像機角度。

[ [File: Ideenfindung.png | thumb | ideas using a mind map ] ]

程式設計

[編輯 | 編輯原始碼]

作為程式設計平臺,我們選擇 XNA Framework 3.1。所需的 3D 模型在 Blender 2.69 中建模,然後以 .fbx 格式整合到 XNA Framework 中。由於所有團隊成員都在程式碼的不同位置工作,因此程式碼使用 GitHub 進行組織。Git Extension 程式使不同程式版本的版本控制成為可能,並組織程式碼更改的彙編。

一開始,就建立了一個冰壺石的 3D 模型,這是遊戲中重要的組成部分。在第一週課程的第二天,就可以實現對石頭進行控制以及整合 3D 元素。

隨著週期的不斷進行,我們一直在研究遊戲的範圍和實際的遊戲玩法。當前的程式版本包含以下功能:


石頭的真實行為

[編輯 | 編輯原始碼]

為了獲得真實的石頭行為,我們考慮了以下標準:

  • 冰壺石的速度損失
  • 碰撞檢測
  • 兩塊石頭碰撞時物理上正確的傳播
  • 動力傳遞/速度傳遞到擊球石

可以在投擲之前透過三個不同的引數影響石頭。可以使用 QWERTY 鍵盤和 Xbox 手柄進行操作。

  • '投擲 - 強度',使用 Powerbar 控制。可以使用空格鍵或 Xbox 控制器上的“A”鍵在適當的時候停止。石頭將以該速度投出。
  • '方向',石頭將被投擲的方向。方向由一個箭頭控制,可以變化 40 度。
  • '石頭 - 位置',在比賽開始時。可以使用控制面板左右移動來更改。


3D 模型

[編輯 | 編輯原始碼]

為了使遊戲環境儘可能地具有塑性,我們安裝了各種三維元素。以下元素是在 Blender 中建模的:

  • 冰壺石
  • 冰面
  • 引導箭頭
  • 冰壺場


遊戲體驗

[編輯 | 編輯原始碼]

為了改善遊戲體驗,我們安裝了圖形、聲音和物理元素。

玩家透過兩個主螢幕歡迎遊戲工作室,即我們的開發團隊和遊戲構想。在第二個螢幕上,玩家可以選擇開始遊戲或檢視控制器操作。

{ | Class = " wikitable " | - ! 控制 | - | [ [File: Controls XC.png | thumb | Control of the game ] ] |}

在比賽過程中,比賽將伴隨著不同的聲音,具體取決於情況。此外,當兩塊冰壺石碰撞時,Xbox 手柄會振動。

個人服務

Sebastian Gritzbach

使用 Blender 生成 .fbx 檔案

[編輯 | 編輯原始碼]
什麼是 .fbx
[編輯 | 編輯原始碼]

.fbx 格式實際上是 Autodesk 的一種格式,可以使用它儲存 3D 物件。它也是 XNA 用於實現 3D 模型的格式。它們以二進位制或 ASCII 資料儲存。在第二種情況下,即使使用文字編輯器,也可以在回顧中編輯物件。紋理未儲存在 .fbx 檔案中,必須始終與模型一起提供。

如何建立 .fbx
[編輯 | 編輯原始碼]

使用 Blender 建立 .fbx 檔案(本身)非常簡單。建立一個 3D 模型,並透過'檔案>匯出>Autodesk FBX(.fbx)'匯出它。但是,需要注意以下事項:

需要注意的是,模型應使用盡可能少的 polygon 來製作,因為這會導致日後出現效能問題。此外,還必須注意每個面都有一個法線。例如,如果一個立方體刪除了一個區域,內部將不會顯示,因為這沒有提供法線。現在,您可以手動新增法線或透過“Solidify Modifier”使面具有特定的厚度。這還有一個優點:您可以從側面識別面,否則它們有時會太窄而無法顯示。在紋理化時,應始終使用矩形紋理,其高度/寬度(以畫素為單位)始終為 2 的冪。此外,應始終使用 UV 貼圖。因為 Blender 的自動紋理化功能無法正確應用。紋理的格式可以使用 JPG、PNG 或 BMP,而 PNG 往往會導致問題。您還必須注意壓縮方法,尤其是在 JPG 中,因為它們會導致日後出現問題。最好使用影像處理程式的標準設定。


在匯出之前,您應該考慮一些事情。您應該檢視物件中心的位置。這也是日後用於位置的參考點。此外,Blender 中的尺寸也將用於日後。但是,必須首先“應用”所有變換。例如,如果物件被縮放和旋轉,這些值實際上在 Blender 中發生了變化,但可能會導致日後出現問題以及定位混淆。因此,您應該透過按“Ctrl + A”應用所有變換(Loc、Rot、Scale),使其值為 1.0。

在專案中,您必須將最終的 .fbx 檔案和相應的紋理放在專案的內容部分。通常,.fbx 檔案中的紋理路徑必須更改。為此,您可以使用文字編輯器開啟 .fbx 檔案,並將路徑更改為適合“相對檔名”。

在專案中使用
[編輯 | 編輯原始碼]

要使用模型,需要執行以下步驟。

1. 為模型建立變數      Model myModel ;

2. 載入模型(在 LoadContet () 中)。在本例中,檔案位於 Content.Models 中,名為“theFBX”。

   myModel = new Floor ( Content.Load <Model> ( "Models \ \ theFBX " ) , 0, 0 , 0);

3. 繪製模型。

           // Copy any parent transforms.
           Matrix[] transforms = new Matrix[myModel.Bones.Count];
          myModel.CopyAbsoluteBoneTransformsTo(transforms);
           // Draw the model. A model can have multiple meshes, so loop.
           foreach (ModelMesh mesh in myModel.Meshes)
           {
               // This is where the mesh orientation is set, as well 
               // as our camera and projection.
               foreach (BasicEffect effect in mesh.Effects)
               {
                   effect.EnableDefaultLighting();
                   effect.DirectionalLight0.DiffuseColor = new Vector3(3.0f, 3.0f, 3.0f); //Bright Light
                   effect.DirectionalLight0.SpecularColor = new Vector3(0.0f, 1.0f, 0.0f); //Blue Specular Light
                   effect.World = transforms[mesh.ParentBone.Index] *
                       Matrix.CreateRotationY(myModelRotation) //Sets the Rotation
                       * Matrix.CreateTranslation(myModelPos)  //Sets the Position
                       * Matrix.CreateScale(myModelScale);     //Sets a Scalation
                   effect.View = Matrix.CreateLookAt(cameraPosition, //Sets the Position of the Camera and the Point where it is look
                       cameraLookAt, Vector3.Up);
                   effect.Projection = Matrix.CreatePerspectiveFieldOfView(
                       MathHelper.ToRadians(45.0f), m_aspectRatio,
                       1.0f, 10000.0f);
               }
               // Draw the mesh, using the effects set above.
               mesh.Draw();

Tobias Schmidt

[編輯 | 編輯原始碼]

Christian Meyer

[編輯 | 編輯原始碼]

Keyboard 在 XNA 中代表鍵盤。此鍵盤允許查詢。透過 GetState 方法可以查詢當前狀態。

            KeyboardState keyboardState ;             keyboardState = Keyboard.GetState ();

通常只需要簡單的 if 迴圈來透過鍵盤快捷鍵執行特定操作。例如,可以使用這些查詢移動一個物件。

            if ( keyboardState.IsKeyDown ( Keys.Left ) )                         { X.moveLeft (); }

            if ( keyboardState.IsKeyDown ( Keys.Right ) )                         { X.moveRight );}


遊戲手柄
[編輯 | 編輯原始碼]

或者,可以使用遊戲手柄控制(Xbox 360 手柄)。它由類 GamePadState 表示。

            GamePadState gamepadState ;

由於最多可以同時連線四個手柄,因此需要透過 PlayerIndex 選擇相應的手柄。在本例中,我們選擇手柄 One

            gamepadState = GamePad.GetState ( PlayerIndex.One );

為了檢查連線,可以使用 IsConnected 功能。

            gamePadState.IsConnected

如果成功建立連線,則可以像鍵盤按鍵一樣控制手柄按鈕和旋鈕。在本例中,選擇了 A 鍵。

            gamePadState.Buttons.A

為了檢查是否按下了一個鍵,還需要進行比較。這由 ButtonState.Pressed 表示。

            gamePadState.Buttons.A == ButtonState.Pressed

由於 Xbox 手柄上不僅有按鍵,還有扳機等,因此還有一些其他功能。例如,要選擇 dPad(左),需要執行以下呼叫。

            gamePadState.DPad.Left

同時,也可以呼叫肩鍵或其他按鍵。例如

            gamePadState.Buttons.LeftShoulder             gamePadState.Buttons.Back

對於搖桿,行為略有不同。它們對移動敏感。根據搖桿移動的強度和方向,將返回不同的值,以向量的形式表示(值範圍為 0-1)。

此外,與鍵盤控制器不同,還可以讓手柄振動。透過設定兩個浮點值,可以控制手柄中的兩個電機,同時可以調整強度。(值範圍為 0 到 1)。要再次讓手柄振動,只需將值設定為 0.0f, 0.0f 即可。

            GamePad.SetVibration ( PlayerIndex.One , 0.3f , 0.3f );



播放音訊檔案
[編輯 | 編輯原始碼]

要在程式中使用音效,需要使用以下 using 指令。

            using Microsoft.Xna.Framework.Media ;

所有音效都由類 SoundEffect 表示。要新增聲音,需要建立此類的新的物件。在本例中,需要一個“hit”來表示冰壺的撞擊聲音。

            SoundEffect soundHit ;


LoadContent 方法中,載入所有音效。在本例中,音效檔案位於 XNA 資源管理器的內容目錄的 Sounds 資料夾中。“01_Hit” 是不帶副檔名(最好是資料格式,例如 .wav 格式)的檔名。

            soundHit = Content.Load <SoundEffect> ( "Sounds \ \ 01_Hit ");

為了能夠播放現在音訊檔案 soundHit,只需要執行以下命令。

            soundHit.Play ();

迴圈播放音訊檔案
[編輯 | 編輯原始碼]

要迴圈播放音訊檔案,需要一個 SoundEffectInstance 類的物件。在為 soundHitLoop 設定布林值 True 後,呼叫 Play 方法後,檔案將以連續迴圈的方式播放。

            SoundEffectInstance soundHitLoop ;             soundHitLoop = soundHitLoop.CreateInstance ();             soundHitLoop.IsLooped = true;             soundHitLoop.Play ();



開始螢幕/結束螢幕

[編輯 | 編輯原始碼]

場景管理===== ===== 通常情況下,場景管理是必不可少的。由於程式碼管理已經很複雜,因此不需要專門的場景。但是,為了讓玩家可以使用開始螢幕和結束螢幕,所有必要的媒體資料都已載入到遊戲中,並由鍵盤或手柄輸入進行控制。由於 C# 中物件的順序在 Draw 方法中至關重要,因此可以在所有其他物件之前放置開始螢幕,以便在遊戲開始時直接顯示。

開始螢幕 - 動畫
[編輯 | 編輯原始碼]

遊戲開始的動畫最初是一個原始的高解析度 GIF 動畫。由於在開發過程中遇到了此檔案格式不支援的問題,因此只能使用影片嵌入。經過幾次失敗嘗試(匯入後由於影片格式不正確、壓縮錯誤或缺少音訊軌道導致問題),最終透過在 Windows Movie Maker 中匯入並隨後匯出為 .wmv 檔案解決了問題。

對於影片格式,需要 video 和 video player 類,以及使用 media 指令。

            using Microsoft.Xna.Framework.Media ;

            Video vid ;             Video Player vidplayer ;

這裡給影片分配了一個紋理,並生成了一個 Rectangle 來適應螢幕。

            Texture2D vidTexture ;             Rectangle vidRectangle ;

然後初始化 vidplayer。

            vidplayer = new VideoPlayer ();

然後在 LoadContent 方法中載入影片(影片檔名: "Start Screen")。然後可以在 Rectangle 中修改此影片(左上角畫素的 X、Y 座標、寬度、高度)。

            vid = Content.Load <Video> ( "Start Screen" );             vidRectangle = new Rectangle ( GraphicsDevice.Viewport.X , GraphicsDevice.Viewport.Y , GraphicsDevice.Viewport.Width , GraphicsDevice.Viewport.Height );

現在可以使用以下函式啟動影片。

            vidplayer.Play ( vid );

不僅可以啟動,還可以執行其他功能,例如停止:vidplayer.Stop ();



微軟 XNA 官方網站,提供有關功能、影片格式等的資訊。 http://msdn.microsoft.com/en-us/library/bb200104.aspx
所有重要 XNA 功能的概述(包括解釋)
http://www.xnamag.de/index.php XNA 教程和資訊 http://www.xnadevelopment.com/tutorials.shtml
由 Code Made Easy 提供的 Youtube 教程 https://www.youtube.com/watch?v=exqk0lH7-xc&list=PLDC1A9D5C3F8ED318

帕特里克·卡爾夫 === === 菲利普·利納特 === ===

我的專案任務是製作遊戲的全部圖形元素。所有圖形都在 Photoshop 中建立,然後使用 XNA 框架構建到程式碼中的相應位置。開始螢幕包含一個也在 Photoshop 中建立的動畫,然後在 Premiere Pro 中儲存了聲音,並已合併到遊戲中。

因此,設計應該在現代框架點之間建立,特別是。然而,除了 8 倍之外,它不應該留給極端因素。我們開發工作室的徽標應該儘可能保持簡潔,以便能夠儘可能輕鬆地留下深刻印象。這種簡潔是我建立的徽標主要是單色的原因。

我在遊戲的實際設計中採用了完全不同的設計方法。這裡重點明顯是極端和引人注目的設計。徽標應該直接跳到開始螢幕,映入眼簾。這種設計的目的是透過極端的設計來增強相對不起眼的冰壺運動。徽標背景中的飛濺筆刷更引人注目。

此外,我一直在負責上面列出的團隊條目,它將用幾句話概括專案。

以下是一些工作示例:

{ | Class = " wikitable " | - ! 開發工作室徽標 ! 開始螢幕 ! 控制 ! 冰壺球場 | - | [ [File: First page.png | thumb | 開發工作室 ] ] | | [ [File: Startscreen.gif | thumb | 主螢幕] ] | | [ [File: Controls XC.png | thumb | 遊戲控制 ] ] | | [ [File: Curling Feld.jpg | thumb | 冰壺球場第一版本 ] ] |}


參考文獻

[編輯 | 編輯原始碼]


< previous                                                                              next >
華夏公益教科書