2012-03-28 5 views
0

In meiner App, ich bin das Spiel ist für den Querformat-Modus eingestellt, so dass der Benutzer in der Lage sein, das Gerät mit dem Spiel automatisch drehen, um den Winkel zu drehen. Wenn der Benutzer das Gerät nach rechts kippt, bewegt sich der Held nach rechts, und wenn er nach links geneigt wird, geht der Held nach links.Wie kann ich den Y-Wert konstant halten, wenn der Benutzer im Querformat über das iDevice blättert?

Ich habe diesen Teil herausgefunden, aber das Problem kommt herein, wenn der Benutzer das iDevice umdreht (wegen der Kopfhörerbuchse oder Platzierung des Lautsprechers), wird die App automatisch gedreht, aber der RollingY setzt den Helden Position.x wird invertiert. Wenn du links kippst, wird der Held nach rechts und nach rechts kippt der Held nach links. Nach dem Betrachten der NSLogs des accelY-Werts beim Umblättern des iDevice scheint es nicht möglich zu sein, die Position umzukehren, wenn man rotiert.

Ich denke, das ist eher eine mathematische Frage.

Hier ist mein Code:

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

Die Idee ist, ich versuche, es zu machen, so dass pointsPerSecY positiv ist, wenn nach rechts kippen und negativ, wenn nach links geneigt. Das Problem ist, wenn der Benutzer das Gerät dreht, werden sie invertiert, da das Gerät umgedreht wird. Gibt es eine Möglichkeit, es so zu gestalten, dass es positiv bleibt, wenn es nach rechts und nach links geneigt wird, egal wie die Ausrichtung ist, wenn es in der Landschaft gedreht wird?

Antwort

1

Wie wäre es, so etwas zu tun?

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

Wow, das hat den Trick gemacht! Ich wusste nicht, dass Sie überprüfen können, in welche Richtung die Ausrichtung zeigt. Vielen Dank! – rizzlerazzle

Verwandte Themen