2009-11-30 3 views
1

У меня есть изображение в представлении. Он перемещается, даже если iphone все еще на некоторое время. Почему это так ? Также изображение не реагирует быстро на движение 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]; 
} 

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

ответ

0

Я заметил несколько вещей в коде

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

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

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

1

Вы можете подумать о том, чтобы отфильтровать ваши ценности по образцу 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);} 

ускорение, accely и ускорение UIAccelerometerValues.

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

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

движение должно быть лучше прямо сейчас.

Смежные вопросы