2014-11-25 4 views
0

제스처 인식기를 구현하려고합니다. 다음 단계를로드 할 때까지 모든 것이 잘 작동하고 다음 단계로 넘어갈 때 다음 단계로 넘어갈 수 있습니다. 제스처를 사용하면 프로그램이 충돌합니다.제스처 인식기가 다음 레벨에서 충돌 함

레벨이 완료되면 "다음 레벨 - 다음 단계로 이동하려면 터치"라는 제목이 나타납니다. 제스처 인식기를 추가 할 때까지 탭을하면 레벨이 증가하고 [super initWithSize : size]를 사용하여 동일한 장면을 레벨 번호에 따라 새로운 변수로 나타납니다. 제스처 인식기를 추가하면 "다음 레벨 - 다음 단계로 이동 터치"가 화면에 표시되면서 탭이 여전히 다음 단계로 이동하지만 팬이 앱을 중단시킵니다.

내 제스처 인식기가 아래에 있습니다.

- (void)didMoveToView:(SKView*)view { 

    UIGestureRecognizer *spinner = [[UIPanGestureRecognizer alloc] initWithTarget:self  action:@selector(handlePanGesture:)]; 
    [self.view addGestureRecognizer:spinner]; 

} 



- (void)handlePanGesture:(UIPanGestureRecognizer *)gestureRecognizer { 

    CGPoint velocity = [gestureRecognizer velocityInView:self.view]; 

    if (velocity.y > 0) { 

      NSLog(@"gesture went down"); 

    } else { 

      NSLog(@"gesture went up"); 

    } 
} 

문제는 내가 수준을 증가 시키거나 그래서 여기에 터치를 구현하고있는 방법에있을 수는 접촉이 방법과 수준 증가분 코드를

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    BOMPlayerNode *playerNode = (BOMPlayerNode*)[self childNodeWithName:@"Player"]; 

    if (!self.restart) { 

     for (UITouch *touch in touches) { 
    CGPoint positionInScene = [touch locationInNode:self]; 

    int duration = 1.0; 

    SKAction * actionMove = [SKAction moveTo:CGPointMake(positionInScene.x, positionInScene.y) duration:duration]; 
    [playerNode runAction:actionMove]; 

     } 
    } else if (self.restart && self.nextLevel) { 
     levelCount++; 
     for (SKNode *node in [self children]) { 
      [node removeFromParent]; 
     } 


     BOMGamePlayScene *scene = [BOMGamePlayScene sceneWithSize:self.view.bounds.size]; 
     [self.view presentScene:scene]; 

    } else if (self.restart && self.tryAgain) { 
     for (SKNode *node in [self children]) { 
      [node removeFromParent]; 
     } 


     BOMGamePlayScene *scene = [BOMGamePlayScene sceneWithSize:self.view.bounds.size]; 
     [self.view presentScene:scene]; 
    } 

} 

- (void) update:(NSTimeInterval)currentTime { 

    if (GameOverConditions) { 

     self.tryAgain = YES; 
     self.restart = YES; 
     [self performGameOver]; 

    } else if (NextLevelConditions) { 

     self.restart = YES; 
     self.nextLevel = YES; 
     [self performNextLevel]; 

    } 

} 


- (void) performGameOver { 
    if (!self.gameOverDisplayed) { 
     BOMGameOverNode *gameOver = [BOMGameOverNode gameOverAtPosition:CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))]; 
     self.gameOverDisplayed = YES; 
    } 

} 

- (void) performNextLevel { 
    if (!self.nextLevelDisplayed) { 
     BOMNextLevelNode *nextLevel = [BOMNextLevelNode  nextLevelAtPosition:CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))]; 
     self.nextLevelDisplayed = YES; 
    } 

} 

어떤 도움이 많이 주시면 감사하겠습니다을 시작합니다.

+0

[문서] (https://developer.apple.com/library/IOs/documentation/UIKit/Reference/UIResponder_Class/index.html#//apple_ref/ occ/instm/UIResponder/touchesBegan : withEvent :)'super (공통 사용 패턴)를 호출하지 않고이 메소드를 대체하는 경우, 스텁 (비어있는) 구현으로서 만 터치 이벤트를 처리하는 다른 메소드도 대체해야합니다. ' – Mateusz

+0

@Mateusz에게 답장을 보내 주셔서 감사합니다. 그 뜻을 조금 더 넓힐 수 있습니까? 나는 꽤 이해하지 못한다. 다음 레벨보기가 표시 될 때 충돌이 발생하며 이는 수퍼를 호출하는 것을 포함합니다. –

+0

죄송합니다. 명확하지 않았습니다. 내 제안에 따라 문제가 해결되지 않을 수도 있습니다. 다른 터치 이벤트를 사용하면 작동하지 않을 수도 있습니다. – Mateusz

답변

1

새 장면으로 전환하면 제스처 인식기가 SKView에서 자동으로 제거되지 않습니다. 수동으로 제거해야합니다. 팬 제스처 인식기가 [self handlePanGesture];으로 호출되도록 구성되었습니다. 그러나 새 장면으로 전환하면 self이 릴리스되었습니다. 새 장면에서 팬을 시도하면 이전에 릴리스 된 인식기 처리기가 호출되어 충돌을 일으 킵니다. 이 문제를 해결하려면보기에서 인식기를 제거해야합니다. 여기에 수행하는 방법의 예입니다 그 :

에서
// Add this to your SKScene subclass. It will automatically be called when you 
// transition to a new scene. 
- (void) willMoveFromView:(SKView *)view { 
    // Remove all gesture recognizers from the view 
    for (UIGestureRecognizer *gesture in view.gestureRecognizers) { 
     [view removeGestureRecognizer:gesture]; 
    } 
} 
+0

감사합니다! 이로 인해 문제가 해결되었습니다. 레벨 끝에서 GestureRecognizer를 제거하는 여러 가지 방법을 시도해 보았습니다. 올바른 방법을 제시해 주셔서 감사합니다. –

관련 문제