65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows Phone 7 的 XNA Invasion 游戏

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (31投票s)

2011 年 7 月 1 日

CPOL

12分钟阅读

viewsIcon

117036

downloadIcon

6610

这是将“入侵”(最初由 Mauricio Ritter 在 CodeProject 上发布)移植到 Windows Phone 7 的版本(并进行了一些增强)。

Invasion Gameplay Screen Level 15

引言

《入侵》是一款 UFO 射击游戏,最初由 Mauricio Ritter 设计。本文介绍了我的将 Mauricio Ritter 的 Windows 版《入侵》游戏(使用 C# 和 Managed-DirectX)移植到 Windows Phone 7(使用 C# 和 XNA 4.0)的过程。提供了完整的源代码。

请记住在页面底部 评价本文,如果您从 Marketplace 安装了 XAP 文件,也请在那里 评分和评论 - 谢谢!

背景

早在 2002 年,Mauricio Ritter 在 CodeProject 上发布了他的“入侵”UFO 射击 2D 游戏。该游戏是用 C++ 编写的,使用了 DirectX 7 中已在 DirectX 8 中移除的 DirectDraw API。次年,Steve Maier 将游戏移植到了 C# 并使用了 Managed DirectX,同样发布在 CodeProject 上。Managed DirectX 已于 2005 年停止更新,被 XNA 取代。这两个旧版本都在 Windows XP 上运行。本文介绍了我在 2011 年花费一周时间将 Steve 的 Managed DirectX 版本使用 XNA 4.0 移植到 Windows Phone 7 的过程。

上述文章可在 CodeProject 上找到

Using the Code

《入侵》(v1.1) 使用 Windows Phone 7.1 SDK 构建,适用于 Windows Phone 7.0 和 7.5 (Mango) 操作系统。请注意,《入侵》v1.0 是针对 Windows Phone 7 SDK 的 Beta 版之前版本构建的,该代码将无法针对 RTW WP7.1 SDK 进行构建。

虽然 XNA 目前可用于制作 Windows、Xbox 360 和 Windows Phone 游戏,但此代码目前仅适用于 Windows Phone 7。此限制是由于实现的触摸屏和加速计输入取代了鼠标和键盘输入。要将此移植回 Windows,需要重写输入处理程序和屏幕设置。

您可以下载上面的 XAP 文件,并使用应用程序部署工具(来自 Windows Phone Developer Tools)将其安装到您的手机上,但要自动获取 XAP 更新,您需要从 Windows Phone Marketplace 下载并安装此免费游戏。

重构代码

除了“让它在 Windows Phone 7 上运行”之外,我在移植这款游戏时还设定了一些目标。具体来说,它们是:

  • 将代码重构为更易于管理的类
  • 使代码更易读,以便初学者能够理解
  • 通过使用更多的 C# 语言特性和 XNA 框架类来简化代码
  • 打磨游戏,以便我可以在 Windows Phone Marketplace 上发布它
  • 保持免费和开源
  • 但仍然在一周内完成移植!

考虑到我的时间安排(我为此延长了几天的期限),我只取得了一部分成功。当我向 Marketplace 提交 v1.0 时,它还是一个“开发中”的版本,v1.1 仍然如此!

原始代码只有四个源文件:Invasion.csUfo.csExtra.csBullet.csUfo.cs 定义了一个 UFO 类,Extra.cs 定义了一个玩家获取的奖励类,Bullet.cs 定义了激光和光子鱼雷的类,而 Invasion.cs 包含了其他所有东西的类(这太多的东西了!)。在重新设计游戏时,我将 Invasion.cs 分解成了多个类,分别包含在以下文件中:

  • InvasionGame.cs - 主游戏类,用于设置图形设备、内容管理器、精灵批处理和 2D 相机、屏幕管理器、音效、音乐、应用级别事件和记分板。
  • Invasion.cs - 仍然过于庞大和复杂,应该进一步分解为屏幕管理器和游戏屏幕子类。
  • ContentLoader.cs - 打算用它在启动时加载所有游戏内容,但目前仅用于加载音效(它可能在下一个版本中被移除)。
  • Scoreboard.cs - 一个管理和显示记分板的类。它取代了之前游戏版本的“状态栏”,并包含一些新的数据项、控件和功能。
  • StarShip.cs - 一个表示游戏中飞船的类。如果外星人有自己的类,我们的英雄也应该有一个!
  • TextHandler.cs - 一个管理 alpha.png 位图字体的类。我更新了这里的代码,并为字体添加了一些字符。尽管如此,如果您使用位图字体,您会在 create.msdn.com 上的 “2D 图形”(XNA for Windows Phone)示例 中找到更好的实现方式。
  • BulletsManager.cs - 一个管理“子弹”(已发射的激光和光子)集合的类。
  • ExtrasManager.cs - 一个管理 UFO 被摧毁后掉落的奖励物品的类。
  • UFOsManager.cs - 一个管理屏幕上所有 UFO 的类。

借用的开源代码

我希望在游戏中添加一些功能,幸运的是,我有一些现成的代码文件,可以快速轻松地添加这些功能。您可以在 ImproviSoft 命名空间下的 DiagnosticsDrawingSystem 项目中找到这些文件。但不要被命名空间所迷惑,这些代码是免费的开源代码,我的公司(ImproviSoft)并没有编写多少。这些文件包含注释,注明了其来源——主要是 Microsoft 的 XNA 团队、XNAWiki.com 和 OccasionalGamer.com 的 Elbert Perez。所以请感谢他们!以下是这些文件的列表:

  • FrameRateCounter.cs - 用于调试目的,在屏幕上显示每秒帧数,来自 Microsoft XNA 团队的 Shawn Hargreaves。
  • SimpleShapes.cs - 用于绘制 2D 原始图形(例如 Rectangle)的类,来自 XNAWiki.com(尽管在那里可能命名不同)。
  • Accelerometer.cs - 用于处理加速计输入的类,来自 create.msdn.com(Microsoft XNA 团队)。
  • Camera2D.cs - 用于处理 2D 相机(使屏幕晃动!)的类,来自 OccasionalGamer.com 的 Elbert Perez - 谢谢你,Elbert!
  • InputState.cs - 用于处理各种输入设备(包括触摸屏)的类,来自 create.msdn.com(Microsoft XNA 团队)。
  • MusicManager.cs - 用于播放背景音乐的类,来自 create.msdn.com(Microsoft XNA 团队)。
  • RandomManager.cs - 一个简单的生成随机数的类——好吧,这可能是我写的,而且只花了两分钟。
  • SoundManager.cs - 一个简单的类,用于包装 SoundEffect.Play 调用,并调整最大音量。
  • VibrationManager.cs - 用于在命令下使手机震动的类(用于力反馈效果),来自 create.msdn.com(Microsoft XNA 团队)。

旧版游戏没有音乐,只有音效。在添加 MusicManager.cs 类时,我发现 Microsoft 的示例代码还包含一个 Music.mp3 文件,该文件也包含在 Visual Studio 解决方案的 InvasionContent 项目中。它会反复循环播放,如果您厌倦了,可以随时在选项屏幕中关闭音乐,或者由于您拥有源代码,可以替换成自己的音乐!

自 Managed DirectX 版本以来的代码更改

虽然 Steve 将其移植到 C# 和 Managed DirectX 是对原始 C++ DirectX 代码库的直接移植,但我不想受限于 XNA 移植中的设计、数据结构或变量名。因此,您会发现没有一个好的对应关系可以追溯到原始源代码。我将代码到处移动以分解出新的类,更改了几乎所有函数和变量的名称(包括 UFO 类),并大量修改和添加了数据类型和函数参数。因此,我不建议您试图弄清楚我更改了代码的哪些部分,除非您只是想看看它改变了多少。我现在对右键单击 - 重构 - 重命名有了新的深刻认识。我还尽力在 InvasionGame.cs 中注释了重要的部分,以便 XNA 初学者能够理解,并且我还注释了其他几个类。

屏幕尺寸和记分板

《入侵》的早期 Windows 版本使用了 640x480 的窗口尺寸,并将记分板放在窗口底部。由于 Windows Phone 的屏幕是 800x480,我决定将记分板移到屏幕的右侧(或左侧),并将底部的 20 个垂直像素留作游戏使用。这样做使屏幕的游戏部分保持在 640x480,这非常理想,因为许多 UFO 精灵在其移动算法中都有硬编码的屏幕位置,而我不想更改(并弄乱)它们。这也很有必要,因为手机屏幕尺寸为 4 英寸对角线,记分板文本需要调整大小以便阅读。我选择了 免费的 Neuropol 字体 来为新的记分板设置文本。以下是记分板在屏幕两侧的样子。可以看到,选定的武器显示中的文本仍需要调整大小。

Invasion Gameplay Level 6

Invasion Gameplay Level 5

我还必须为 800x480 的屏幕分辨率更改主菜单屏幕的布局,使其更加“触屏友好”。现在的样子是这样的:

Invasion_v1.1_MainMenu.png

新的游戏屏幕和触摸控件

在移植到 Windows Phone 时,我希望能够暂停游戏并调整一些基本设置。Microsoft 的游戏要求规定了硬件 Back 按钮必须如何工作,因此在主菜单中按 Back 键应该会退出游戏,但在游戏过程中按 Back 键应该会打开一个暂停屏幕。实现的暂停屏幕可以做到这一点,并提供一种方式让用户恢复正在进行的游戏(再次按 Back 键),并提供一种方式让用户退出游戏应用程序。暂停屏幕允许用户放弃游戏并返回主菜单屏幕。我更新了主菜单屏幕,加入了导航到一个选项屏幕,用户可以在其中调整记分板位置、音乐开关、难度级别(这是原始《入侵》游戏中缺失的)以及自动武器选择(AWS - 另一项新功能!)。游戏过程中也可以通过按住记分板的上部来打开此选项菜单屏幕(也许这不是我最好的 UI 设计——它真的应该有一个按钮)。通过点击选定武器显示左侧的 AWS 图标,也可以切换 AWS。点击选定的武器可以将其更改为下一个可用武器。由于所有的输入和控件都是新的,我更新了帮助屏幕。

Invasion_v1.0_Help.png

未来更新!

虽然我有很多东西想在本次发布中实现,但有些东西因为时间原因被删减了。但当然,总会有下一个版本或下下一个版本。以下是我希望添加的内容的简短列表,如果您有兴趣帮忙,请联系我。

  1. Invasion.cs 代码分解为 ScreenManager 和单独的屏幕类
  2. 保存用户偏好设置(游戏设置)
  3. 保存和恢复游戏,以及 Tombstoning
  4. 更好的基于形状的碰撞检测——目前所有东西都使用矩形
  5. 以更高的分辨率重新渲染精灵,并且没有裁剪问题(Mauricio,这有可能吗?)
  6. 更多 UFO 类型和 UFO 机动动作或 UFO 人工智能
  7. 本地/全球高分
  8. 允许在游戏过程中切换记分板位置
  9. 将“按住记分板打开选项屏幕”替换为更明显的方式
  10. 使用 create.msdn.com 的 SpriteSheet 代码作为 GameplayScreen 的纹理
  11. 允许飞船到达屏幕的左右边缘
  12. 允许飞船向上、向下、向左和向右移动
  13. 使激光的边界框变窄

如果您有其他改进想法,请在下面的评论中添加!

关注点

XNA 4.0 中的颜色键透明度

因为这款游戏的所有图形都已经存在,我真的不想重新创建它们。精灵渲染有点粗糙,裁剪也有些笨拙,但它们看起来仍然相当不错!但由于它们最初是多年前作为 BMP 文件渲染的,而位图图像文件没有 Alpha 通道,因此它们使用了颜色键透明度。在 DirectX(包括 Managed DirectX)中,颜色键是为每个纹理(图形图像)在代码中设置的,但在 Visual Studio 2010 和 XNA 4.0 中,颜色键是在图形文件的属性中设置的。默认情况下,XNA 使用洋红色作为颜色键,但我想去除黑色精灵背景,所以需要更改它。在 Visual Studio 2010 中,单击解决方案资源管理器中的 PNG 文件以查看其属性。单击“Content Processor”左侧的小三角形,并将“Color Key Color”字段设置为您想要使其透明的 RGBA 颜色。要将其更改为不透明的黑色,颜色键必须更改为 [ 0, 0, 0, 255 ]。

将游戏固定到开始屏幕而没有磁贴标题

如果您构建此项目,将其部署到您的手机,然后尝试将游戏磁贴固定到您的开始屏幕,您会看到“Default Title”尴尬地印在磁贴底部。这是因为 Tile Title 已从 Invasion 项目的 XNA Game Studio 属性中移除。这并不是我真正想要的——我希望它是不可见的,所以我想尝试在其中放入一个空格字符来解决“Default Title”问题。这样做,您将取消固定图钉在开始屏幕上的磁贴(如果它在那里),然后打开 XNA Game Studio 属性页面。在 Tile Title 文本框中输入一个空格字符,并立即构建游戏。生成的 XAP 文件将显示一个空白的 Tile Title,但 Visual Studio 会自动删除该文本框中的空格字符。所以,如果您在不重新插入空格字符的情况下再次构建,您会再次得到“Default Title”。因此,如果您想要开始屏幕上的空白 Tile Title,您必须在最终构建之前将空格字符放入文本框中。如果有人知道如何永久清除 Tile Title,请告诉我。

历史

  • 2011 年 6 月 30 日 - v1.0 版本,我也已在 Windows Phone Marketplace 上发布(免费无广告游戏!)。
  • 2011 年 7 月 2 日 - 文章澄清和修正了拼写错误。
  • 2011 年 7 月 10 日 - 添加了额外的超链接,并替换了“注释和重命名变量”部分的标题。
  • 2011 年 12 月 10 日 - v1.1:更新至 Mango SDK,改进了计分,将关卡分解为波次和区域,并将游戏速度提高到 30fps。
  • 2012 年 1 月 3 日 - 修正了关于构建代码使用的 Windows Phone SDK 版本的文章。代码无更改。
© . All rights reserved.