7

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

感谢所有帮助!

4

4 回答 4

10

您是否尝试过设置namespritenode 的属性?

在您的初始化中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]];
    }
}
于 2014-02-17T22:50:28.510 回答
5

您的代码基本上是正确的。只需要进行一些小的更改。

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

因此,在您的情况下,您应该进行以下更改:

1 - 将 spriteNode 的 userInteraction 设置为 NO。

mySKSpriteNode.userInteractionEnabled = NO;

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

if([node isEqual: mySKSpriteNode])

您会发现您的代码按预期工作。

于 2014-02-18T07:44:01.247 回答
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
  }
}
于 2016-01-04T23:45:01.807 回答
0

我从未使用过 SKSprite 框架,但我会尽力提供帮助。首先,您的函数“-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event”必须在您的自定义 SKSpriteNode 类中设置,如果没有,如果这不起作用是正常的。

如果它已经完成,您必须搜索水龙头的处理位置(通过其他对象)然后您可以使用:“- (BOOL)gestureRecognizer:(UIPanGestureRecognizer )gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UISwipeGestureRecognizer )otherGestureRecognizer”

希望这会有所帮助!

于 2014-02-17T23:07:51.797 回答