目标C - 触摸第一个SKnode时如何禁用第二个Sknode上的触摸

时间:2017-04-16 05:20:24

标签: ios objective-c sprite-kit skspritenode

我有两个接收触摸的 SKNodes,RMnode和RLnode,。不幸的是,在同一时间。

我尝试在第一次触摸时禁用触摸第二个SKnode ,反之亦然,但由于某种原因它似乎无法正常工作。

还有其他方法吗?

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

for (UITouch *touch in touches) {
    CGPoint Rubyposition = [touch locationInNode:self];
    [self selectNodeForTouch:Rubyposition]; //a helper method that asks the scene (self) for the node that is on the position touchLocation.

    SKNode *RMnode = [self nodeAtPoint:Rubyposition];
    SKNode *RLnode = [self nodeAtPoint:Rubyposition];

    if ([RLnode.name isEqualToString:@"Ruby1"]) {
        if(_TouchOnRubyRL == NO){
            _TouchOnRubyRL = YES;
            //RMnode.userInteractionEnabled = NO; //Not working
            [self.level ActivatedBricks:_TouchOnRubyRL];
        }
        else if(_TouchOnRubyRL == YES){
            _TouchOnRubyRL = NO;
            //RMnode.userInteractionEnabled = YES; //not working
            [self.level ActivatedBricks:_TouchOnRubyRL];
        }
    }
    if ([RMnode.name isEqualToString:@"Ruby2"]) {
        if(_TouchOnRubyRM == NO){
            _TouchOnRubyRM = YES;
            //RLnode.userInteractionEnabled = NO; //Not working
            [self.level ActivatedBricks:_TouchOnRubyRM];
        }
        else if(_TouchOnRubyRM == YES){
            _TouchOnRubyRM = NO;
            //RLnode.userInteractionEnabled = YES; //Not working
            [self.level ActivatedBricks:_TouchOnRubyRM];
        }
    }
}
}

1 个答案:

答案 0 :(得分:0)

设置节点的userInteractionEnabled的原因并不像你期望的那样是你的touchesBegan在场景中,而不是精灵。 userInteractionEnabled只允许/不允许触摸SKNode它是一个属性(SKScene也是一个SKNode) - 并且在你的代码中,场景的userInteractionEnabled总是为真所以触摸总是通过场景的touchesBegan方法(你的精灵的touchesBegan 被禁用 - 但你没有覆盖它,所以你没有注意到。)

要以这种方式使用userInteractionEnabled,您需要对sprite本身进行子类化并处理子类精灵中的触摸 - 然后设置userInteractionEnabled将按预期工作。

如果您不想像这样重构代码,可以用其他方式将每个精灵标记为“不可触摸”(this SO answer建议使用SKNode现有的zPosition属性)然后在场景中使用它接受触摸(例如,如果touchNode.zPosition!= 0 ...)。