2

大家好,我刚刚使用 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))
4

1 回答 1

1

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 和 zGravity 的余切。否则,只有当设备水平时,运动才会感觉“真实”(zGravity 常数为 -1)。

于 2011-06-04T02:24:43.583 回答