检测是否有任何手指触摸节点

时间:2015-02-19 23:17:33

标签: objective-c sprite-kit touch skspritenode

所以我想在我的应用程序中调用一个方法,只要有touchesEnd AND节点按钮X没有被触摸。最初我只是想使用这段代码:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event    
    NSArray *touchesArray = [touches allObjects];
    UITouch *touch = (UITouch *)[touchesArray objectAtIndex:0];

    CGPoint pointTouched = [touch locationInNode:self];
    SKNode *nodeAtTouchPoint = [self nodeAtPoint:pointTouched];

    if ([nodeAtPointTouched.name isEqualToString:buttonX.name]) {
        // Call the method I want to call
    }
}

问题在于仅检测“当前手指”的touchesEnded和“当前手指”是否未触及buttonX。如果fingerA触摸了按钮,则fingerB touchesStartedtouchesEnded(屏幕上的任何其他位置),即使fingerA仍在触摸buttonX,也会调用我想要调用的方法。

我真正的问题:如何在touchesEnded上为最初按下buttonX的手指调用我的方法,但是当在其他地方为手指调用touchesEnded时不调用该方法?

编辑:如果我可以创建一个BOOL方法来返回一个节点是否被触摸,并且它在对象中的“任何地方”工作(不需要来自touchesBegan或{{1的数据}}),我认为这有助于我解决问题。

3 个答案:

答案 0 :(得分:0)

请尝试使用-containsPoint:

,而不是使用-nodeAtPoint :.
if ([buttonX containtsPoint:pointTouched]) {
    // Code here
}

答案 1 :(得分:0)

我可以通过两种方式看到你。

第一个没有对代码进行太多更改的方法是在类中创建一个属性。

@property (nonatomic, strong)UITouch *buttonTouch;

在循环浏览所有触摸时跟踪它,如示例

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    for (UITouch *touch in [touches allObjects])
    {
        CGPoint pointTouched = [touch locationInNode:self];
        SKNode *nodeAtTouchPoint = [self nodeAtPoint:pointTouched];

        if ([nodeAtTouchPoint.name isEqualToString:buttonX.name] && !self.buttonTouch)
        {
            self.buttonTouch = touch;
        }
    }
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    for (UITouch *touch in [touches allObjects])
    {
        CGPoint pointTouched = [touch locationInNode:self];
        SKNode *nodeAtTouchPoint = [self nodeAtPoint:pointTouched];

        if ([nodeAtTouchPoint.name isEqualToString:buttonX.name] && touch == self.buttonTouch)
        {
            self.buttonTouch = nil;
            // Call the method I want to call
        }
    }
}

另一个选项和更复杂的选择是将SKSpriteNode子类化为您的按钮并处理其中的触摸并使用委托。这就是我处理项目中按钮的方式。

修改

我将我的ButtonSprite类添加到GitHub只是因为你可能觉得它很有用。

https://github.com/Urthstripe29/ButtonSprite

答案 2 :(得分:0)

您需要跟踪按钮内的手指。每次从touchesBegantouchesEnded,每个手指都会返回一个唯一对象。所以很容易跟踪它。

首先初始化userData的{​​{1}}。

buttonX

然后使用以下buttonX.userData = [[NSMutableDictionary alloc] init]; 函数。

touchesBegan and touchesMoved