Frage

Ich habe mein erstes Spiel mit Kernbewegungen und habe ein Problem getroffen und kann nicht herausfinden, was los ist. Ich bin sicher, es wird ein einfaches Problem. Hier ist ein Code:

.h Datei

#import <UIKit/UIKit.h>
#import <CoreMotion/CoreMotion.h>

@interface TempVC : UIViewController {
CMMotionManager *motionManager;
CMAttitude *referenceAttitude;
CMAttitude *attitude;
}
- (void)updateData;
@end

.m Datei

#import "TempVC.h"
#define DEGREES(radians) (radians / M_PI * 180.0)
@implementation TempVC

- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor brownColor];

motionManager = [[CMMotionManager alloc] init]; 
referenceAttitude = nil;

CMDeviceMotion *dm = motionManager.deviceMotion;
attitude = dm.attitude;
referenceAttitude = [attitude retain];

motionManager.deviceMotionUpdateInterval = 0.1;
[motionManager startDeviceMotionUpdates];

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateData) userInfo:nil repeats:YES];

}

- (void)updateData
{
attitude = motionManager.deviceMotion.attitude;
[attitude multiplyByInverseOfAttitude:referenceAttitude];
NSLog(@"\n Roll: %.0f\n Pitch: %.0f\n Yaw: %.0f",DEGREES(attitude.roll), DEGREES(attitude.pitch), DEGREES(attitude.yaw));
}

Dieser Code stürzt ohne wirkliche Hinweis darauf ab, was schief geht. Wenn ich kommentiere

[attitude multiplyByInverseOfAttitude:referenceAttitude];

Alles funktioniert gut ??? Habe ich die Referenz falsch implementiert?

War es hilfreich?

Lösung

Sie greifen vor dem Start von Updates auf die Devicemotion -Eigenschaft von CmmotionManager zu. Dort speichern Sie Ihre Referenzierung, die zu diesem Zeitpunkt noch nicht null ist. Wenn aktualisiertesata später ein paar Millis genannt wird [attitude multiplyByInverseOfAttitude:referenceAttitude]; wird versagen.

Versuchen Sie stattdessen, die Referenzierung auf den ersten Anruf von Updatatata festzulegen, und es sollte funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top