IPhone акселерометр работает даже на ровной поверхности - PullRequest
1 голос
/ 30 ноября 2009

У меня есть изображение в представлении. Он движется, даже если iphone все еще некоторое время. Почему это так ? Также изображение не реагирует быстро на движение iphone.

Вот мой код, написанный для этого:

Я также установил updateInterval и делегат для акселерометра.

#define kVelocityMultiplier 1000;



-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
    if(currentPoint.x < 0)
    {
        currentPoint.x=0;
        ballXVelocity=0;
    }

    if(currentPoint.x > 480-sliderWidth)
    {
        currentPoint.x=480-sliderWidth;
        ballXVelocity=0;
    }
    static NSDate *lastDrawTime;
    if(currentPoint.x<=480-sliderWidth&&currentPoint.x>=0)
    {

        if(lastDrawTime!=nil)
        {
            NSTimeInterval secondsSinceLastDraw=-([lastDrawTime timeIntervalSinceNow]);
            ballXVelocity = ballXVelocity + -acceleration.y*secondsSinceLastDraw;

            CGFloat xAcceleration=secondsSinceLastDraw * ballXVelocity * kVelocityMultiplier;

            currentPoint = CGPointMake(currentPoint.x + xAcceleration, 266);
        }
        slider.frame=CGRectMake(currentPoint.x, currentPoint.y, sliderWidth, 10);
    }
    [lastDrawTime release];
    lastDrawTime=[[NSDate alloc]init];
}

Может кто-нибудь помочь мне, пожалуйста?

Ответы [ 2 ]

1 голос
/ 25 марта 2010

Возможно, вы захотите отфильтровать свои значения способом Apple.

#define kFilteringFactor 0.15

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
accelx = acceleration.x * kFilteringFactor + accelx * (1.0 - kFilteringFactor);
accely = acceleration.y * kFilteringFactor + accely * (1.0 - kFilteringFactor);
accelz = acceleration.y * kFilteringFactor + accelz * (1.0 - kFilteringFactor);}

accelx, accely и accelz - значения UIAccelerometer.

Тогда вы можете сделать что-то вроде

ball.position.x += accelx * ballSpeed * deltaDrawingTime;

Движение должно быть лучше.

0 голосов
/ 30 ноября 2009

Я заметил пару вещей в коде

  • Два первых оператора if, которые должны располагать позицию в определенном диапазоне, должны выполняться непосредственно перед установкой положения ползунка, в противном случае может случиться, что изображение будет установлено за пределами предпочтительного диапазона. *

  • ballXVelocity рассчитывается как нормализованное из значения acceleration.y, умноженного на время дельты. Может быть, вам стоит подумать об умножении этого коэффициента, а не делать kVelocityMultiplier на следующей строке.

  • Так как акселерометр очень чувствителен, и на плате его трудно точно подогнать, невозможно получить идеальное значение. Вместо этого следует попытаться провести некоторую стадию калибровки и, возможно, использовать только допустимый диапазон, аналогичный двум первым операторам if.

...