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

Posted

技术标签:

【中文标题】目标 C - 如何在触摸第一个 SKnode 时禁用第二个 Sknode 上的触摸【英文标题】:Objective C - How to disable touch on 2nd Sknode when 1st SKnode is touched 【发布时间】:2017-04-16 05:20:23 【问题描述】:

我有两个 SKNode,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];
        
    


【问题讨论】:

selectNodeForTouch 实际上做了什么——这还不清楚。这个显示的方法在哪里 - 在场景中还是在节点上?两个节点实际上都在触摸位置吗?在处理程序中更改 userInteractionEnabled 不会改变对当前触摸的反应 - 事件已经触发,因此只能影响未来的事件。您能否更详细地解释您拥有哪些节点以及当它们被触摸时您希望发生什么。 @AliBeadle 辅助方法在场景中。它是一个帮助方法,它向场景(自身)询问位于 touchLocation 位置的节点。然后 if 语句检查所选节点是否是 2 个 ruby​​ 节点之一,并“激活”或“停用”它。我现在只想禁用对其中一个节点的触摸,如果先触摸另一个节点,反之亦然。 IE。 1st ruby​​ touch -> 在第二个 ruby​​ 节点上禁用触摸。 1st ruby​​ 第二次触摸 --> 在 2nd ruby​​ 节点上启用触摸,反之亦然。 【参考方案1】:

设置节点的 userInteractionEnabled 未按预期工作的原因是您的 touchesBegan 在场景中,而不是精灵。 userInteractionEnabled 仅允许/禁止对 SKNode 的触摸,它是(SKScene 也是 SKNode)的属性 - 在您的代码中,场景的 userInteractionEnabled 始终为 true,因此触摸始终通过场景的 touchesBegan 方法(您的精灵的 touchesBegan 正在被禁用 - 但你没有覆盖它,所以你不会注意到)。

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

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

【讨论】:

这解释了它.... :D 感谢您的帮助,它解决了问题。我将 touchesBegan 从场景更改为精灵。

以上是关于目标 C - 如何在触摸第一个 SKnode 时禁用第二个 Sknode 上的触摸的主要内容,如果未能解决你的问题,请参考以下文章

不确定将代码放在程序中的啥位置。如何在 XCode 中通过触摸生成圆圈。 (目标-C)

将标签移动到目标c中的矩形后如何从标签中删除触摸动作

检测 SKSpriteNodes 上的触摸事件

SKNode线程安全吗?

目标 C:在 UIScrollView 上触摸绘图

目标 C:检测 UIScrollView 上的触摸事件