热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

三十一、发布游戏

三十一、发布游戏彼得·维斯特巴卡:“如今,地球上几乎每个人都有一部智能手机,这使它成为有史以来最

三十一、发布游戏

彼得·维斯特巴卡:“如今,地球上几乎每个人都有一部智能手机,这使它成为有史以来最大的游戏平台。而我们才刚刚开始;它仍在大规模增长。移动是体量所在,重心所在。”

这本书的最后一章讲述了几个与让你的游戏走向世界相关的话题。首先,我介绍了测试和检查代码质量,以确保你的游戏能在许多不同的平台上运行良好。然后我说几个你想发布游戏需要考虑的事情,比如本地化和代码优化。本章最后讨论了游戏的销售和营销。如前一章所述,彼得·维斯特巴卡和马克·奥维马斯提供了许多建议和想法。

测试和检查代码质量

任何你想公开发布的软件都应该在发布前经过测试。特别是在 Javascript/HTML5 游戏的情况下,玩家将拥有各种不同的设备,这些设备运行不同的操作系统,使用不同的浏览器和浏览器版本。你必须确保你的游戏能为尽可能多的玩家正常运行。

测试软件有许多不同的方法。您可以通过简单地检查代码、检查类和方法的结构来测试代码,而无需实际运行程序。您还可以通过运行程序并尝试各种不同的场景和参数值来测试程序,以确保代码完成预期的工作。确保代码不会做不希望它做的事情也很重要。如果玩家提供了无效的输入或者网络连接中断,游戏应该不会崩溃。

您可以手动进行软件测试,但也可以通过编写特殊的测试脚本来尝试各种不同的参数,从而自动进行测试。这个自动过程也被称为单元测试,因为你单独测试部分(单元)代码。

当你差不多写完代码的时候,测试还有另外两个主要阶段: alpha 测试和 beta 测试。Alpha 测试是由一组人在内部完成的,通常是开发人员自己。Alpha 测试很重要,因为它确保了开发人员构建的所有组件都能正常工作。在内部 alpha 测试之后,软件也可以进行外部测试。这被称为 beta 测试:软件由一组外部用户使用。通常,beta 测试不仅有助于消除 bug,还能发现一个程序是否能在各种设备上运行。在游戏的情况下,beta 测试也有助于验证游戏是否如预期的那样,教程等级是否清晰,以及等级进展是否顺利。在游戏行业,这一步被称为游戏测试。内部和外部都可以做 playtesting。无论如何,不要推迟游戏测试,直到你的游戏接近完成。有时候游戏测试的结果可能意味着游戏运行方式的重大改变。在这个过程中,你知道得越早越好。

马克·奥维马斯:“将不同的测试阶段分开很重要。开发人员试图在编写代码的同时测试他们的代码,但是他们不可能对所有设备和所有平台都这样做。我们的游戏设计师很快就会得到游戏的早期版本,然后就可以开始进行关卡设计和游戏性测试。这些测试也由公司中的其他人完成(但通常不是开发人员)。一旦我们认为游戏完成了,我们就把游戏放到网上,但是对公众是隐藏的。然后,我们在所有可能的设备和平台上测试游戏。我们首先测试游戏本身的所有方面是否都正常工作,这是我们不必在所有设备上检查的事情。第二,我们让许多不同的人在不同的设备和平台上试用游戏,我们让他们通过一个基本的检查清单来验证音频工作正常,屏幕工作正常,字体可见,等等。如果我们在那个时候发现了游戏中的主要问题,我们就让它下线,然后从头再来一遍整个过程。

如果一切顺利,游戏会被送到一个更注重游戏性的外部测试小组。我们希望在未来进一步扩展和改进这一流程。

过去,我们还雇佣了外部人员在各种不同的设备和平台上进行广泛的测试。这种情况下的主要目标是广泛测试我们的引擎。很可能我们很快会再做一次,因为从中得出了很多有用的东西。另一方面,这也让我们意识到我们的引擎实际上工作得很好,这是一件很好的事情。我们公司确实有很多不同的设备和浏览器,但不可能什么都有。令人沮丧的是,例如,如果你看看 Android,你的游戏可能在 Android 4.0 和 4.2 上运行,但在 Android 4.1 上则不行。不幸的是,一切运转得有多好是没有顺序的。"

与其他编程语言相比,在编写 Javascript 代码时,代码写得好是非常重要的。调试和测试 Javascript 代码比常规应用更难,因为涉及到太多的变量。因此,在让代码在各种设备上运行之前,确保代码运行良好是至关重要的。因为 Javascript 允许松散的键入,所以许多代码编辑环境很难非常有效地自动完成代码,这是一个遗憾,因为代码编辑器中的代码完成功能可以为您节省大量时间——与其说是键入时间,不如说是您不必花费时间浏览在线帮助来查找您想要使用的方法是如何拼写的以及它需要什么参数。

JSLint ( www.jslint.com)是一个帮助你写出更好代码的工具。JSLint 是所谓的代码质量检查器。它会检查您的代码中通常被认为是不良编码实践的东西。例如,Javascript 允许在声明变量之前使用它们(尽管在严格模式下这是不允许的)。JSLint 检查您的代码不包含任何未声明变量的使用。代码质量检查有用的另一个例子是 JSLint 报告以下类型的if指令:

if (a = 3) {
// do something
}

if指令的条件是赋值而不是比较。这是语法上有效的 Javascript 代码,但程序员可能是这个意思:

if (a === 3) {
// do something
}

代码质量检查器有助于发现这类编程错误。此外,如果程序员实际上打算在if的条件中进行赋值,JSLint 报告它仍然是一件好事,因为在条件中给变量赋值是一种非常糟糕的编程实践!

部署

当你想发行你的游戏时,你需要考虑一些事情。首先你需要确保全世界的玩家都能理解你的游戏。虽然许多人可以阅读和书写英语,但如果你的游戏能够适应玩家的地区,那就很好了:例如,将游戏中使用的所有文本翻译成玩家的语言。这个过程叫做本地化。如果你想正确地做到这一点,你需要尽可能地将文本与实际的游戏代码分开。这包括按钮上显示的文本和当播放器悬停在用户界面元素上时显示的帮助文本。如果你想让你的游戏被翻译成世界上任何一种语言,本地化的成本会很高;但是,您可以通过确保游戏代码不包含任何文本元素,并且只使用引用在单个位置定义的文本的变量来降低成本。

如果你在游戏中使用语音,那么本地化可能会变得非常昂贵。不幸的是,自动文本到语音转换系统在现实中还不太现实,所以你需要让配音演员录制你想发布游戏的任何语言的语音音频。

你可以设计你的游戏来最小化本地化成本,例如通过主要依靠视觉来与玩家交流。“警告:你只剩下十秒钟了!”需要翻译,但闪烁的计时器不需要。大多数游戏都试图将显示给用户的文本最小化,但是教程关卡经常包含文本。当然,如果你有一个单词搜索游戏或任何其他游戏,其中的游戏性严重依赖于文本操作,你肯定需要仔细考虑本地化。

Mark:“我们有自己的本地化工具。每个游戏都有自己的字典文件,用唯一的 ID 存储游戏中所有语言的文本。我们制作了一个特殊的工具来编辑这些文本。很多文本不是游戏特有的,它们是我们框架的一部分,所以我们把它们和游戏特有的文本一起导出。我们的工具还可以将这些数据生成为电子表格,这样我们就可以将这些数据发送给翻译人员,他们只需填写一列即可。对于本地化,重要的是您的所有代码都使用 Unicode,因为您希望能够使用亚洲字体。”

彼得:“我们用《愤怒的小鸟》创造了一个在任何地方都能玩的游戏,因为它大部分是视觉化的。我们将游戏中的小文本本地化。虽然你可以为非常本地化的市场制作游戏,但我们设计游戏时使用的文字非常少,因此几乎不需要做任何本地化。”

除了本地化之外,你还需要确保在发布游戏时代码尽可能的紧凑。本书中的所有示例代码都分布在几个文件中。当你发布你的游戏时,理想的情况是你希望所有的代码都在一个 Javascript 文件中。你也可能不希望玩家能够容易地理解你的代码。例如,如果你已经编写了一个创新的算法来非常有效地处理游戏中的物理问题,你可能希望避免其他人从你的游戏中,这样你就可以保持竞争优势。帮助你做所有这些事情的一个非常有用的工具是 Google Closure ( https://developers.google.com/closure)。Closure 允许你将你的 Javascript 文件编译成一个优化大小的文件,这样玩家可以快速下载。您可以选择闭包编译器用来生成优化的 Javascript 文件的优化级别。闭包可能的最高优化级别被称为高级优化级别。如果你打开并阅读这样一个高度优化的文件,你将无法理解其中的代码。因此,这种高级优化模式也被称为代码混淆模式。模糊处理非常有用,因为它可以保护您的代码不被他人复制。

Mark:“我们使用 Google 的 Closure 编译器进行缩小和混淆,它可以在三种不同的模式下运行。前两种模式基本上只是缩小版。第三种模式是一种重新编译,其中代码被重新安排,不使用的部分被删除,等等。我们的条件是,我们发布的任何游戏代码都需要能够经历那个过程,并且在之后仍然能够工作。”

当您从外部库调用代码时,代码混淆可能会带来问题。在这种情况下,模糊处理不应该改变你从那个库中调用的函数或变量的名字,因为那样名字就不再匹配了。您必须要么向混淆器提供指令,这样它就不会在这些情况下进行重命名操作,要么避免使用外部库。

出售你的游戏

如果你想以创作 HTML5 游戏为生,有相当多不同的可能性。用你的游戏赚钱的一个非常简单的方法是把它们放在你的网站上并添加广告横幅——例如,使用 Google AdWords。如果你有很多访问者,你将从广告中获得收入。但是,这个广告收入会很低,除非你吸引了很多玩家。也许更有利可图的方法是将你的游戏卖给门户网站。大多数门户网站免费提供他们的游戏,但他们也从广告中赚钱。也有一些经纪人网站,你可以付费购买你的游戏,比如游戏经纪(https://gamebrokerage.com)。

马克:“向门户网站出售游戏可以在收入共享的基础上进行,你可以分享广告收入。收入分成要么由门户支付给开发者,要么由开发者支付给门户。第一种情况,门户在你的游戏中投放广告,付给你一部分收入;第二种情况,开发者在游戏中投放广告,按收入的一定比例支付给门户网站。最后,你也可以通过固定费用的模式来销售你的游戏,在这种模式下,你向一个门户网站交付一个游戏就可以获得一次报酬。因为 HTML5 游戏市场相对年轻,门户网站仍然愿意与创作和销售游戏的个人打交道。但越来越多的 HTML5 游戏公司正在起步,因此这种情况可能不会持续很长时间。”

另一种尝试销售游戏的方式是通过 Android 或 iOS 上的应用商店。你不能直接把一个 HTML5 游戏发布到那些商店,需要先转换成原生格式。有一些包装器工具可以帮你做到这一点,比如 CocoonJS ( https://www.ludei.com/cocoonjs)和 PhoneGap ( http://phonegap.com /)。将你的游戏发布为原生应用的好处是,除了在应用商店销售游戏赚的钱之外,你还可以引入应用内购买等为你提供额外收入的东西。但是,请注意,使用 PhoneGap 之类的包装工具可能会导致性能滞后,需要进行彻底的测试。包装器生成的应用可能看起来像本机应用,但它实际上是运行在查看器中的 web 应用。

一旦你的游戏上市,你就可以开始考虑用它们赚钱的其他方法了。例如,如果你的游戏允许玩家互相对战,你可以引入一种订阅服务,让玩家在支付月费后可以访问你的游戏。玩家可以在你的服务器上存储他们的个人资料和他们在游戏中的成就。

试着想想用你的游戏赚钱的其他方法。有时,让已经拥有庞大关系网的另一方参与进来会有所帮助。为你选择的慈善机构创建一个游戏,并与它分享收益。你将帮助一个慈善机构,同时它将为你做市场营销!另一种试图用你的游戏赚钱的方法是依靠众筹。有专门为游戏众筹的网站,比如 Gambitious ( https://gambitious.com)。如果你打算在 Steam ( http://store.steampowered.com)上发布你的游戏,看看它为游戏开发者提供的出售作品的机制。例如,它有一个名为早期访问的机制,允许人们购买和玩尚未完成的游戏。这可能是一个有用的机制,你可以建立一个玩家网络,获得动力,获得反馈和错误报告,并提供定期的游戏更新。最后,看看 True Valhalla ( www.truevalhalla.com/blog)的博客,里面谈到了很多用 HTML5 游戏赚钱的不同方法。

营销

既然你正在编写自己的游戏,你可能已经开始考虑如何让它们在现实世界中运行。也许你不想仅仅为了成就而创造一个游戏,而是想用它赚点钱。幸运的是,现在发布游戏很容易。对于移动设备,在将游戏导出到特定的移动平台后,您可以将游戏提交到应用商店。如果你通过一个门户网站销售你的游戏,那么这个门户网站将(部分)为你负责营销。当然,你也可以让你的游戏出现在你自己的网站上。

彼得:“如果你看看我们在《愤怒的小鸟》和《T2》之前发布的 51 款游戏,它们实际上都是非常好的游戏。主要的挑战是市场非常艰难。App Store 并不存在——你必须有良好的关系才能把你的游戏推出去。让我们成功的是应用商店。突然之间,任何人都可以使用数字发行,所以你可以创建一个像愤怒的小鸟这样的游戏,并立即分发给粉丝。

但是现在游戏的发行变得如此容易,这又带来了另一个挑战。任何人都可以通过 App Store 发布游戏。因此,有大量的游戏和应用。当然,你需要做出伟大的游戏。但是已经有很多很棒的游戏了。事情是这样的,每有一只愤怒的小鸟,就有许多“不那么”的愤怒的小鸟。“那些游戏中有许多实际上是很棒的游戏,但是没有人知道它们。那么如何让你的游戏脱颖而出呢?以愤怒的小鸟为例,都是关于人物的。而另一方面,这也是一个品牌提出了一个有趣的问题:为什么鸟儿会生气?如果你认真做游戏,你就必须认真做营销和品牌。仅仅制作优秀的游戏是不够的。”

显然,挑战在于让你的游戏可见。在 iOS 和 Android 上,每天都有超过 300 款新游戏出现。大部分都是少数人玩的。如果你为这个游戏创建自己的网站,你将如何吸引访问者?

首先,你需要制作一款优质的游戏。如果游戏不好,人们不会玩它。找其他有其他技能的人来帮助你。不要过于雄心勃勃:你不会创造下一个光环!设定合理的目标。从小而精的游戏开始。不要相信自己的判断:和别人谈论你的游戏,让他们玩原型,以确保玩家确实喜欢它。当你的游戏接近完成时,制定一个营销计划。你可以在任何地方发布关于游戏的消息,制作新闻包,制作视频,向博客和其他网站发送信息,等等。人们只会在听说你的游戏后才会玩。不要期望在你将游戏发布到应用商店后,这种情况会自动发生;你需要制定一个计划。在你的游戏发布之前,建立一个潜在玩家的网络——对你的工作感兴趣的人。为您的公司和/或您正在创建的游戏创建一个脸书群组。一定要和 Twitter 等社交网络上的关注者交流。鼓励其他人玩你的游戏,并写下来。

我在上一节提到了 Steam 上的早期访问机制。这样一个开放的开发机制,从营销的角度来看也是很有趣的。它允许你吸引玩家到你的游戏中,并让他们参与到游戏的开发中来。通过让玩家参与游戏开发的早期阶段,你可以在玩家和游戏之间建立一种非常牢固的纽带,因为他们感觉自己是开发过程的一部分。如果你聪明的话,这些玩家会成为你游戏的销售人员,为你做大量的营销工作。

彼得:“对我们来说,这一切都是为了我们的粉丝和品牌。品牌的力量愤怒的小鸟让我们在广告等传统营销手段上花更少的钱。如果你看看典型的游戏开发工作室,我认为人们没有意识到他们需要在营销上花多少钱。通常,游戏开发成本只是营销费用的一小部分。

我们用我们的游戏和我们在营销方面的行动来建立品牌。我们从非常强势的角色开始,并以此为中心打造品牌。要建立一个品牌,有多少家公司就有多少种不同的方式。如果你看看传统上品牌是如何建立的,你会发现这也开始在游戏行业发生,比如通过电视广告。就游戏而言,这与在任何行业建立品牌没有太大区别。"

最后的想法

这本书涵盖了 Javascript 编程的许多方面。你现在已经在 Javascript 编程,尤其是游戏编程方面打下了坚实的基础。通过阅读马克和彼得的思想,你可能已经意识到,世界变化很快。iOS 和 Android 等操作系统会定期更新新功能。移动设备的速度越来越快。几年前流行的设备现在已经过时了。在这中间是 HTML5 和 Javascript。Javascript 日益重要的一个显著例子是桌面/PC 游戏行星毁灭 ( www.uberent.com/pa),它的整个 GUI 都是用 Javascript 和 HTML5 创建的!预测未来是不可能的,但有一点是肯定的:HTML5 和 Javascript 将会继续存在。我希望这本书能帮助你掌握这门语言,并为你自己探索游戏编程提供一个良好的起点。我将用马克和彼得在采访中说的两件事来结束这本书:

马克:“想想你想要实现什么。例如,你可能只是有一个创造性的想法,你想实施。这和想靠制作游戏谋生是非常不同的目标。很多人玩你的游戏并不总是重要的。制作游戏本身就是一种奖励。”

彼得:“不要盲目复制,而是尝试做不同的事情,而不是做其他人都在做的事情。想想怎么才能从其他几十万游戏中脱颖而出。惊喜和喜悦。给人惊喜不用花什么钱。也就是说,尽可能多地从别人那里学习。然后做好自己的事。”


推荐阅读
  • Barbican 是 OpenStack 社区的核心项目之一,旨在为各种环境下的云服务提供全面的密钥管理解决方案。 ... [详细]
  • 本文深入探讨了JavaScript中实现继承的四种常见方法,包括原型链继承、构造函数继承、组合继承和寄生组合继承。对于正在学习或从事Web前端开发的技术人员来说,理解这些继承模式对于提高代码质量和维护性至关重要。 ... [详细]
  • NFS(Network File System)即网络文件系统,是一种分布式文件系统协议,主要用于Unix和类Unix系统之间的文件共享。本文详细介绍NFS的配置文件/etc/exports和相关服务配置,帮助读者理解如何在Linux环境中配置NFS客户端。 ... [详细]
  • 探索古典密码学:凯撒密码、维吉尼亚密码与培根密码
    本文深入探讨古典密码学的基本概念及其主要类型,包括替换式密码和移位式密码。文章详细介绍了凯撒密码、维吉尼亚密码和培根密码的工作原理及加密解密方法。 ... [详细]
  • 推荐两款实用的网络诊断工具
    大家好,因为一些私事很久没有更新博客了。今天向大家介绍两款非常有用的网络诊断工具——Tracert和Telnet,帮助你更好地理解和解决网络问题。 ... [详细]
  • 在Java应用程序开发过程中,FTP协议被广泛用于文件的上传和下载操作。本文通过Jakarta Commons Net库中的FTPClient类,详细介绍如何实现文件的上传和下载功能。 ... [详细]
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文详细介绍了Java集合框架中的Collection体系,包括集合的基本概念及其与数组的区别。同时,深入探讨了Comparable和Comparator接口的区别,并分析了各种集合类的底层数据结构。最后,提供了如何根据需求选择合适的集合类的指导。 ... [详细]
  • 交互式左右滑动导航菜单设计
    本文介绍了一种使用HTML和JavaScript实现的左右可点击滑动导航菜单的方法,适用于需要展示多个链接或项目的网页布局。 ... [详细]
  • Python数据类型6 字典
    字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包 ... [详细]
  • 本文详细介绍了在使用Socket进行网络编程时,遇到链接器错误`undefined reference to WSAStartup@8`的解决方案,适用于多种开发环境。 ... [详细]
  • 深入解析Android中的SQLite数据库使用
    本文详细介绍了如何在Android应用中使用SQLite数据库进行数据存储。通过自定义类继承SQLiteOpenHelper,实现数据库的创建与版本管理,并提供了具体的学生信息管理示例代码。 ... [详细]
  • 本文探讨了使用Java创建高效且可靠的基准测试的方法,强调了选择合适的工具和理解潜在影响因素的重要性。 ... [详细]
author-avatar
雅婷永幸482
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有