1

ビューにimageViewがあります。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];
}

誰か助けてくれませんか?

4

2 に答える 2

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);}

accelx、accely、およびaccelzはUIAccelerometerValuesです。

その後、あなたは次のようなことをすることができます

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

動きは今より良くなるはずです。

于 2010-03-25T00:09:04.640 に答える
0

コードにいくつか気づきました

  • 位置を特定の範囲内に収める最初の2つのifステートメントは、スライダーの位置を設定する直前に実行する必要があります。そうしないと、画像が優先範囲外に設定される可能性があります。

  • ballXVelocityacceleration.y値にデルタ時間を掛けたものから正規化されたものとして計算されます。kVelocityMultiplierたぶん、次の行で行うのではなく、その係数を乗算することを検討する必要があります。

  • 加速度計は非常に感度が高く、回路基板に完全にフィットさせるのは難しいため、完全な値を取得することはできません。代わりに、いくつかのキャリブレーションステージを用意し、最初の2つのifステートメントと同様の有効な範囲のみを使用する必要があります。

于 2009-11-30T08:14:23.747 に答える