removefromparent в SpriteKit заставляет другие узлы "терять" свойства

Я работаю над игрой в SpriteKit.

Мои основные узлы спрайта определены так:

  ball = [SKSpriteNode spriteNodeWithImageNamed:@"green"];
  ball.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:ball.frame.size];
  ballcoordinates = CGPointMake(x, y);
  ball.position = ballcoordinates;
  ball.name = @"green";
  [self addChild:ball];

У меня есть другие спрайты шара со строками.name "синий, красный, желтый...". Они добавляются несколько раз и расположены в 2d сетке.

В основном то, что делает мой код:

  1. Используйте touchSegan, чтобы выбрать мяч Sprite:

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    touchedNode = (SKSpriteNode *)[self nodeAtPoint:[touch locationInNode:self]];
    }
    
  2. Выберите окружающие узлы из координат окружающих (сверху, снизу, слева, справа) узлов, используя nodeAtPoint. Так что для узла справа это выглядит так:

    CGPoint right= CGPointMake(touchedNode.position.x + 63, touchedNode.position.y);
    SKNode *rightNode = [ball.parent nodeAtPoint:right];
    
  3. Если имя строки, которой коснулись, совпадает с именем строки какого-либо окружающего узла, все узлы с одинаковым именем обозначаются как A.) Добавляется в массив B.) Удаляется после проверки всех окружающих узлов.

    NSMutableArray* ballArray;
    [ballArray addObject:rightNode];
    //Repeated for up,down,left
    
    for (id ball in ballArray) {
    [ball removeFromParent];
    }
    

Работает без нареканий в 75% случаев. Остальные 25% работают до тех пор, пока узлы не будут удалены из родительского. Впоследствии, если я коснусь другой области моей сетки, моя строка.name возвращает правильное имя для повернутого узла, но ноль для окружающих узлов. Так что либо мой способ выбора узла из nodeAtPoint неверен, либо removeFromParent удаляет свойство.

Я потратил кучу времени на это и все еще нахожусь в тупике. Какие-либо предложения?

1 ответ

Вы считали, что после removeFromParent узлы исчезли (освобождены)? Сам BallArray не будет сохранять до тех пор, пока метод в 3. не закончится, и, в частности, он не будет сохранять ни один узел для начала, поскольку, предполагая, что фрагмент кода выше - это все, что у вас есть, ballArray просто равен нулю - вы не выделили экземпляр NSMutableArray.

Измените это на:

NSMutableArray* ballArray = [NSMutableArray array];

и, вероятно, также переместите объявление в @interface, чтобы массив стал ivar, а не локальным var, который выдается в конце метода.

Другие вопросы по тегам