游戏与 Mozilla Labs 应用项目

在这篇文章中,我将快速概述 Mozilla Labs 应用项目,以及它与 Mozilla 的其他技术如何与游戏相关。我们确实处于一个可以使用完全开放的技术在 Web 上创建令人惊叹的游戏的阶段。

几天前,我们发布了 Mozilla Labs 应用项目 的开发者预览版,这是我们对分布式 Web 应用平台的愿景。这个应用项目与我们改善 Web 的总体使命直接相关,正如 Ragavan Srinivasan 最近所述

作为 Mozilla 使 Web 变得更好的使命的一部分,我们认为应用应该可以在任何现代的 Web 连接设备、操作系统或浏览器上使用,让全球数十亿人能够使用和交互应用。

如今,应用与封闭的生态系统绑定。应用也无法在所有设备上使用;应用中的数据被孤立,无法被其他应用或 Web 服务访问;用户选择受到限制且被低估。

在一个开放的生态系统中,开发人员应该能够使用开放的 Web 技术和资源构建应用。然后,他们应该能够以 Web 提供的覆盖范围、灵活性和选择来分发和销售这些应用。

重要的是要记住,尽管我们经常将应用视为每个都服务于特定任务的软件片段,但它们也可以是游戏。毕竟,如果你忽略掉故事和图形,游戏与你通常认为的应用程序并没有什么不同——它使用相同的平台和编程语言,在本例中是 HTML 和 JavaScript。

那么,Mozilla Labs 应用项目以及我们正在开发的其他技术与开放 Web 游戏有什么关系呢?我希望在接下来的简要概述中阐明这个问题。

请放心,Mozilla 非常专注于使 Web 成为一个更好的开放 Web 游戏平台。

使用 BrowserID 识别玩家

就像 iOS 有 OpenFeint 和 Apple Game Center 等服务一样,Web 上的游戏也需要开放且可靠的玩家识别方法。 BrowserID 是我们解决此问题的方法之一。它允许玩家使用其现有的电子邮件地址登录你的游戏,每个浏览器会话只需输入一次密码。

在你的游戏中实现 BrowserID 是一个简单的三步过程。我建议你查看关于安装的文档,在那里你还会找到一些漂亮的 BrowserID 按钮,向你的玩家表明你支持分布式身份验证。现在 BrowserID 通过 JavaScript 库提供。但在不久的将来,它将内置到 Firefox 中,以提供无缝体验。

以这种方式识别玩家仅仅是提供各种游戏功能的第一步,例如好友列表、排行榜、聊天和多人游戏。

使用全屏 API 创建沉浸式游戏体验

目前 Web 上的游戏缺乏沉浸感的一个原因是,它们看起来就像嵌入到另一个网站中的小方块。为什么它们会感觉这样?因为它们确实只是嵌入到其他网站中的小方块。在午餐时间玩 5 分钟的益智游戏可能在被浏览器 UI 和其他干扰因素包围的小方块中感觉还可以,但第一人称射击游戏或赛车游戏肯定不行。

幸运的是,全屏 API 已经出现以解决此问题。它允许你使任何 DOM 元素填充玩家的整个屏幕,这通常只考虑用于视频。在游戏中使用它可以使游戏体验从 5 分钟的相对乐趣转变为数小时的沉浸式体验。

与大多数 JavaScript API 一样,在你的游戏中实现全屏功能非常简单。你只需要在所需的 DOM 元素上调用 requestFullScreen 方法即可。

var elem = document.getElementById("myGame"); if (elem.requestFullScreen) { elem.requestFullScreen(); } else if (elem.mozRequestFullScreen) { elem.mozRequestFullScreen(); } else if (elem.webkitRequestFullScreen) { elem.webkitRequestFullScreen(); } 

使用鼠标锁定 API 控制鼠标输入

与游戏输入相关的一个问题是鼠标光标行为异常,例如鼠标用于围绕固定点旋转玩家,比如在 3D 第一人称射击游戏中移动视角,或在自上而下的 2D 游戏中旋转玩家。

在这两种情况下,鼠标光标始终可见,这通常很烦人并且会破坏体验。然而,最令人困扰的问题是,当鼠标光标离开浏览器窗口时,所有移动都会停止。当鼠标光标到达屏幕边缘时,在全屏模式下也会发生相同的行为。这对玩家来说是一个非常简单的问题,完全破坏了体验。

好消息是,鼠标锁定 API 已被创建来解决此问题,并且它刚刚出现在 Firefox Nightly 的实验版本中。它的唯一目的是通过隐藏光标并将其锁定在适当位置来控制鼠标,使其不会到达屏幕边缘。这意味着,你不再依赖于相对于浏览器左上角的鼠标位置的 xy 坐标值,而是依赖于相对于鼠标锁定位置的 xy 距离值。

使用鼠标锁定 API 实际上只是调用 navigator.pointer.lock 方法的问题。但是,必须在全屏模式下才能正常工作(并记住使用之前链接的 Firefox 实验版本)。

以下示例将一个 <div> 元素扩展到全屏并同时锁定鼠标

<script> function fullAndLock() { var div = document.getElementById("div"); document.addEventListener("mozfullscreenchange", function() { var pointer = navigator.pointer; if (document.mozFullScreen && document.mozFullScreenElement === div && !pointer.islocked()) { function onMouseLockSuccess() { console.log("Mouse successfully locked"); } function onMouseLockError() { console.log("Error locking mouse"); } pointer.lock(div, onMouseLockSuccess, onMouseLockError); } }, false); div.mozRequestFullScreen(); } </script> <button onclick="fullAndLock();">Mouse Lock</button> <div id="div">Element to receive mouse lock</div> 

这是一个鼠标锁定 API 运行的简短视频,并与非鼠标锁定游戏玩法进行比较,以查看改进效果。

使用 Gamepad API 提供类似控制台的游戏体验

Web 上即将推出的另一个与输入相关的改进是 Gamepad API。键盘和鼠标不再是玩家参与游戏的唯一选择。Gamepad API 现在允许通过 JavaScript 访问各种游戏手柄。这甚至包括一些游戏机控制器,例如 xBox 360 和 Playstation 3 上的控制器(使用第三方驱动程序)!

与鼠标锁定 API 一样,Gamepad API刚刚出现在 Firefox Nightly 的实验版本中,并且使用起来非常简单。结合全屏 API,游戏手柄支持可以真正改变你的游戏体验,将其从网站中的游戏转变为桌面游戏或主机游戏。

要了解何时连接了游戏手柄,你只需要侦听 window 对象上的 MozGamepadConnected 事件即可(请记住使用之前链接的实验版本)。

<div id="gamepads"></div> <script> function gamepadConnected(e) { var gamepads = document.getElementById("gamepads"), gamepadId = e.gamepad.id; gamepads.innerHTML += " Gamepad Connected (id=" + gamepadId + ")"; } window.addEventListener("MozGamepadConnected", gamepadConnected, false); </script> 

接收有关游戏手柄上所有按钮和操纵杆的更新也是侦听事件的问题,或者你可以在需要时手动轮询按钮和操纵杆的状态。查看 Gamepad API 文档input.js 库 以获取更多信息。

下面的视频展示了 Gamepad API 的运行情况,控制着游戏 Rawkets 中的一个角色。

使用 WebSockets 添加实时多人游戏

如果你正在考虑创建多人游戏,那么在此之前,你要么不得不忍受持续的 AJAX 请求带来的延迟,要么不得不转向 Flash。这两个选项都不理想。令人兴奋的是,从去年开始,这种情况已经不再存在,WebSockets 已经出现,允许浏览器和服务器之间进行实时的双向通信。

但是为什么双向实时通信对游戏很重要呢?这意味着你现在可以真正实时地向玩家的浏览器传输数据和从玩家的浏览器接收数据。一个明显的优势是它节省了带宽,不再需要持续的 AJAX 请求来检查新数据。相反,WebSocket 连接保持打开状态,并且数据会在需要时立即推送到玩家或服务器。这非常适合需要每隔几毫秒更新一次的快节奏游戏。最重要的是,WebSockets 的双向特性意味着数据可以同时立即从服务器发送到玩家以及从玩家发送到服务器。

使用 WebSockets 是通过初始化 WebSocket 对象连接到套接字服务器的问题。

var mySocket = new WebSocket("http://www.example.com/socketserver",); 

从那里,你可以使用 WebSocket 对象的 send 方法发送数据。

mySocket.send("Here's some text that the server is urgently awaiting!"); 

你可以通过侦听 WebSocket 对象上的 onmessage 事件来接收数据。

mySocket.onmessage = function(e) { console.log(e.data); } 

游戏通信的完整代码示例超出了本文的范围,但你绝对应该查看我几个月前制作的教程。在其中,我详细介绍了如何使用 Node.js 和 WebSockets 创建实时多人游戏。

使用本地存储和应用程序缓存离线玩游戏

在 Web 上创建游戏很好,但如果你想离线玩游戏怎么办?或者,如果玩家在激动人心的游戏过程中网络连接中断怎么办?如今,大多数开放式 Web 游戏在网络连接失败时最糟糕的情况是停止工作,最好的情况是停止向你的服务器发送数据并保存玩家数据。当你的玩家刷新游戏所在的页面时,他们只会看到一个空白页面,并且他们在离线时取得的所有努力都会丢失。这可能不会让你的玩家感到高兴,而不高兴的玩家并不理想。

今天有一些可用的解决方案可以帮助解决这些问题。第一个是 应用程序缓存,它允许你使用缓存清单声明你希望浏览器缓存以供离线使用的特定资源(如 HTML、CSS、图像和 JavaScript)。不仅如此,浏览器在联机时还会使用文件的缓存版本来加快加载过程。

你可以通过使用 <html> 元素的 manifest 属性在你的游戏中包含缓存清单。

<html manifest="example.appcache"> <h1>Application Cache Example</h1> </html> 

编写缓存清单很简单,你需要遵循简单的格式来声明要缓存的文件。例如,下面的清单在联机时查找 /example/bar,如果你的玩家离线或遇到网络问题,则回退到本地缓存的 example.html 文件。

CACHE MANIFEST FALLBACK: example/bar/ example.html 

缓存清单还有更多内容,因此我建议你阅读文档以详细了解它。

你可以使用的另一种技术是在本地存储玩家的游戏数据,并定期将其与游戏服务器同步。通常,你无法在浏览器中存储足够的数据来实现此目的(例如使用 cookie),但使用 本地存储IndexedDB,你现在可以以结构化的方式存储许多兆字节的数据。

你还可以向你的游戏中添加功能,以便在玩家的网络连接断开时收到警报。 navigator.onLine 属性 允许你使用 JavaScript 查看你的玩家当前是否联机。你还可以使用 offlineonline 事件 在连接发生变化时触发游戏的自动行为,例如停止所有 WebSockets 通信并将玩家数据缓存到本地,直到连接恢复。

使用 WebRT 创建原生操作系统应用程序

Mozilla Labs 应用项目更深远的一个方面是集成了 Web 运行时 (WebRT)。这允许玩家“原生”地安装你的游戏到他们选择的操作系统(目前是 Windows、Mac 和 Android),并像标准操作系统应用程序一样显示启动图标。

Installing Web apps natively

WebRT 还使用以应用为中心的 User Agent(与 Firefox 等以浏览器为中心的 User Agent 相反)运行你的游戏,并使用与玩家用于浏览的普通 Firefox 不同的用户配置文件和操作系统进程运行你的游戏。

WebRT 能够脱离到另一个进程并移除所有浏览器 UI 的能力使游戏体验更加出色。在 Mac 上的 Dock 中拥有一个启动你自己的游戏的“原生”窗口的图标,并且没有任何浏览器痕迹或感觉,这是一种独特的体验。

Rawkets Web app

对于开发者来说,这有点像魔法。它让你摆脱了游戏仅仅是“华丽的网站”的束缚,而是将其转变为一个应用程序,一种独一无二的体验。请记住我的话,这将是网络上5分钟益智游戏向拥有主机级体验的专业级游戏的转变的转折点。

好消息是,在你的游戏中启用WebRT只需要创建一个应用清单,并通过JavaScript调用navigator.mozApps.install 方法

这是一个来自Rawkets游戏的应用清单示例

{ "name":"Rawkets", "developer": { "name":"Rob Hawkes", "url":"http://rawkes.com" }, "description":"Space shooter game.", "icons": { "16": "/style/img/icon-16.png", "48": "/style/img/icon-48.png", "128": "/style/img/icon-128.png" }, "launch_path": "/index.html", "installs_allowed_from": ["*"] } 

正如你所看到的,它是一个简单的JSON结构。然后你需要在调用navigator.mozApps.install 方法时传递该清单文件。

function installCallback(result) { // great - display a message, or redirect to a launch page } function errorCallback(result) { // whoops - result.code and result.message have details } navigator.mozApps.install( "http://rawkets.dev:8000/manifest.webapp", installCallback, errorCallback ) 

这是最基本的实现方式,它会导致一个面板在玩家的浏览器中弹出,询问他们是否要安装你的游戏,以及他们是否希望该安装成为一个原生应用(就像上面的截图一样)。

通过Mozilla Labs Apps项目将你的热情转化为收益

最后,关于Apps项目我想讨论的最后一件事是如何从你的游戏中赚钱。说实话,如果你不能从中谋生,那么你很难长时间坚持下去。

对于Mozilla应用商店,我们使用PayPal作为支付提供商。你只需要在商店里设置一个价格,剩下的事情就会自动发生,当人们开始购买你的游戏时——你将开始在你的PayPal账户中收到款项。

将来,你将能够在自己的网站或其他商店提供你的游戏,并在那里收费。这意味着你将能够使用自己的支付提供商。

初探皮毛

这些技术在使用开放技术在网络上创建游戏方面仅仅是触及了皮毛。在Mozilla,我们正在努力为你提供这些API和服务,以帮助让网络成为一个更适合游戏的场所。2012年将是游戏规则的改变者,这是肯定的(双关语)。

请关注此博客,因为随着我们的游戏技术和Apps项目的成熟,我们一定会发布更多更新和指南。

同时,以下是一些获取有关Mozilla Labs Apps项目和Mozilla游戏开发的额外信息的资源:

关于 Robin Hawkes

Robin热衷于通过代码解决问题。他是一位数字玩家,Pusher的开发者关系负责人,前Mozilla布道师,书籍作者,以及一位英国人。

更多Robin Hawkes的文章…


10条评论

  1. Francois MAROT

    关于Gamepad API,我快速浏览了一下,感觉很棒。但我很好奇:通过此API能够轮询Gamepad状态,但不能轮询键盘状态,这不是不合理吗?
    据我所知,目前还没有标准的API来轮询键盘状态。如果一个游戏必须用一种方式处理Gamepad,而用另一种方式处理键盘,这将非常奇怪…

    我记录了一下,我编写了一个小工具来在js中进行键盘状态轮询,但在Firefox中,当在游戏循环和requestNextAnimation帧事件中使用时,似乎不会实时调用:https://github.com/fmarot/Misc/blob/master/javascript_gamequery_simple/js/libs/kberty.js

    您是否知道是否可以将这样的键盘API集成到Gamepad API中?

    2011年12月19日 05:54

    1. Rob Hawkes

      您好Fancois,感谢您的评论。我知道键盘轮询是讨论过的事情,但到目前为止,我并不知道结果。我相信大家认为能够以这种方式轮询键盘将是有益的。

      在做出更明确的决定之前,您可以加入irc.mozilla.org上的#paladin频道,与正在开发Gamepad和其他游戏相关API的开发人员进行交流。

      2011年12月19日 08:03

  2. Randell Jesup

    未来,Firefox将推出WebRTC,它将扩展WebSockets的功能,允许点对点链接(更低的延迟,更低的服务器开销,对游戏开发者来说),用于数据通道,并允许浏览器/玩家之间进行点对点音频和视频。此外,数据通道应提供可靠和不可靠(类似UDP)以及部分可靠(有限重试)的通道类型,此外它还可以允许无序交付。

    (我是Mozilla WebRTC的首席工程师,也是定义和实现WebRTC的IETF和W3C小组的成员。)

    http://webrtc.org/

    2011年12月19日 13:31

  3. sung

    我有点担心将PayPal作为主要的支付提供商。我的外国朋友总是抱怨无法使用PayPal支付。

    2011年12月20日 20:20

    1. Justin Scott

      您好Sung,

      我们选择PayPal作为主要支付选项的主要原因之一是它广泛的国际支持。如果您的朋友无法使用它,我很想知道他们来自哪些国家以及任何详细信息,因为我们希望确保应用在尽可能多的地区可用。谢谢。

      2011年12月22日 04:19

      1. sung

        您好,

        我的朋友住在欧盟,我最初是在谈论Kickstarter以及他们如何不允许国际捐赠者时听到这个抱怨的。

        现在我仔细想了想,问题可能出在KS平台本身,因为我一直在处理在eBay等平台上使用PayPal的国际卖家…

        2011年12月22日 12:08

  4. pete

    请不要,Firefox最不需要的就是变得更臃肿,运行更慢。

    2011年12月22日 09:39

    1. Rob Hawkes

      您好Pete。是什么让您认为此功能会使Firefox变得臃肿并使其运行缓慢?如果说有什么变化的话,那就是Firefox在每次发布时都变得更快了。

      2011年12月22日 10:00

  5. Gabe

    所有这些项目看起来都很棒,并开启了一系列可能性。这令人兴奋。我想知道您与Google和其他主要浏览器供应商的合作程度如何。我在netmagazine.com上读到您正在与Google密切合作,这意味着Google是否会为Chrome提供与Firefox类似的应用?据我所知,微软正在缓慢地实施HTML5,因为他们希望标准完成(以便知道如何打破它),但您对他们参与Web游戏开发的情况了解多少?祝你好运,圣诞快乐!

    2011年12月23日 08:34

  6. Mike

    如果我们不想拥有一个主要服务器端组件,该组件依赖于用户在线并经过身份验证,该怎么办?如果我们使用具有离线功能的WebRT,开发者如何保护游戏或应用?

    我不确定应用开发在不解决保护问题的情况下如何才能认真开展。我完全支持开放性和使用Web技术开发应用,但让我们现实一点。这在美国可能有效,但如果我们试图在中国等国家通过网络应用赚钱,我们实际上是在免费赠送所有代码,人们会很乐意复制它,最终我们只会拥有少量付费用户。

    2012年5月30日 23:03

本文的评论已关闭。