如何在使用Corona SDK时根据用户持有设备的方式来校准加速度计角度?

嗨,大家好,我刚用 Corona SDK 完成了我的应用程序,并且想尝试制作我的第一个游戏。

由于我的第一个应用程序是学习关于加速计的,所以我认为我的游戏也应该使用加速计。

因此,我在屏幕上放了一个小涂鸦,并通过 X 和 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

   -- 在横屏上设置加速计值

   local motionX = 0
   local motionY = 0

   local function onAccelerate( event )
         motionX = 10 * event.yGravity;
         motionY = 10 * event.xGravity;
   end

   Runtime:addEventListener ("accelerometer", onAccelerate);

   -- 使玩家根据倾斜移动。

   local function movePlayer (event)
        player.x = player.x + motionX;
        player.y = player.y - motionY;
   end

   Runtime:addEventListener("enterFrame", movePlayer))

原文链接 https://stackoverflow.com/questions/6182224

点赞
stackoverflow用户142137
stackoverflow用户142137

我们在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-04 02:24:43