2014-10-07 2 views
0

그래서 Sprite Kit에서 iOS 게임을 디자인 해오고 있습니다. 최근에 내 캐릭터가 화면의 기울기에 의해 제어되도록 CMMotionManager을 프로젝트에 추가했습니다. 내가 방법 beginMotionSensingswitchToLiveSensing을 서면으로 작성했습니다, 나는 그런 싱글 톤을 통해 내 CMMotionManager를 사용 가능하게 만드는 방법은 무엇입니까?

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

을 내 initWithSize 방법 : 그것은 몇 가지 손보는했다 그러나 나는 그것이 작동있어, 여기에 내가 그것을 구현 한 방법입니다. 첫 번째는 휴대 전화가 어떻게 개최되고 두 번째 게임이 게임 자체를 시작하는지에 대한 아이디어를 얻기위한 것입니다. SKActions을 사용하여, 나는 첫 번째 메소드를 호출하고 잠깐 기다렸다가 두 번째 메소드를 호출한다. 그들은이 같은 모양 :

-(void)beginMotionSensing{ 

    CMDeviceMotion *deviceMotion = self.motionManager.deviceMotion; 
    CMAttitude *attitude = deviceMotion.attitude; 

    self.referenceAttitude = attitude; 

    [self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) { 
     [self setNull:motion]; 
    }]; 

    self.motionManager.deviceMotionUpdateInterval = .3; 

} 

하고,

-(void)switchToLiveSensing{ 
    gameIsLive = YES; 
    [self.motionManager stopDeviceMotionUpdates]; 

    [self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) { 
     [self captureRoll:motion]; 
    }]; 
    self.motionManager.deviceMotionUpdateInterval = .02; 

} 

그래서 내가 한 번 이상 게임이 더 재생할 수있는 기능을 추가 할 때까지,이 모든 설정하고 큰 일하고 있었다. 이 전에는 앱을 종료하고 게임을 종료 할 때 게임을 종료해야했습니다. 분명히 이것은 귀찮았습니다. 그래서 다시 돌아가서 게임 장면을 재생할 수있는 능력을 가진 "게임 오버"장면을 추가했습니다. 게임 장면은 다음과 같이 다시 제시 : 나는 싱글에 대해 이전 게시물에 사람이 말하는 것을 기억했다

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    SKTransition *transition = [SKTransition fadeWithColor:[UIColor colorWithRed:147.0/255.0 green:213.0/255.0 blue:216.0/255.0 alpha:1.0] duration:2.0f]; 
    MyScene *gameScene = [MyScene alloc]; 
    gameScene = [gameScene initWithSize:self.frame.size passedInFuel:100]; 
    [self.view presentScene:gameScene transition:transition]; 
} 

- 주석이 CMMotionManager를 구현하는 사람에 지시했다. 그들은 "아마도 클래스를 두 번 이상 초기화하려고한다면 싱글 톤을 통해 접근 가능하도록 만들어야 할 것입니다." 음, 물론, 그게 내가 지금하고있는 일이야. 나는 게임을 할 때까지 이것을 잊어 버렸고 전화가 갑자기 내 기울임을 무시하는 것처럼 보였고 그 과정에서 내 성격을 죽이는 자신의 사업과 함께 갔다. 그 이후로는 발생하지 않았지만 분명히 고쳐야 할 부분입니다.

이 소위 "싱글 톤"을 구현하는 데 도움을 줄 수 있습니까? 당신의 SKScene이 사라질 때 CMMotionManager 객체가 어쨌든 해제해야으로

답변

0
  1. I이, 당신이 가지고 있던 문제입니다 확신 아니에요. 게임 종료 후 게임을 다시 시작하여 문제를 복제 할 수 있습니까?

  2. 메인 뷰/탐색 컨트롤러에 클래스 메서드를 추가하여 싱글 톤을 만든 다음 SKScene 개체에서 사용할 수 있도록 만들 수도 있습니다.

+ (CMMotionManager *)sharedInstance 
{ 
    static CMMotionManager *sharedCMMM = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedCMMM = [[CMMotionManager alloc] init]; 
     // Do any other initialisation stuff here 
    }); 
    return sharedCMMM; 
} 
+0

내가 올바르게 당신을 이해한다면, 나는 이것에 대해 걱정할 필요가 없다고 말하고 있습니까? 애플은 어떤 이유로 프로젝트 당 한 번만 CMMotionManager를 생성 할 것을 권장합니까? 나는 게임을 다시 시작하려고 시도했지만 같은 문제를 반복하지 못했습니다. – Todd

+0

저는 ** 부하를 짐작하고 있습니다. 실시간 데이터가 비싸고, 각 관리자 인스턴스에 대한 생성 시간과 종료 시간이 될 수도 있습니다. – Craig

+0

나는 오늘 게임을 다시 시험하고 있었고 같은 결점이 발생했다. 게임 도중 (무작정) 게임 중에 무작위로 발생하는 것처럼 보입니다. 기본적으로 자이로가 내 말을 듣지 않고 다른 누군가가 무작위로 움직이는 것처럼 보입니다. 섬뜩하다.귀하의 코드를 구현했지만 오류가 발생했습니다. – Todd

관련 문제