2017-06-14 14 views
2

swiftを使用してスプライトキットにメッシュのトポロジ(グラフ)を描画しようとしています。 enter image description here私はスプライトキットの新機能です。提案やサンプルコードを入力してください。swiftを使用してスプライトキットにメッシュトポロジを描画する方法

+0

私はあなたのおおまかな答えに取り組んでいますが、実際の 'drawLines()'アルゴリズムはわかりません。私はあなたが地形のラインを描くためのアロゴリズムを知っていると思いますか?私が作ったものは非常に基本的で不完全です。 – Fluidity

+0

ねえ、私の答え+プロジェクトソリューションはあなたのために働いたのですか?そうでない場合は、私にお知らせください。私はそれを更新しようとすることができます。 – Fluidity

答えて

1

私がコメントで述べたように、私は完璧な地形アルゴリズムの作り方を知らないが、私はあなたの絵を複製できるものを考え出した。

基本的には、SKノードのプロットを追加し、.positionプロパティを使用して、CGPathで描画された線の開始点と終了点として使用します。そのパスから、SKShapeNode(path: CGPath)を作成できます。

また、ここでは委任を使用するカスタムボタンを追加しましたが、トポグラフィの実際の「勇気」とは完全に別です。単なるボタンです。


enter image description here

// Overly complex way of creating a custom button in SpriteKit: 
protocol DrawLinesDelegate: class { func drawLines() } 

// Clickable UI element that will draw our lines: 
class DrawLinesButton: SKLabelNode { 

    weak var drawLinesDelegate: DrawLinesDelegate? 

    init(text: String, drawLinesDelegate: DrawLinesDelegate) { 
    super.init(fontNamed: "Chalkduster") 
    self.drawLinesDelegate = drawLinesDelegate 
    self.text = text 
    isUserInteractionEnabled = true 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    print(drawLinesDelegate) 

    drawLinesDelegate?.drawLines() 
    } 
    required init?(coder aDecoder: NSCoder) { fatalError("") } 
    override init() { super.init() } 
}; 


class GameScene: SKScene, DrawLinesDelegate { 

    var plots = [SKShapeNode]() 

    // var lines = [SKShapeNode]() // This may be useful in a better algorithm. 

    var nodesDrawnFrom = [SKShapeNode]() 

    var drawLinesButton: DrawLinesButton? 

    func drawLine(from p1: CGPoint, to p2: CGPoint) { 

    let linePath = CGMutablePath() 
    linePath.move(to: p1) 
    linePath.addLine(to: p2) 

    let line = SKShapeNode(path: linePath) 
    line.strokeColor = .red 
    line.lineWidth = 5 
    // lines.append(line) // Again, may be useful in a better algo. 
    addChild(line) 
    } 

    func drawLines() { 

    // Remove all lines: // Again again, may be useful in a better algorithm. 
    /* 
    for line in lines { 
    line.removeFromParent() 
    lines = [] 
    } 
    */ 

    // The plot that we will draw from: 
    var indexNode = SKShapeNode() 

    // Find indexNode then draw from it: 
    for plot in plots { 

     // Find a new node to draw from (the indexNode): 
     if nodesDrawnFrom.contains(plot) { 
     continue 
     } else { 
     indexNode = plot 
     } 

     // Draw lines to every other node (from the indexNode): 
     for plot in plots { 
     if plot === indexNode { 
      continue 
     } else { 
      drawLine(from: indexNode.position, to: plot.position) 
      nodesDrawnFrom.append(indexNode) 
     } 
     } 
    } 
    } 

    func addNode(at location: CGPoint) { 
    let plot = SKShapeNode(circleOfRadius: 50) 
    plot.name = String(describing: UUID().uuid) 
    plot.zPosition += 1 
    plot.position = location 
    plot.fillColor = .blue 

    plots.append(plot) 
    addChild(plot) 
    } 

    override func didMove(to view: SKView) { 
    drawLinesButton = DrawLinesButton(text: "Draw Lines", drawLinesDelegate: self) 
    drawLinesButton!.position.y = frame.minY + (drawLinesButton!.frame.size.height/2) 
    addChild(drawLinesButton!) 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    let location = touches.first!.location(in: self) 
    addNode(at: location) 
    } 
} 

不完全アルゴ:

ここ

あなたは中間点を持っていたとき、他に1から引き出されている複数の行があることがわかります(つまり、ストレートを遮断するものです)enter image description here

これを確認するには、別のセクション全体をアルゴリズムに追加する必要があります。

もう1つ重要なことは、SKShapeNode()が非常に不適格であることです。これらのすべてをSpriteNodesに変換するか、シーン全体を静的テクスチャにビットブレットすることをお勧めします。

しかし、ShapeNodeとしてすべての機能を使用すると、最も柔軟性があり、ここで説明するのが最も簡単です。

+0

あなたの貴重な返事に感謝します。あなたのコードでは、その後、私はノードを描画することができます画面をタップします。私は完全なジェネリック、10のノードと特定のノードに接続して平均ロードトポロジを探しています。まだ私は解決策を探しています。 –

関連する問題