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