2016-04-15 2 views
2

Мне удалось нарисовать линию с массивом моих случайных CGPoints.Линия рисования с помощью SpriteKit и обнаружение столкновения

-(void)drawLine 
    { 
    SKShapeNode *mainLine = [SKShapeNode node]; 
    CGMutablePathRef pathToDraw = CGPathCreateMutable(); 
    CGPathMoveToPoint(pathToDraw, NULL, 0, 0); 

    for(int i;i<pointsInMyView.count;i++) 
    { 
     CGPoint myPoint = [pointsInMyView[i] CGPointValue]; 
     CGPathAddLineToPoint(pathToDraw, NULL, myPoint.x, myPoint.y); 
     mainLine.path = pathToDraw; 
    } 
    [mainLine setLineWidth:40]; 
    [mainLine setStrokeColor:[SKColor whiteColor]]; 
    mainLine.name = @"mainLine"; 
    [self addChild:mainLine]; 


} 

Как вы можете видеть, я рисую SKShapeNode. Моя цель - проверить столкновение моего SKSpriteNode с моей линией. Но, конечно, этот узел формы создает кадр, содержащий все точки моей строки, и в этом случае мой ShapeNode на всем моем представлении. Мой SpriteNode все время обнаруживает столкновение с этим ShapeNode. Я должен нарисовать несколько разных ShapeNodes, я думаю, поэтому каждый узел будет иметь свой собственный фрейм. Но если я так делаю, моя линия не связана. Есть ли какое-то решение, чтобы нарисовать этот узел по узлу и по-прежнему получить хорошую линию.

+0

Если ваш SKShapeNode составлен из случайных точек, он будет распространяться по всему экрану (я только что попробовал). Я думаю, вам придется разработать алгоритм, чтобы убедиться, что линия не пересекает себя и образует относительно простую линию. Можете ли вы разместить свой код, который генерирует '[pointsInMyView]'? –

+0

Я знаю, что мой узел формы - все, что связано с моим экраном. Дело в том, что мне нужны эти случайные точки. Моя линия - это просто большой узел формы с векторными линиями от одной точки к другой. Хорошо. Но теперь я работаю над тем, как обнаружить столкновение с моим местоположением касания и строкой, которую я нарисовал. Проблема в том, что столкновение обнаруживается все время, когда я внутри кадра узла. Я хочу, чтобы мое прикосновение не отвечало на пустые пиксели моего узла фигуры, только на пикселях, где моя линия рисована. Есть идеи? – user3215624

+0

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

ответ

3

К сожалению, узлы в SpriteKit не могут быть вогнутыми (http://mathworld.wolfram.com/ConcavePolygon.html), с линиями, которые пересекают друг друга.

Вам нужно будет создать отдельные узлы для каждой линии между соседними точками, а затем, возможно, объединить их. вы можете сделать это либо:

  1. Создайте 1-й сегмент, а затем добавьте последующие сегменты в виде детей этого 1-го сегмента.
  2. Создайте невидимый узел для всей строки и добавьте wll строку сегментов в виде дочерних элементов этого узла.
  3. Создайте физические тела для каждого сегмента и присоедините их к SKPhysicsJointFixed.
+0

Я вдруг вспомнил об этом после игры с этим в тестовом проекте и получил странное поведение, поэтому удалил мой предыдущий ответ. –

+0

Это верные варианты решения моей проблемы. Я также прочитал некоторые сообщения о получении текстуры из ShapeNode, а затем представил новый SpriteNode с физикой и затем обнаружил столкновение. Это определенно хороший вариант, но моя текстура, которую я создаю: SKTexture * texture = [self.view textureFromNode: mainLine]; всегда является NUL, а мой новый SpriteNode пуст, если я добавлю его в сцену. Подумайте, что здесь не так. Спасибо за ваш ответ. – user3215624

+0

Вы упоминаете столкновений, но тогда вы говорите, что хотите только обнаружить штрихи на линии (граница узла). Но у вас будут те же проблемы, если ваша форма определяется случайным набором очков, если вы не можете гарантировать, что форма, которую они делают, является вогнутой. –

Смежные вопросы