Как откалибровать угол акселерометра исходя из того, как пользователи держат устройство с 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))

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).

Другие вопросы по тегам