2010-02-16 2 views
4

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

- (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

Вам необходимо рассчитать среднее значение. Для этого вам нужно сохранить последние значения 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 может быть слишком большим.

3

Есть ли причина, по которой вы не можете использовать сглаживающий фильтр, предоставленный в ответ на ваш предыдущий вопрос: How do you use a moving average to filter out accelerometer values in iPhone OS?

+0

его другой вопрос, который сгладил общее движение и пытался что-то предложить, но он не работал так, как я хотел, потому что меньшие движения действительно убогие – DotSlashSlash