2017-01-23 12 views
2

Как пользователь прослеживает вдоль линии, путь SKShapeNode построен из сегментов линии (которые исходят из основных «плиток»). Фактический путь построен замок в линиях пользователь ранее подтащил, и найти ближайшую точку на ближайшую линии до последней точки касания, а затем строит путь так:Почему SKShapeNode разрывает?

var activatedPointPath: UIBezierPath { 
    let activatedPointPath = UIBezierPath() 

    // self.state.activatedPoints contains the end point 
    // of each full line segment the user has traced through 
    if let firstActivatedPoint = self.state.activatedPoints.first { 
     activatedPointPath.move(to: firstActivatedPoint) 
     for activatedPoint in self.state.activatedPoints { 
      activatedPointPath.addLine(to: activatedPoint) 
     } 
     // self.state.endOfLine contains the last point the user 
     // has touched, which may or may not be at the end of a line 
     // segment 
     if let lastPoint = self.state.endOfLine { 
      activatedPointPath.addLine(to: lastPoint) 
     } 
    } 

    return activatedPointPath 
} 

это затем присваиваются SKShapeNode как:

self.lineNode.path = self.activatedPointPath.cgPath 

однако, когда пользователь трассировки линии, предыдущие сегменты мерцать с треугольниками отсутствует, будучи обращено на экран, например, так:

solid line     line with tear     line with tear

Изображения выше от простой 3x3 плитки сетки позволяет пользователю проследить простую прямую линию:

wireframe of tiles

Вот более сложный пример, где линия начинается в левом нижнем углу и заканчивается в правом верхнем углу:

more complex example with corners

Что может быть причиной эти артефакты?

редактировать в то время как я нашел решения этого вопрос, я бы до сих пор приветствую какие-либо объяснения, почему исходный код не работает, а новый код делает.

+1

SKShapeNode - это плохо реализованная, наполовину готовая, WIP, обертка вокруг CAShapeLayer (я думаю), которая непоколебима, неизменна, негибкая, неодушевленная и не стоит вашего времени. Нарисуйте эти сегменты линии с помощью растянутых и перекошенных SKSpriteNodes. Вы также получите лучшую производительность при анимации. Первоначальная цель SKShapeNode заключалась в том, что он используется как инструмент рисования отладки физики, только для физических фигур .... Только в iOS 10 они получили схему, чтобы сделать ее исполнительским образом, если она не изменилась и не обработана как текстура. Он может быть закончен в iOS 16. – Confused

ответ

1

Мое исправление для этой проблемы состояло в том, чтобы изменить вычисленную переменную activatedPointPath, чтобы построить линию из сегментов, объединенных вместе, а не рисовать линию за один проход.

Новый код выглядит следующим образом:

var previousPoint = firstActivatedPoint 
for activatedPoint in self.state.activatedPoints { 
    let newSegment = UIBezierPath() 
    newSegment.move(to: previousPoint) 
    newSegment.addLine(to: activatedPoint) 

    activatedPointPath.append(newSegment) 

    previousPoint = activatedPoint 
} 
if let lastPoint = self.state.endOfLine { 
    let newSegment = UIBezierPath() 
    newSegment.move(to: previousPoint) 
    newSegment.addLine(to: lastPoint) 
    activatedPointPath.append(newSegment) 
} else { 
    print("No last point") 
} 

который теперь производит плавные линии.

+0

... И хотя он работает, он был ужасно неэффективен. В конце концов я взял совет Confused и сделал фигуры с кучей 'CALayer' вниз в текстуру вместо. Это имело побочный эффект оригинальной, длинно-линии-в-один раз, рендеринг правильно. – ReactiveRaven