Как запрограммировать плавное движение с помощью акселерометра, как в лабиринтной игре на iPhone OS? - PullRequest
4 голосов
/ 16 февраля 2010

Я хочу иметь возможность реалистично двигать изображение с помощью акселерометра, как это делается в любой лабиринтной игре. Ниже показано, что я имею до сих пор, но это кажется очень нервным и нереалистичным. Кажется, что изображения с шариками никогда не могут остановиться, и они повсюду совершают много нервных движений.

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

deviceTilt.x = 0.01 * deviceTilt.x + (1.0 - 0.01) * acceleration.x;
deviceTilt.y = 0.01 * deviceTilt.y + (1.0 - 0.01) * acceleration.y;
}

-(void)onTimer {

    ballImage.center = CGPointMake(ballImage.center.x + (deviceTilt.x * 50), ballImage.center.y + (deviceTilt.y  * 50));

    if (ballImage.center.x > 279) {

        ballImage.center = CGPointMake(279, ballImage.center.y);
    }
    if (ballImage.center.x < 42) {

        ballImage.center = CGPointMake(42, ballImage.center.y);
    }
    if (ballImage.center.y > 419) {

        ballImage.center = CGPointMake(ballImage.center.x, 419);
    }
    if (ballImage.center.y < 181) {

        ballImage.center = CGPointMake(ballImage.center.x, 181);
    }

Ответы [ 2 ]

3 голосов
/ 16 февраля 2010

Есть ли причина, по которой вы не можете использовать фильтр сглаживания, предоставленный в ответ на ваш предыдущий вопрос: Как использовать скользящее среднее для фильтрации значений акселерометра в iPhone OS ?

2 голосов
/ 16 февраля 2010

Вам необходимо рассчитать скользящее среднее значений. Для этого вам нужно сохранить последние n значения в массиве, а затем выдвигать и извлекать значения из массива при каждом чтении данных акселерометра. Вот некоторый псевдокод:

const SIZE = 10;
float[] xVals = new float[SIZE];

float xAvg = 0;

function runAverage(float newX){
  xAvg += newX/SIZE;
  xVals.push(newX);
  if(xVals.length > SIZE){
    xAvg -= xVals.pop()/SIZE;
  }
}

Вы должны сделать это для всех трех осей. Поиграйте со значением SIZE; чем оно больше, тем более плавное значение, но медленнее реагирует. Это действительно зависит от того, как часто вы читаете значение акселерометра. Если он читается 10 раз в секунду, SIZE = 10 может быть слишком большим.

...