跳转至内容

使用 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 >
华夏公益教科书