使用 Unity 游戏引擎创建游戏/游戏 3 XtremeCurling
作为选修课“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 度。
- '石头 - 位置',在比赛开始时。可以使用控制面板左右移动来更改。
为了使游戏环境尽可能地具有塑性,我们安装了各种三维元素。以下元素是在 Blender 中建模的:
- 冰壶石
- 冰面
- 引导箭头
- 冰壶场
为了改善游戏体验,我们安装了图形、声音和物理元素。
玩家通过两个主屏幕欢迎游戏工作室,即我们的开发团队和游戏构想。在第二个屏幕上,玩家可以选择开始游戏或查看控制器操作。
{ | Class = " wikitable " | - ! 控制 | - | [ [File: Controls XC.png | thumb | Control of the game ] ] |}
在比赛过程中,比赛将伴随着不同的声音,具体取决于情况。此外,当两块冰壶石碰撞时,Xbox 手柄会振动。
个人服务
Sebastian Gritzbach
.fbx 格式实际上是 Autodesk 的一种格式,可以使用它保存 3D 对象。它也是 XNA 用于实现 3D 模型的格式。它们以二进制或 ASCII 数据存储。在第二种情况下,即使使用文本编辑器,也可以在回顾中编辑对象。纹理未存储在 .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();
类 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 >