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