2013-02-16 35 views
3

Я работаю над игрой для iPhone, используя cocos2d. Я пытаюсь использовать акселерометр для перемещения спрайта в портретном режиме для перемещения влево и вправо. По какой-то причине код, который я использую по умолчанию, перемещается вправо, ЕСЛИ телефон не наклонен под углом 45 градусов, т. Е. Возвращаемые значения положительны (это означает, что он должен двигаться вправо), пока он не будет наклонен под углом 45 градусов , либо влево, либо вправо. Мертвый центр возвращается около 600, а затем уменьшает дальнейшее наклонение телефона влево или вправо, пока он не достигнет 45-градусного угла (где он достигает 0 и начинает отрицательно). Ниже приведен код, который я использую. Любая помощь была бы ВЕЛИКОЙ оценкой.Использование акселерометра iPhone для перемещения спрайта вдоль оси x

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

} 
+0

проверить это для прозрачного решения: http://gamedev.stackexchange.com/questions/33412/accelerometer-to-move-player-left-and-right/33427#33427 – Guru

ответ

1

В принципе, ваш акселерометр должен выполнять обновление ускорения (с таким же фильтрующим фактором, как и вы).

Но рядом с ним вы должны поддерживать скорость и положение, и адаптировать как в вашей функции планируется шаг (флоат дт), как это:

Скорость + = ускорение * дт Позиция + = скорость * дт

Сделайте это для x и y

Смежные вопросы