2017-04-16 63 views
0

我有两个SKNodes,RMnode和RLnode,接收触摸。不幸的是,在同一时间。Objective C - 如何在第一个SKnode被触摸时禁用第二个Sknode的触摸

我曾尝试禁用触摸第二个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]; 
     } 
    } 
} 
} 
+0

selectNodeForTouch实际上做了什么 - 这是不明确的。这个显示方法在哪里?在场景中还是在节点上?两个节点是否都在触摸位置?在处理程序中更改userInteractionEnabled不会改变对当前触摸的反应 - 事件已经触发,因此只能影响将来的事件。你能否更详细地解释你有什么节点,以及当他们被触摸时想要发生什么。 –

+0

@AliBeadle辅助方法在场景中。它是位于touchLocation位置的节点询问场景(self)的帮助方法。然后if语句检查所选节点是否是2个ruby节点之一,并“激活”或“停用”它。现在,我只想要禁用其中一个节点的触摸,如果另一个先被触摸,反之亦然。即触摸第一个红宝石 - >禁用第二个红宝石节点的触摸。第一个红宝石第二次触摸 - >启用第二个红宝石节点,反之亦然。 – Chriss1979

回答

0

设置节点的userInteractionEnabled的原因不起作用,因为您期望的是您的touchesBegan位于场景中,而不是sprite。 userInteractionEnabled只允许/不允许触摸到SKNode属性(SKScene也是SKNode) - 在你的代码中,场景的userInteractionEnabled总是为true,所以触摸总是通过场景的touchesBegan方法(你的精灵的touchesBegan 被禁用 - 但你不覆盖它,所以你没有注意到)。

要以这种方式使用userInteractionEnabled,您需要自己继承小精灵并处理子类精灵内的触摸 - 然后设置userInteractionEnabled将按您的期望工作。

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

+0

解释它....:D感谢您的帮助,它解决了这个问题。我将触摸开始从场景改为精灵。 – Chriss1979

相关问题