无法点击 SKSpriteNode - 未检测到触摸 ios
Posted
技术标签:
【中文标题】无法点击 SKSpriteNode - 未检测到触摸 ios【英文标题】:Can't tap SKSpriteNode - no touch detected ios 【发布时间】:2014-02-17 21:55:05 【问题描述】:我对 ios、Objective C 和 Xcode 还很陌生。我只做了一个简单的新闻类应用,但现在我想创建一个我在另一个平台上发布的游戏。
基本上,我有一个对象会随机出现然后淡出,目的是点击该对象使其消失。
但是我似乎无法点击对象,即使我设置了mySKSpriteNode.userInteractionEnabled = YES;
这是我的 touchesBegan
方法中的内容:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
/* Called when a touch begins */
NSLog(@"Something was touched");
UITouch *touch = [touches anyObject];
NSLog(@"%@", touch);
CGPoint location = [touch locationInNode:self];
SKNode *node = [self nodeAtPoint:location];
if(node == mySKSpriteNode)
[node runAction:[SKAction fadeOutWithDuration:0]];
在我的日志中,当我点击屏幕(不是我有对象的地方)时,我会得到这个:
2014-02-17 23:18:30.870 BubbleChallenge[48541:70b] Something was touched
2014-02-17 23:18:30.875 BubbleChallenge[48541:70b] <UITouch: 0x1130ea530> phase: Began tap count: 1 window: <UIWindow: 0x109c2ab60; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x109c274d0>; layer = <UIWindowLayer: 0x109c26810>> view: <SKView: 0x109c2e5e0; frame = (0 0; 320 568); autoresize = RM+BM; layer = <CAEAGLLayer: 0x109c0e180>> location in window: 147.5, 128.5 previous location in window: 147.5, 128.5 location in view: 147.5, 128.5 previous location in view: 147.5, 128.5
当我触摸 mySKSpriteNode 时,我在日志中什么也没有得到,甚至没有“某物被触摸”;
知道为什么会发生这种情况吗?
我发现的其他问题说答案是设置userInteractionEnabled = YES
....也许代码中有一个特定的点我应该设置这个?..
感谢所有帮助!
【问题讨论】:
几乎可以肯定你只是忘记了 .isUserInteractionEnabled = true 【参考方案1】:您是否尝试过设置 spritenode 的 name
属性?
在您为mySKSpriteNode
初始化时:
mySKSpriteNode = [[SKSpriteNode alloc] initWithTexture:sometexture];
mySKSpriteNode.name = @"thisIsMySprite"; // set the name for your sprite
mySKSpriteNode.userInteractionEnabled = NO; // userInteractionEnabled should be disabled
然后:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];
SKNode *node = [self nodeAtPoint:location];
if ([node.name isEqualToString:@"thisIsMySprite"])
NSLog(@"mySKSpriteNode was touched!");
[node runAction:[SKAction fadeOutWithDuration:0]];
【讨论】:
试过这个,但仍然没有记录任何东西。我添加了 NSLog(@"Something was touch");上面的 UITouch 声明,它只在我触摸屏幕时记录,而不是精灵。 感谢您的帮助!通过下面的评论结合您的输入解决了问题。 没问题。为了清楚起见,我已经编辑了答案以匹配正确的代码。 哈哈,这在 Swift 中是一样的,我用你的 ObjectiveC 代码来检测一个精灵是否被触摸,并使用 Swift 的语法使它工作相同,谢谢先生!【参考方案2】:您的代码基本上是正确的。只需进行一些小改动。
您已经在场景类中实现了-touchesBegan:
方法。如果您想在场景类中处理触摸,则所有子节点都应将userInteractionEnabled
属性设置为NO
。精灵节点的userInteractionEnabled
属性应该设置为YES
,只有当它能够自己处理触摸时。
因此,在您的情况下,您应该进行以下更改:
1 - 将 spriteNode 的 userInteraction 设置为 NO。
mySKSpriteNode.userInteractionEnabled = NO;
2 - 更改检查自己的精灵的方式。
if([node isEqual: mySKSpriteNode])
您会发现您的代码按预期工作。
【讨论】:
谢谢!!就是这样。正如您和上面的 DoctorClod 建议的那样,我命名了我的节点并检查了 -touchesBegan: 中的精灵:并且 userInteractionEnabled 应该按照您的说法设置为 NO。【参考方案3】:在 Swift 2.0 中!
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
let touch = touches.first!
let location = touch.locationInNode(self)
let node = self.nodeAtPoint(location)
if node.name == "spriteName"
// Present new game scene
【讨论】:
如果这个位置有多个节点,这会怎样?【参考方案4】:我从未使用过 SKSprite 框架,但我会尽力提供帮助。 首先,您的函数“-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event”必须在您的自定义 SKSpriteNode 类中设置,如果没有,如果不起作用则正常。
如果已经完成,您必须搜索点击的位置(由其他对象),然后您可以使用:“- (BOOL)gestureRecognizer:(UIPanGestureRecognizer )gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UISwipeGestureRecognizer)otherGestureRecognizer"
希望对您有所帮助!
【讨论】:
感谢尼古拉斯的帮助。我用上面@akashg 的建议解决了这个问题。以上是关于无法点击 SKSpriteNode - 未检测到触摸 ios的主要内容,如果未能解决你的问题,请参考以下文章
didBegin 未检测到两个 SKSpriteNode 之间的接触