2015-06-29 3 views
12

Я пытаюсь создать простую программу, в которой вы касаетесь точки, а спрайт следует по линии до этой точки до края экрана, независимо от того, где вы касаетесь. Я хочу нарисовать сегменты линии, соединяющие начало спрайта (точка начала) и точку, в которую вы касались, и между началом спрайта и конечной точкой на краю экрана, чтобы я мог визуализировать путь спрайт и связь между смещениями x и y начала координат, точки касания и конечной точки.Создайте линию с двумя CGPoints SpriteKit Swift

Надеюсь, это не было слишком запутанным.

TL; Мне нужно нарисовать линию между двумя точками, и я не знаю, как это сделать, используя SpriteKit Swift.

Заранее спасибо.

+0

[Использование touchesMoved нарисовать линию] [1] [1]: http://stackoverflow.com/a/26045711/2775981 – Vicky

+0

@Vicky, что учебник , по внешнему виду, написанному в Objective-C. Я понятия не имею, как писать в Objective-C и не могу понять это просто путем чтения. – rookr

ответ

12

Это можно сделать с помощью CGPath и SKShapeNode.

Давайте начнем с CGPath. CGPath используется, когда нам нужно построить путь, используя ряд фигур или линий. Пути - это линия, соединяющая две точки. Итак, чтобы сделать строку:

  1. moveToPoint: устанавливает текущую точку пути в указанную точку.
  2. addLineToPoint: Он рисует прямую линию от текущей точки до указанной точки. или addCurveToPoint: он рисует изогнутую линию от текущей точки до указанной точки на основе определенных касательных и контрольных точек.

Вы можете проверить документацию здесь: http://developer.apple.com/library/mac/#documentation/graphicsimaging/Reference/CGPath/Reference/reference.html

Что вам нужно сделать, это:

var path = CGPathCreateMutable() 
    CGPathMoveToPoint(path, nil, 100, 100) 
    CGPathAddLineToPoint(path, nil, 500, 500) 

Теперь, чтобы сделать путь видимым, и дать ему атрибуты, как цвет обводки, ширина линии и т. д. вы создаете SKShapeNode в SpriteKit и добавляете к нему путь.

let shape = SKShapeNode() 
    shape.path = path 
    shape.strokeColor = UIColor.whiteColor() 
    shape.lineWidth = 2 
    addChild(shape) 

Надеюсь, что это поможет :).

+0

Я только что обновился до Swift 3, и это решение сломалось для меня. См. Мой ответ ниже, чтобы перейти. – DrRobotNinja

5

Следуйте за THIS учебным пособием шаг за шагом, и вы можете это достичь.

Рассмотрим следующий код:

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) { 
    let location = touches.anyObject()!.locationInNode(scene) 
    if let pig = movingPig { 
     pig.addMovingPoint(location) 
    } 
} 

Это простой метод. Вы получаете следующую позицию пальца пользователя, и если вы нашли свиньи в touchesBegan(_:,withEvent:), как указано значением non-nil movingPig, вы добавляете положение этой свиньи в качестве следующей путевой точки.

До сих пор вы можете сохранить путь для свиньи - теперь давайте сделаем свинью по этому пути. Добавьте следующий код update() внутри GameScene.swift:

dt = currentTime - lastUpdateTime 
lastUpdateTime = currentTime 

enumerateChildNodesWithName("pig", usingBlock: {node, stop in 
    let pig = node as Pig 
    pig.move(self.dt) 
}) 

И вы можете видеть результат:

enter image description here

Рисование линий:

На данный момент, только свинья знает путь он хочет путешествовать, но сцена также должна знать этот путь, чтобы нарисовать его. Решение этой проблемы - новый метод для вашего класса Pig.

func createPathToMove() -> CGPathRef? { 
    //1 
    if wayPoints.count <= 1 { 
     return nil 
    } 
    //2 
    var ref = CGPathCreateMutable() 

    //3 
    for var i = 0; i < wayPoints.count; ++i { 
     let p = wayPoints[i] 

    //4 
    if i == 0 { 
     CGPathMoveToPoint(ref, nil, p.x, p.y) 
    } else { 
     CGPathAddLineToPoint(ref, nil, p.x, p.y) 
    } 
} 

return ref 
} 

этот метод, чтобы сделать путь свиньи:

func drawLines() { 


//1 
    enumerateChildNodesWithName("line", usingBlock: {node, stop in 
    node.removeFromParent() 
    }) 

    //2 
    enumerateChildNodesWithName("pig", usingBlock: {node, stop in 
    //3 
    let pig = node as Pig 
    if let path = pig.createPathToMove() {   
     let shapeNode = SKShapeNode() 
     shapeNode.path = path 
     shapeNode.name = "line" 
     shapeNode.strokeColor = UIColor.grayColor() 
     shapeNode.lineWidth = 2 
     shapeNode.zPosition = 1 

     self.addChild(shapeNode) 
    } 
    }) 
} 

И вот ваш результат:

enter image description here

И вы можете установить этот путь для свиньи.

Вы можете изменить это в соответствии с вашими потребностями.

Надеюсь, это поможет.

+1

Я просто хочу нарисовать линию между двумя (и только двумя) точками. Прямая линия. Ничего особенного. Спасибо, хотя – rookr

6

Для Swift 3 метод CGPathMoveToPoint больше не нужен для второго аргумента nil, поэтому мне нужно новое решение. Вот что я придумал:

let line_path:CGMutablePath = CGMutablePath() 
line_path.move(to: CGPoint(x:x1, y:y1)) 
line_path.addLine(to: CGPoint(x:x2, y:y2)) 
Смежные вопросы