【问题标题】:Gesture recogniser crashing upon next level手势识别器在下一级崩溃
【发布时间】:2014-11-25 10:33:55
【问题描述】:

我正在尝试实现一个手势识别器,一切正常,直到加载下一个级别,然后在下一个级别阶段,可以点击进入下一个级别,如果我使用手势,程序崩溃。

需要明确的是,当一个级别完成时,会出现一个标题,上面写着“下一个级别 - 触摸以进入下一个级别”。在我添加手势识别器之前,轻按会导致级别增加并使用 [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");

    }
}

问题可能出在我增加关卡或实现触摸的方式上,所以这里是 touches started 方法和关卡增量代码

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

}

任何帮助将不胜感激。

【问题讨论】:

  • 来自documentationIf you override this method without calling super (a common use pattern), you must also override the other methods for handling touch events, if only as stub (empty) implementations.
  • 感谢@Mateusz 的回复,您能否详细说明您认为这意味着什么。我不太明白。当呈现下一级视图时发生崩溃,这涉及调用超级。
  • 对不起,我不清楚。我的建议可能无法解决您的问题。如果您使用其他触摸事件,我只想注意它们可能不起作用。

标签: objective-c uigesturerecognizer levels


【解决方案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];
    }
}

【讨论】:

  • 谢谢!这解决了这个问题。我已经尝试了各种方法在关卡结束时删除 GestureRecognizer,感谢您给了我正确的方法。
猜你喜欢
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多