2015年11月24日
教程:使用移动/远程加速计
关于新的 Apple TV Remote 的一个很酷的事情是它内置了加速计,类似于移动设备,这使您可以测量设备在空间中的位置/方向。本质上,在移动设备或遥控器上,加速计基于设备的朝向和中心点进行三个离散测量。
加速计事件
加速计事件 返回几个有用的值,包括:
- event.name — 此属性始终为
"accelerometer"
。 - event.isShake — 如果检测到设备的快速移动,则此属性为
true
。 - event.xGravity / event.yGravity / event.zGravity — 这些事件可能是最有用的。它们是标准化的,因此您获得的值介于
-1.0
和1.0
之间。这些值也经过平滑处理,以调整微小移动并防止动作生涩。 - event.xInstant, event.yInstant, event.zInstant — 这些值报告自上次事件以来的变化,例如当前
event.xGravity
减去上次的event.xGravity
。 - event.xRaw, event.yRaw, event.zRaw — 这些值是来自设备的实际值(没有应用过滤或平滑处理)。
- event.deltaTime — 加速计事件以一定程度上可预测的间隔出现,具体取决于 system.setAccelerometerInterval() 函数设置的值,但不保证按时到达。 这就是 event.deltaTime 的用武之地。它允许您获取事件之间的时间,以便您可以根据需要提供额外的平滑处理。
所有“重力”、“瞬时”和“原始”值都假设设备以“纵向”方向握持。这对于握持 Apple TV Remote 的人来说非常常见(遥控器像传统的电视/音频遥控器一样握持)。但是,如果您正在设计一个横向应用,例如赛车游戏,您可能希望遥控器以“横向”方向握持(如传统的游戏机控制器),以便模拟方向盘。 在这种情况下,您应该将值调整 90 度。
实施
让我们看一下加速计的简单实现。此应用程序将创建一个蓝色圆圈,并允许您通过移动/定向设备在屏幕上移动它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
display.setDefault( "anchorX", 0 ) local dot = display.newCircle( display.contentCenterX, display.contentCenterY, 20 ) dot:setFillColor( 0, 0, 1 ) dot.color = "blue" dot.anchorX = 0.5 local xGravityLabel = display.newText( "xGravity:", 10, 15, native.systemFontBold, 12 ) local yGravityLabel = display.newText( "yGravity:", 10, 31, native.systemFontBold, 12 ) local zGravityLabel = display.newText( "zGravity:", 10, 47, native.systemFontBold, 12 ) local xGravity = display.newText( "", 80, 15, native.systemFont, 12 ) local yGravity = display.newText( "", 80, 31, native.systemFont, 12 ) local zGravity = display.newText( "", 80, 47, native.systemFont, 12 ) local xInstantLabel = display.newText( "x瞬时值:", 250, 15, native.systemFontBold, 12 ) local yInstantLabel = display.newText( "y瞬时值:", 250, 31, native.systemFontBold, 12 ) local zInstantLabel = display.newText( "z瞬时值:", 250, 47, native.systemFontBold, 12 ) local xInstant = display.newText( "", 330, 15, native.systemFont, 12 ) local yInstant = display.newText( "", 330, 31, native.systemFont, 12 ) local zInstant = display.newText( "", 330, 47, native.systemFont, 12 ) local function onTilt( event ) xGravity.text = event.xGravity yGravity.text = event.yGravity zGravity.text = event.zGravity xInstant.text = event.xInstant yInstant.text = event.yInstant zInstant.text = event.zInstant dot.x = dot.x + event.xGravity dot.y = dot.y + event.yGravity if dot.x > display.contentWidth then dot.x = display.contentWidth end if dot.x < 0 then dot.x = 0 end if dot.y > display.contentHeight then dot.y = display.contentHeight end if dot.y < 0 then dot.y = 0 end if event.isShake then if dot.color == "blue" then dot:setFillColor( 1, 0, 0 ) dot.color = "red" else dot:setFillColor( 0, 0, 1 ) dot.color = "blue" end end return true end Runtime:addEventListener( "accelerometer", onTilt ) |
对于这个简单的例子,我们创建一个点(圆形),将其颜色设置为蓝色,并设置一些文本显示对象来显示从加速度计事件接收到的值。
加速度计事件需要一个监听器函数,由我们的 onTilt()
函数提供。在该函数内部,我们根据当前的加速度计数据更新屏幕上的值。
接下来,我们将 event.xGravity
和 event.yGravity
的值添加到点的 x 和 y 位置。这将使点在屏幕上移动。在此之后,我们编写四个条件语句,将点限制在屏幕边界内。
在该函数的最后一个代码块中,我们测试设备是否被摇晃,并且每次检测到摇晃时,都将颜色在红色和蓝色之间切换。
最后,在示例的最后一行,我们启用 "accelerometer"
事件处理程序。
结论
使用加速度计是使您的应用程序在 tvOS 上正常运行的重要组成部分 — 毕竟,并非所有控制方案都可以通过简单的上/下/左/右按键事件或轴输入来实现。例如,考虑像“水果忍者”这样的经典游戏。在移动设备上,您无法使用加速度计来切水果,但是现在有了支持加速度计的遥控器,您可以通过跟踪加速度计的值来检测切削动作。
Andreas
发布于 23:25,11 月 24 日你好,Rob,
谢谢,这太完美了!我几乎完成了将 “Freeze! 2 – Brothers” 从纵向移植到横向并添加按键控制的工作,加速度计的实现将是我接下来的任务。你的时机太棒了!
最好,
Andreas
Tobias
发布于 05:09,11 月 26 日非常有用的信息 - 非常感谢!迫不及待地想将我们的第一个游戏移植到 Apple TV!
使用 Corona SDK 的加速器 - LuizTools
发布于 15:30,7 月 5 日[…] * 基于原始教程创建:教程:使用移动/远程加速度计 […]