В моем приложении я настроен на альбомный режим, позволяющий пользователю переворачивать устройство с помощью автоматического поворота игры в соответствии с углом.Когда пользователь наклоняет устройство вправо, герой перемещается вправо, а когда наклоняется влево, герой идет влево.
Я понял эту часть, но проблема возникает, когдапользователь переворачивает 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 был положительным при наклоне вправо и отрицательным при наклоне влево.Проблема в том, что когда пользователь переворачивает устройство, они переворачиваются, поскольку устройство переворачивается.Есть ли способ сделать так, чтобы он оставался положительным при наклоне вправо и отрицательным влево, независимо от ориентации, при переворачивании, находясь в ландшафте?