2014-02-17 42 views
7

我对iOS,objective C和Xcode都很新。我只做了一个简单的新闻类应用程序,但现在我想创建一个我在另一个平台上发布的游戏。无法点击SKSpriteNode - 没有检测到触摸ios

基本上,我有一个物体随机出现,然后淡出,目的是点击物体使其消失。

但是我似乎无法挖掘的对象,即使我设置mySKSpriteNode.userInteractionEnabled = YES;

以下是我在我的touchesBegan方法:

在我的日志我得到这个,当我点击屏幕(不是我有对象):

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 ....也许有代码的特定点我应该在哪里设置这个?..

所有帮助表示赞赏!

+0

几乎可以肯定你**只是忘了.isUserInteractionEnabled = true ** – Fattie

回答

10

您是否尝试过设置您的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]]; 
    } 
} 
+0

试过这个,但仍然没有记录任何东西。我添加了NSLog(@“Something was touched”);在UITouch声明之上,它只在我触摸屏幕时记录,而不是精灵。 –

+0

感谢您的帮助!问题通过下面的评论与您的​​意见一起解决。 –

+0

没问题。为了清晰起见,我编辑了答案以匹配正确的代码。 – DoctorClod

0

我从来没有使用过SKSprite框架,但我会尽力帮助你。 首先,你的函数“ - (void)touchesBegan:(NSSet *)与事件触发:(UIEvent *)事件”必须在你的自定义SKSpriteNode类中设置,如果没有的话,这是正常的。

如果它已经完成,你必须寻找在水龙头手柄(由其他对象),那么你可以使用: “ - (BOOL)gestureRecognizer:(UIPanGestureRecognizer )gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UISwipeGestureRecognizer)otherGestureRecognizer”

希望有帮助!

+0

谢谢,Nicolas为你提供帮助。我用@ akashg的建议解决了上述问题。 –

5

您的代码基本正确。只需稍作修改即可。

您已经在场景类中实现了-touchesBegan:方法。如果要处理场景类中的触摸,则所有子节点应将userInteractionEnabled属性设置为NO。一个精灵节点的userInteractionEnabled属性应该设置为YES,只有当它能够处理它自己的触摸。

所以,你的情况,你应该做以下修改:

1 - 该spriteNode的用户交互设置为NO。

mySKSpriteNode.userInteractionEnabled = NO; 

2 - 改变你检查自己的精灵的方式。

if([node isEqual: mySKSpriteNode]) 

你会发现你的代码工作正常。

+0

谢谢!就是这样。正如你和DoctorClod上面提示的那样,我命名了我的节点并在-touchesBegan中检查了精灵:并且应该将userInteractionEnabled设置为NO,如上所述。 –

1

在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 
    } 
} 
+0

如果这个位置有多个节点,这会做什么? – Confused