Не удается коснуться SKSpriteNode - ios не обнаружил касания

Я новичок в iOS, объективном 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.... может быть, есть конкретный момент в коде, где я должен установить это?..

Любая помощь приветствуется!


person Deea B    schedule 17.02.2014    source источник
comment
Почти наверняка вы просто забыли .isUserInteractionEnabled = true   -  person Fattie    schedule 21.10.2017


Ответы (4)


Вы пытались установить свойство 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]];
    }
}
person DoctorClod    schedule 17.02.2014
comment
Пробовал это, но все еще ничего не регистрирует. Я добавил NSLog(@Что-то было затронуто); выше объявления UITouch, и он регистрируется только тогда, когда я касаюсь экрана, а не спрайта. - person Deea B; 18.02.2014
comment
Спасибо за помощь! Проблема решена с помощью комментария ниже в сочетании с вашим вкладом. - person Deea B; 18.02.2014
comment
Без проблем. Я отредактировал ответ, чтобы он соответствовал правильному коду для ясности. - person DoctorClod; 19.02.2014
comment
LOL, в Swift то же самое, я использовал ваш код ObjectiveC, чтобы определить, был ли затронут спрайт, и использование синтаксиса Swift заставило его работать так же, спасибо, сэр! - person msqar; 23.06.2016

Ваш код по существу правильный. Требуется всего несколько незначительных изменений.

Вы реализовали метод -touchesBegan: в своем классе сцены. Если вы хотите обрабатывать касания внутри класса сцены, то все дочерние узлы должны иметь свойство userInteractionEnabled, установленное на NO. Свойство userInteractionEnabled узла спрайта должно быть установлено на YES только тогда, когда он способен обрабатывать касания самостоятельно.

Итак, в вашем случае вы должны внести следующие изменения:

1 - Установите userInteraction spriteNode на NO.

mySKSpriteNode.userInteractionEnabled = NO;

2 - Измените способ проверки собственного спрайта.

if([node isEqual: mySKSpriteNode])

Вы обнаружите, что ваш код работает так, как задумано.

person ZeMoon    schedule 18.02.2014
comment
Спасибо!! Вот оно. Как вы и DoctorClod предложили выше, я назвал свой узел и проверил спрайт в -touchesBegan: и для userInteractionEnabled должно быть установлено значение NO, как вы сказали. - person Deea B; 18.02.2014

В Свифте 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
  }
}
person garrettmaring    schedule 04.01.2016
comment
Что это делает, если в этом месте более одного узла? - person Confused; 27.09.2016

Я никогда не использовал фреймворк SKSprite, но постараюсь помочь. Во-первых, ваша функция "-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event" должна быть установлена ​​в вашем пользовательском классе SKSpriteNode, иначе это нормально, если это не работает.

Если это уже сделано, вам нужно найти, где касание является дескриптором (другим объектом), тогда вы можете использовать: "- (BOOL)gestureRecognizer:(UIPanGestureRecognizer )gestureRecognizer shouldRecognizeSimultaneousWithGestureRecognizer:(UISwipeGestureRecognizer)otherGestureRecognizer"

надеюсь, что поможет!

person Nicolas Bonnet    schedule 17.02.2014
comment
Спасибо, Николай за помощь. Я решил проблему с предложением @akashg выше. - person Deea B; 18.02.2014