3

cocos2dを使ったiPhoneゲームをやっています。ポートレートモードでスプライトを左右に動かすために加速度計を使用しようとしています。何らかの理由で、私が使用しているコードでは、電話機が 45 度の角度に傾いていない限り、デフォルトで右に移動します。つまり、返される値はすべて、45 度の角度に傾くまで正です (右に移動する必要があることを示します)。 、左または右。死点は約 600 に戻り、45 度の角度になるまで電話を左右に傾けるにつれて減少します (角度が 0 になり、負になり始める)。以下は私が使用しているコードです。どんな助けでも大歓迎です。

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {

        #define kFilteringFactor 0.75
            static UIAccelerationValue rollingX = 0, rollingY = 0, rollingZ = 0;

            rollingX = (acceleration.x * kFilteringFactor) +
            (rollingX * (1.0 - kFilteringFactor));
            rollingY = (acceleration.y * kFilteringFactor) +
            (rollingY * (1.0 - kFilteringFactor));
            rollingZ = (acceleration.z * kFilteringFactor) +
            (rollingZ * (1.0 - kFilteringFactor));

            float accelX = rollingX;
            float accelY = rollingY;
            float accelZ = rollingZ;

            CGSize winSize = [CCDirector sharedDirector].winSize;

        #define kRestAccelX 0.6
        #define kShipMaxPointsPerSec (winSize.height*0.5)
        #define kMaxDiffX 0.2

            float accelDiffX = kRestAccelX - ABS(accelX);
            float accelFractionX = accelDiffX / kMaxDiffX;
            float pointsPerSecX = kShipMaxPointsPerSec * accelFractionX;

            _shipPointsPerSecX = pointsPerSecX;
            NSLog(@"_shipPointsPerSecX: %f", _shipPointsPerSecX);
}

- (void)updateShipPos:(ccTime)dt {

    CGSize winSize = [CCDirector sharedDirector].winSize;

    float maxX = winSize.width - _ship.contentSize.width/2;
    float minX = _ship.contentSize.width/2;

    float newX = _ship.position.x + (_shipPointsPerSecX * dt);
    newX = MIN(MAX(newX, minX), maxX);
    _ship.position = ccp(newX, _ship.position.y);
   // NSLog(@"newx: %f", newX);

}
4

1 に答える 1

1

基本的に、加速度計がすべきことは、加速度を更新することです(あなたのようにフィルタリング係数を使用して)。

しかし、その次に速度と位置を維持し、次のようにスケジュールされた step(float dt) 関数で両方を適応させる必要があります。

速度 += 加速度 * dt 位置 += 速度 * dt

x と y に対してそれを行います

于 2013-02-16T06:16:36.270 に答える