Как поддерживать постоянство вращения, когда пользователь переворачивает iDevice в ландшафтном режиме? - PullRequest
0 голосов
/ 28 марта 2012

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

Я понял эту часть, но проблема возникает, когдапользователь переворачивает iDevice (из-за гнезда для наушников или расположения динамика), приложение автоматически поворачивается, но перекатывающийся Y устанавливает положение position.x героя для инвертирования.Наклон влево заставляет героя идти вправо, а наклон вправо заставляет героя идти влево.Посмотрев на NSLogs значения ускорения при переключении вокруг iDevice, кажется невозможным перевернуть position.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;

    NSLog(@"accelX: %f, accelY: %f, accelZ: %f", accelX, accelY, accelZ);

    CGSize winSize = [CCDirector sharedDirector].winSize;
#define kRestAccelX 0.6
#define kShipxMaxPointsPerSec (winSize.height * 1.0)
#define kMaxDiffX 0.2

#define kRestAccelY 0.0
#define kShipyMaxPointsPerSec (winSize.width * 0.5)
#define kMaxDiffY 0.2

    float accelDiffX = kRestAccelX - ABS(accelX);
    float accelFractionX = accelDiffX / kMaxDiffX;
    float pointsPerSecX = kShipxMaxPointsPerSec * accelFractionX;

    float accelDiffY = -accelY;
    float accelFractionY = accelDiffY / kMaxDiffY;
    float pointsPerSecY = kShipyMaxPointsPerSec * accelFractionY;

    _shipPointsPerSecX = pointsPerSecY;
    _shipPointsPerSecY = pointsPerSecX;

    CCLOG(@"accelX: %f, pointsPerSecX: %f", accelX, pointsPerSecX);
    CCLOG(@"accelY: %f, pointsPerSecY: %f", accelY, pointsPerSecY);
}

-(void)updateShipPos:(ccTime)dt
{
    CGSize winSize = [CCDirector sharedDirector].winSize;

    float maxX = winSize.width - _ship.contentSize.width;
    float minX = _ship.contentSize.width / 2;

    float maxY = winSize.height - _ship.contentSize.height / 2;
    float minY = _ship.contentSize.height / 2;

    float newX = _ship.position.x + (_shipPointsPerSecX * dt);
    float newY = _ship.position.y + (_shipPointsPerSecY * dt);

    newX = MIN(MAX(newX, minX), maxX);
    newY = MIN(MAX(newY, minY), maxY);

    _ship.position = ccp(newX, newY);
}

Идея в том, что я пытаюсь сделать так, чтобы pointsPerSecY был положительным при наклоне вправо и отрицательным при наклоне влево.Проблема в том, что когда пользователь переворачивает устройство, они переворачиваются, поскольку устройство переворачивается.Есть ли способ сделать так, чтобы он оставался положительным при наклоне вправо и отрицательным влево, независимо от ориентации, при переворачивании, находясь в ландшафте?

1 Ответ

1 голос
/ 28 марта 2012

Как насчет того, чтобы сделать что-то подобное?

if ([[UIApplication sharedApplication] statusBarOrientaion]==UIInterfaceOrientationLandscapeLeft) {
    pointsPerSecY *= -1;
}
...