如何使用Corona SDK根据用户手持设备的方式校准加速度计角度



嘿,伙计们,我刚刚用Corona SDK完成了我的应用程序,我想试着制作我的第一个游戏。

当我的第一个应用程序正在学习加速度计时,我认为我的游戏也应该使用它。

所以我在屏幕上放了一个小涂鸦,让加速度计在X和Y方向控制他,游戏是横向的,但如果我把设备朝我倾斜,涂鸦就会在Y方向从屏幕上滑下来。

如果我躺在床上或懒洋洋地躺在沙发上,那么游戏就无法玩了。

如何编写补偿这个角度的函数?

这是我目前对加速度计的代码;

   display.setStatusBar(display.HiddenStatusBar)
   system.setAccelerometerInterval( 50 )
   _W = display.contentWidth
   _H = display.contentHeight
   local player = display.newImageRect("doodle.png", 64, 64)
         player:setReferencePoint(display.CenterReferencePoint)
         player.x = _W/2
         player.y = _H/2
   -- Set up the Accelerometer values in Landscape
   local motionX = 0
   local motionY = 0                
   local function onAccelerate( event )
         motionX = 10 * event.yGravity;
         motionY = 10 * event.xGravity;
   end
   Runtime:addEventListener ("accelerometer", onAccelerate);
   -- Make the player move on tilt.
   local function movePlayer (event)
        player.x = player.x + motionX;
        player.y = player.y - motionY;
   end
   Runtime:addEventListener("enterFrame", movePlayer))

我们在ArdentHD方面也面临着类似的挑战。

基本上,您需要做的是校准"静止"的X、Y和Z值。启动游戏后,继续读取加速度计几秒钟。在此期间,您可以显示倒计时或其他内容来安慰用户。

分别计算X、Y和Z的平均值。这些是表示"静止"设备的值。

因此,当用户将设备直立时,您将得到X=0、Y=-1和Z=0。(如果设备在背面,则X=0,Y=0,Z=-1)把它们保存在某个地方。例如:

xOffset = event.xGravity
yOffset = event.yGravity
zOffset = event.zGravity

现在,不是执行

motionX = 10 * event.yGravity;
motionY = 10 * event.xGravity;

在移动计算功能中,执行

motionX = 10 * (event.yGravity - xOffset);
motionY = 10 * (event.xGravity - yOffset);

这将清除原始位置。

此外,请注意,如果您想真正将设备旋转360°,则需要将motionX和motionY计算为xGravity和zGravity以及yGravity和z Gravity的余切。否则,只有当设备处于水平状态时(zGravity常数为-1),运动才会感觉"真实"。

最新更新