我有两个接收触摸的 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];
}
}
}
}
答案 0 :(得分:0)
设置节点的userInteractionEnabled的原因并不像你期望的那样是你的touchesBegan在场景中,而不是精灵。 userInteractionEnabled只允许/不允许触摸SKNode它是一个属性(SKScene也是一个SKNode) - 并且在你的代码中,场景的userInteractionEnabled总是为真所以触摸总是通过场景的touchesBegan方法(你的精灵的touchesBegan 被禁用 - 但你没有覆盖它,所以你没有注意到。)
要以这种方式使用userInteractionEnabled,您需要对sprite本身进行子类化并处理子类精灵中的触摸 - 然后设置userInteractionEnabled将按预期工作。
如果您不想像这样重构代码,可以用其他方式将每个精灵标记为“不可触摸”(this SO answer建议使用SKNode现有的zPosition属性)然后在场景中使用它接受触摸(例如,如果touchNode.zPosition!= 0 ...)。