使用设备方向和振动 API 进行移动游戏开发

休闲移动游戏的市场正在与不断增长的智能手机市场保持同步。有一些 Web 工具可以帮助像你这样的 Web 开发人员构建与原生游戏竞争的游戏。你需要出色地执行才能从人群中脱颖而出 - 正确使用 JavaScript API 可以提供帮助。对于游戏开发,你需要了解设备方向 API 和振动 API。

Cyber Orb

Cyber Orb 是一个使用 Phaser 框架创建的简单 HTML5 游戏演示。

cyber-orb

我对 Phaser 感兴趣,因为它是一个移动游戏框架,速度快,针对各种移动设备进行了优化,易于使用,此外还有庞大的 Phaser 社区。该框架是开源的,并在 GitHub 上可用,我的 Cyber Orb 演示的 源代码 也是如此。

cyber-orb-github

Phaser 简介 是我撰写的一篇 MDN 文章,它将引导你完成使用 Phaser 构建移动游戏的基本步骤。它展示了设备方向和振动 API 的实际应用 - 以及它们是如何实现的。

使用框架

我使用 Phaser 框架来创建游戏,因为从头开始编码会花费更多时间和精力。Phaser 处理了枯燥且必要的步骤,例如加载资产、在屏幕上操作图像或管理用户输入。它可以帮助你专注于游戏代码和游戏机制,这样你就不用担心浏览器实现之间的差异。以控制为例。在从头开始创建的游戏中,你需要编写类似于以下代码来实现键盘控制

document.addEventListener("keydown", keyDownHandler, false);
document.addEventListener("keyup", keyUpHandler, false);

function keyDownHandler(e) {
    if(e.keyCode == 37) { // left cursor key
        leftPressed = true;
    }
    else if(e.keyCode == 39) { // right cursor key
        rightPressed = true;
    }
}
function keyUpHandler(e) {
    if(e.keyCode == 37) {
        leftPressed = false;
    }
    else if(e.keyCode == 39) {
        rightPressed = false;
    }
}

需要键向上和键向下的事件监听器 - keydown 用于知道何时按下键,keyup 用于管理释放键的情况。你必须记住每个键盘按钮的 keyCode - 例如,左光标键是 37。然后,在主游戏循环中,你可以执行以下操作

if(leftPressed) {
    // move the ball left
}

与其从头开始执行所有操作并记住键代码,不如将其留给 Phaser

this.keys = this.game.input.keyboard.createCursorKeys();

然后

if(this.keys.left.isDown) {
    // move the ball left
}

代码也显得更加简洁明了。

桌面与移动

虽然我们将在本文中重点关注移动设备,但建议首先为桌面构建控制。如果你在桌面上的代码编辑器和浏览器中构建游戏,你可以快速对其进行测试。然后,使用渐进增强方法,可以在桌面控制之上添加移动控制,并使用设备方向 API 查看移动设备上的游戏体验有何不同。

设备方向

设备方向 API 规范仍处于工作草案状态,因此将来可能会引入一些破坏性代码变更。这是一项实验性技术,应谨慎对待。所有实现都仍然缺少 compassneedscalibration 事件。此外,浏览器实现之间存在差异,应予以考虑。例如,Chrome 和 Opera 不支持 devicemotion 事件。

cyber-orb-flame-orientation

要在游戏中使用设备方向 API,你必须添加对 deviceorientation 事件的监听器

window.addEventListener("deviceorientation", this.handleOrientation, true);

然后,所有操作都在 handleOrientation 函数中完成

handleOrientation: function(e) {
    var z = e.alpha;
    var y = e.beta;
    var x = e.gamma;
    Ball._player.body.velocity.x += x;
    Ball._player.body.velocity.y += y;
}

你可以从传递的对象中提取三个变量:alphabetagamma

var z = e.alpha;
var y = e.beta;
var x = e.gamma;

这三个属性包含设备在三维空间中的方向。我们对最后两个属性感兴趣,它们用于控制球体的左右和上下移动。第一个,alpha 变量可用于确定球体的上下移动,使其跳跃。这些值的范围不同:alpha 的范围为 0 到 360,beta 的范围为 -180 到 180,gamma 的范围为 -90 到 90。

在游戏中可以使用这些值,我们可以使用最后两行代码在屏幕上移动球体

Ball._player.body.velocity.x += x;
Ball._player.body.velocity.y += y;

就是这样 - 你可以使用设备方向事件来控制游戏,并可以通过倾斜和移动手机来玩游戏。此 API 可以为游戏增添额外的响应感,并为玩家提供更丰富的体验。

浏览器支持

设备方向 API 在 Firefox 6、Chrome 7、Opera 27 和 Internet Explorer 11 上支持桌面,在 Firefox Mobile 6、Android 3 和 Safari Mobile 4.2 上支持移动设备。

临近事件 API

此外,还有 临近事件 API,如果移动设备中提供临近传感器,则可以在游戏中使用它。这是一个实验性 API,但可以作为你已使用的 API 的有趣补充。API 的实现基于两个事件:deviceproximityuserproximity。第一个事件提供了设备与物体之间的距离的基于值的描述(value 以厘米为单位),而第二个事件提供了基于布尔的描述(near 属性根据距离为 truefalse)。以下是一个示例

window.addEventListener('deviceproximity', function(event) {
    if(event.value < 20) {
        // something is closer than 20 centimeters to the sensor, make action
    }
});

window.addEventListener('userproximity', function(event) {
    if(event.near) {
        // something is near the sensor, perform action
    }
});

它可以用于在通话时关闭屏幕,这样当你将手机靠近耳朵时就不会错误地按下任何东西。在游戏中,它可以作为一种有趣的方式来控制游戏 - 等同于轻触操作。

浏览器支持

临近事件 API 仅在 Firefox 中受支持,但 W3C 文档状态为候选推荐,因此其他浏览器供应商可以毫无问题地实现它。

振动 API

振动 API 是另一个可以提升移动体验的功能。大多数设备都支持它(iOS Safari 和 Opera Mini 除外),并且在 Firefox OS 设备上运行良好。

cyber-orb-flame-vibration

使用振动 API 比使用设备方向 API 更容易 - 你所要做的就是检查 window.navigator.vibrate 函数是否可用,如果可用,则使用它

if("vibrate" in window.navigator) {
    window.navigator.vibrate(100);
}

传递给该函数的参数只有一个 - 振动持续时间。你还可以传递值数组,而不是传递一个值,从而多次振动,例如

window.navigator.vibrate([1000,2000,1000]);

这将使手机振动 1 秒(1000 毫秒),等待 2 秒,然后再次振动 1 秒。如果你想在某个时刻关闭振动,可以将 0[] 作为参数传递

window.navigator.vibrate(0);

这将停止任何实际或将来的振动。

浏览器支持

振动 API 处于提议推荐状态,它在 Firefox 16(从版本 11 开始使用 moz 前缀)、Chrome(使用 webkit 前缀)以及最近的 Opera(从版本 27 开始)上支持桌面,在 Firefox Mobile 11(moz)和 Android(webkit)上支持移动设备。

总结

如你所见,使用这些 API 很简单,但它们可以丰富游戏体验。移动游戏体验不同于桌面体验,你可以利用这一点。游戏可以在没有这些附加功能的情况下运行,但是当实现新的 API 时,它会感觉好很多。

你可以 派生 Cyber Orb 演示自行试玩。它很容易扩展,你可以添加额外的功能并构建一个完整的游戏。如果你在使用 Phaser 框架时需要帮助,可以访问 HTML5 Gamedevs 论坛 并联系社区。此外,还有一个 HTML5 游戏开发入门 列表,其中包含指向各种资源的链接,以及由我运营的 Gamedev.js 每周通讯,其中包含每周游戏开发新闻和资源。

MDN 和知识共享

作为一名开发人员,我已经多次使用 Mozilla 开发人员网络 来寻找编码问题的答案,并且通常能找到答案。MDN 是一个巨大的知识库,但它不必只有一种工作方式 - 它不是只读的。你可以轻松地回馈并与他人分享你的知识和经验。你可以写一些你擅长的内容,以便其他人需要时可以找到它。知识共享是关键,也是我们社区如此友好的原因。

关于 Andrzej Mazur

HTML5 游戏开发人员,Enclave Games 独立工作室创始人,js13kGames 比赛创建者,以及 Gamedev.js 每周通讯出版商。热衷于新兴开放式 Web 技术的技术演讲者,对 WebXR 和 Web 货币化充满热情。

Andrzej Mazur 的更多文章...


6 条评论

  1. Šime Vidas

    Cyber Orb 的基于设备方向的控件在 iOS 的 Safari 上无法正常工作。这是一个已知问题吗?

    2015 年 4 月 8 日 下午 7:06

    1. Andrzej Mazur

      移动 Safari 针对 beta 和 gamma 使用了不同的、切换的范围。Beta 为 (-90,90),gamma 为 (-180,180)。

      2015 年 4 月 8 日 下午 10:49

      1. Šime Vidas

        您能推荐一个支持所有移动平台(包括 Safari)的基于设备方向的控件库吗?

        2015 年 4 月 9 日 上午 8:50

        1. Andrzej Mazur

          我还没有找到一个好的,但我并没有认真地寻找。您可以尝试使用 Full Tilt:https://github.com/richtr/Full-Tilt,但我没有用过它。

          2015 年 4 月 11 日 上午 11:51

  2. subzey

    您还可以使用 Cyber Orb 中的屏幕锁定。
    它至少在移动 Chrome 中可以使用 `screen.orientation.lock(“portrait”)`。

    2015 年 4 月 10 日 上午 2:49

    1. Andrzej Mazur

      是的,这也是一个有趣的 API。我主要关注设备方向 - 振动 API 是作为额外功能添加的,但屏幕方向也可以适合这篇文章。

      2015 年 4 月 11 日 上午 11:52

本文的评论已关闭。