2013-02-16 92 views
3

我正在使用cocos2d在iPhone游戏上工作。我正在尝试使用加速度计在纵向模式下移动精灵来左右移动。出于某种原因,我使用的代码默认为向右移动,除非手机以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 2014-03-28 12:43:42

回答

1

基本上,你的加速度计应该做的是更新加速度(像你这样的过滤因子)。

但在它旁边,你应该保持速度和位置,无论是在你这样的计划步骤(浮动DT)功能适应:

速度+ =加速度* DT 位置+ =速度×DT

为x和y做这件事