Question

J'ai un imageView dans la vue. Il bouge même si l'iphone est encore en place depuis un certain temps Pourquoi est-ce? De plus, l'image ne répond pas rapidement au mouvement de l'iphone.

Voici mon code écrit pour cela:

J'ai également défini updateInterval et le délégué pour l'accéléromètre.

#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];
}

Quelqu'un peut-il m'aider s'il vous plaît?

Était-ce utile?

La solution

Je remarque deux choses dans le code

  • Les deux premières instructions if pour que la position se trouve dans une certaine plage doivent être effectuées juste avant que la position du curseur ne soit définie, sinon il peut arriver que l'image se trouve en dehors de la plage préférée.

  • ballXVelocity est calculé normalement à partir de la valeur acceleration.y multipliée par le temps delta. Vous devriez peut-être envisager de multiplier ce facteur au lieu de faire le kVelocityMultiplier sur la ligne suivante.

  • Comme l’accéléromètre est très sensible et qu’il est difficile d’ajuster parfaitement le circuit imprimé, on n’obtient jamais une valeur parfaite. Au lieu de cela, essayez d’avoir une étape d’étalonnage et peut-être n’utilisez qu’une plage valide similaire aux deux premières instructions if.

Autres conseils

Vous pourriez envisager de filtrer vos valeurs à la manière 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 et accelz sont des valeurs UIAccelerometerValues.

Ensuite, vous pouvez faire quelque chose comme

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

Le mouvement devrait être plus agréable maintenant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top