2014-02-11 3 views
1

Имея немного проблем с кодом ниже. Массив точек - это набор точек, предоставляемых алгоритмом поиска пути, который дает кратчайший путь между начальными и конечными CGPoints, выполненными в нижеприведенном методе. Отлаживая этот код, я знаю, что он работает.CGPath проблема?

Я думаю, что его CGPath вызывает у меня проблемы, похоже, это не очистка? Всякий раз, когда я генерирую новый путь из алгоритма, игрок всегда возвращается к позиции, в которой он впервые заходил, и затем перемещается вдоль расстояния каждого пути, созданного до сих пор в приложении. Это происходит каждый раз, когда я пытаюсь создать новый путь.

Любые идеи?

-(void)doubleTap:(UITapGestureRecognizer *)touchPoint 
{ 
    CGPoint touchLocation = [touchPoint locationInView:touchPoint.view]; 
    touchLocation = [self convertPointFromView:touchLocation]; 

    //on double tap take the location of the player and the location tapped and pass it to the path finder. 
    CGPoint start = CGPointMake((int)(player.position.x/SPACING), (int)(player.position.y/SPACING)); 
    CGPoint end = CGPointMake((int)(touchLocation.x/SPACING), (int)(touchLocation.y/SPACING)); 
    NSMutableArray *points = [NSMutableArray arrayWithArray:[self reverseArray:[pathFinder findPath:start End:end]]]; 

    //convert path to moveable path for sprite, move sprite along this path. 
    CGMutablePathRef path = CGPathCreateMutable(); 

    if (points.count > 0) 
    { 
     PathFindingNode *firstNode = [points objectAtIndex:0]; 
     CGPathMoveToPoint(path, NULL, firstNode.position.x, firstNode.position.y); 

     for (int i = 1; i < points.count; i++) 
     { 
      firstNode = [points objectAtIndex:i]; 
      CGPathAddLineToPoint(path, NULL, firstNode.position.x, firstNode.position.y); 
     } 
    } 

    SKAction *hover = [SKAction followPath:path asOffset:NO orientToPath:YES duration:2.0]; 
    [player runAction: [SKAction repeatAction:hover count:1]]; 
    [points removeAllObjects]; 
    CGPathRelease(path); 
} 

Существует утечка памяти где-то при переходе по пути к этому коду:

//convert path to moveable path for sprite, move sprite along this path. 
    CGMutablePathRef path = CGPathCreateMutable(); 

    if (points.count > 0) 
    { 
     PathFindingNode *firstNode = [points objectAtIndex:0]; 
     CGPathMoveToPoint(path, NULL, firstNode.position.x, firstNode.position.y); 

     for (int i = 1; i < points.count; i++) 
     { 
      firstNode = [points objectAtIndex:i]; 
      CGPathAddLineToPoint(path, NULL, firstNode.position.x, firstNode.position.y); 
     } 
    } 

    SKAction *hover = [SKAction followPath:path asOffset:NO orientToPath:YES duration:2.0]; 
    [player runAction: [SKAction repeatAction:hover count:1]]; 
    [points removeAllObjects]; 
    CGPathRelease(path); 
} 

Если я комментирую этот код из памяти, то остается около 50 МБ на IPad. Если он не закомментирован, он просто продолжает подниматься все выше и выше, пока он не упадет примерно на 1,5 ГБ.

ответ

1

Код, который вы отправили, создаст новый путь и заполнит его точками в вашем массиве точек. Либо ваш массив точек всегда содержит предыдущие точки ПЛЮС ваших новых точек, либо метод набора сцен followPath: asOffset: orientToPath: duration: добавляет новый путь к старому. (Я еще не использовал набор сюжетов, поэтому я не знаю об этой последней возможности.)

В любом случае ваш код управления CGPath выглядит хорошо. Вы запомнили CGR-версию CGPath, которую не знают многие люди, которые знают только ARC.

+0

Как проверить, добавляет ли он его? Я отредактировал свой вопрос с небольшой дополнительной информацией, которую я узнал после дальнейшей отладки. – dev6546

+0

Не знаю. Я не знаю ничего о сцене, кроме резюме, которое я прочитал, и демонстрационное приложение, которое я создал и запускал. Надеюсь, кто-то еще с большим знанием SceneKit может взвесить. –

+0

Это должно было быть связано с предыдущим пустым сгенерированным стартовым узлом следующего пути, все еще были родителями от созданного ранее пути, установив его родительский номер в нуль при поиске пути, исправленного ! – dev6546