所以我想在我的应用程序中调用一个方法,只要有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 touchesStarted
和touchesEnded
(屏幕上的任何其他位置),即使fingerA仍在触摸buttonX
,也会调用我想要调用的方法。
我真正的问题:如何在touchesEnded
上为最初按下buttonX
的手指调用我的方法,但是当在其他地方为手指调用touchesEnded
时不调用该方法?
编辑:如果我可以创建一个BOOL
方法来返回一个节点是否被触摸,并且它在对象中的“任何地方”工作(不需要来自touchesBegan
或{{1的数据}}),我认为这有助于我解决问题。
答案 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只是因为你可能觉得它很有用。
答案 2 :(得分:0)
您需要跟踪按钮内的手指。每次从touchesBegan
到touchesEnded
,每个手指都会返回一个唯一对象。所以很容易跟踪它。
首先初始化userData
的{{1}}。
buttonX
然后使用以下buttonX.userData = [[NSMutableDictionary alloc] init];
函数。
touchesBegan and touchesMoved