IPhone akcelerometr pracuje i v rovném povrchu

hlasů
1

Mám imageView v pohledu. Pohybuje se to i v případě, že iPhone je ještě nějakou dobu. Proč je to tak ? Také obraz nebude rychle reagovat na pohyb iPhone.

Zde je můj kód napsaný pro toto:

Také jsem nastavit updateInterval a delegáta akcelerometru.

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

Může mi někdo pomoci, prosím?

Položena 30/11/2009 v 08:48
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Všiml jsem si pár věcí v kódu

  • První dvě if mít pozici v určitém rozmezí by mělo být provedeno bezprostředně před polohou jezdce je nastaven, jinak se může stát, že obraz bude nastavena mimo výhodného rozmezí.

  • ballXVelocityse vypočítá jako normalizované z acceleration.yčasů hodnoty té době delta. Možná byste se měli podívat do vynásobením tento faktor namísto dělá kVelocityMultiplierna dalším řádku.

  • Vzhledem k tomu, akcelerometr je velmi citlivá a je těžké, aby se perfektně sedí na circuitboard jeden nikdy dostat perfektní hodnotu. Namísto toho bychom měli snažit mít nějaký kalibrační fázi a možná použít pouze platný rozsah podobnou prvních dvou if.

Odpovězeno 30/11/2009 v 09:14
zdroj uživatelem

hlasů
1

Dalo by se uvažovat o filtrování hodnot Apple cesta.

#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 a accelz jsou UIAccelerometerValues.

Pak si můžete udělat něco jako

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

Pohyb by měl být hezčí nyní.

Odpovězeno 25/03/2010 v 01:09
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more