Использование акселерометра iPhone для перемещения спрайта по оси x
Я работаю над игрой для iPhone, используя cocos2d. Я пытаюсь использовать акселерометр для движения спрайта в портретном режиме, чтобы двигаться влево и вправо. По какой-то причине с кодом, который я использую, он по умолчанию перемещается вправо, ЕСЛИ телефон не наклонен под углом 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);
}
1 ответ
По сути, ваш акселерометр должен обновлять ускорение (с таким коэффициентом фильтрации, как вы).
Но рядом с ним вы должны поддерживать скорость и положение, и адаптировать обе функции в запланированном шаге (float dt) следующим образом:
Скорость += ускорение *dt Position += скорость * dt
Сделай это для х и у