Domanda

Ho un imageView nella vista. Si muove anche se l'iPhone è fermo da qualche tempo. Perché è così ? Inoltre l'immagine non risponde rapidamente al movimento dell'iphone.

Ecco il mio codice scritto per questo:

Ho anche impostato updateInterval e delegato per l'accelerometro.

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

Qualcuno può darmi una mano per favore?

È stato utile?

Soluzione

Noto un paio di cose nel codice

  • Le prime due istruzioni if ??per avere la posizione entro un certo intervallo dovrebbero essere fatte appena prima che la posizione del cursore sia impostata, altrimenti può accadere che l'immagine sia impostata al di fuori dell'intervallo preferito.

  • ballXVelocity viene calcolato come normalizzato dal valore acceleration.y moltiplicato per il tempo delta. Forse dovresti cercare di moltiplicare quel fattore invece di fare il kVelocityMultiplier nella riga successiva.

  • Poiché l'accelerometro è molto sensibile ed è difficile adattarsi perfettamente al circuito non si ottiene mai un valore perfetto. Invece si dovrebbe provare ad avere una fase di calibrazione e forse usare solo un intervallo valido simile alle prime due istruzioni if.

Altri suggerimenti

Potresti considerare di filtrare i tuoi valori nel modo 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 e accelz sono valori UIAccelerometer.

Quindi puoi fare qualcosa del genere

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

Il movimento dovrebbe essere più bello ora.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top