Как откалибровать угол акселерометра исходя из того, как пользователи держат устройство с Corona SDK? - PullRequest
2 голосов
/ 31 мая 2011

Эй, ребята, я только что закончил свое приложение с 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 Ответ

1 голос
/ 04 июня 2011

Мы столкнулись с аналогичной проблемой для 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...