2015-06-29 18 views
12

Tôi đang cố gắng tạo một ứng dụng đơn giản, nơi bạn chạm vào một điểm và một hình ảnh theo sau một đường thẳng đến cạnh của màn hình, bất kể bạn chạm vào đâu. Tôi muốn vẽ các đoạn thẳng nối nguồn gốc của sprite (điểm bắt đầu) và điểm mà bạn chạm vào, và giữa nguồn gốc của sprite và điểm kết thúc ở rìa màn hình, vì vậy tôi có thể hình dung đường đi của các sprite và mối quan hệ giữa x và y offsets của nguồn gốc, điểm tiếp xúc và điểm kết thúc.Tạo một đường thẳng với hai CGPoints SpriteKit Swift

Hy vọng rằng điều đó không quá khó hiểu.

TL; DR: Tôi cần vẽ một đường thẳng giữa hai điểm và tôi không biết cách thực hiện điều đó bằng cách sử dụng SpriteKit Swift.

Xin cảm ơn trước.

+0

[Sử dụng touchesMoved để vẽ đường] [1] [1]: http://stackoverflow.com/a/26045711/2775981 – Vicky

+0

@Vicky, hướng dẫn Đó là , từ ngoại hình của nó, được viết trong Mục tiêu-C. Tôi không biết cách viết trong Objective-C và không thể hiểu nó đơn giản bằng cách đọc. – rookr

Trả lời

12

Điều này có thể được thực hiện bằng CGPath và SKShapeNode.

Cho phép bắt đầu bằng CGPath. CGPath được sử dụng khi chúng ta cần phải xây dựng một đường dẫn bằng cách sử dụng hàng loạt các hình dạng hoặc dòng. Đường dẫn là đường nối hai điểm. Vì vậy, để thực hiện một dòng:

  1. moveToPoint: Nó đặt điểm hiện tại của đường dẫn đến điểm đã chỉ định.
  2. addLineToPoint: Nó vẽ một đường thẳng từ điểm hiện tại đến điểm được chỉ định. hoặc addCurveToPoint: Nó vẽ một đường cong từ điểm hiện tại đến điểm được chỉ định dựa trên một số điểm tiếp xúc và điểm kiểm soát nhất định.

Bạn có thể kiểm tra tài liệu ở đây: http://developer.apple.com/library/mac/#documentation/graphicsimaging/Reference/CGPath/Reference/reference.html

Những gì bạn cần làm là:

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

Bây giờ để làm cho con đường có thể nhìn thấy, và cung cấp cho nó các thuộc tính như màu sắc đột quỵ, chiều rộng dòng v.v. bạn tạo SKShapeNode trong SpriteKit và thêm đường dẫn vào nó.

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

Hy vọng điều này sẽ giúp :).

+0

Tôi vừa nâng cấp lên Swift 3 và giải pháp này đã phá vỡ cho tôi. Xem câu trả lời của tôi bên dưới để di chuyển. – DrRobotNinja

5

Làm theo từng bước THIS và bạn có thể đạt được điều đó.

Hãy xem xét các đoạn mã sau:

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

Đây là một phương pháp đơn giản. Bạn nhận được vị trí tiếp theo của ngón tay của người dùng và nếu bạn tìm thấy một con lợn trong touchesBegan(_:,withEvent:), như được chỉ ra bởi giá trị di chuyển không phải là nil, bạn thêm vị trí này vào con lợn làm điểm tiếp theo.

Cho đến nay, bạn có thể lưu trữ đường dẫn cho lợn — giờ hãy để con lợn đi theo con đường này. Thêm mã sau đây để update() bên GameScene.swift:

dt = currentTime - lastUpdateTime 
lastUpdateTime = currentTime 

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

Và bạn có thể xem kết quả:

enter image description here

Vẽ Đường thẳng:

Tại thời điểm này, chỉ có lợn biết con đường nó muốn đi du lịch, nhưng khung cảnh cũng cần phải biết con đường này để vẽ nó. Giải pháp cho vấn đề này là một phương pháp mới cho lớp học Pig của bạn.

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 
} 

phương pháp này để vẽ đường đi của lợn:

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) 
    } 
    }) 
} 

Và đây là kết quả của bạn:

enter image description here

Và bạn có thể thiết lập rằng con đường cho lợn.

Bạn có thể sửa đổi điều đó theo nhu cầu của mình.

Hy vọng điều đó sẽ hữu ích.

+1

Tôi chỉ muốn vẽ một đường thẳng giữa hai (và chỉ hai) điểm. Đường thẳng. Không có gì lạ mắt. Cảm ơn mặc dù – rookr

6

Đối với Swift 3, phương thức CGPathMoveToPoint không giống như một đối số thứ hai nữa, vì vậy tôi cần một giải pháp mới. Dưới đây là những gì tôi đã đưa ra:

let line_path:CGMutablePath = CGMutablePath() 
line_path.move(to: CGPoint(x:x1, y:y1)) 
line_path.addLine(to: CGPoint(x:x2, y:y2)) 
Các vấn đề liên quan