19986


SKSceneで曲線を描画するようにしました。  
タッチイベントの都度、その位置に曲線が移動しますが、移動の度に、前回描画した曲線を消去してから新しい曲線を描きます。  
下記コードだと、全てのノードを削除してから新しい曲線を書いていますが、それではなく、前回行がした曲線のみを消去してから新しく曲線の描画ができるようにするにはどうすればよろしいでしょうか？  
ご教授お願いします。

以下サンプルコードimport SpriteKit

[code]

    class GameScene: SKScene {
    
        // 始点を記憶するインスタンス変数
        var firstTouchPoint = CGPointZero
    
        // 以前に描画したものがあれば、消去。
        override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            self.removeAllChildren()
    
            // 始点を記憶。
            firstTouchPoint = self.convertPointFromView((touches.first?.locationInView(view))!)
        }
        // UIKitの座標系は、左上が原点なのに対し、SpriteKitの原点は左下なので、座標変換する。
    
        // 終点を記憶。
        override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    
            //中心位置
            let midX = CGRectGetMidX(self.frame)
            let midY = CGRectGetMidY(self.frame)
    
            // CGPathを生成。
            let path = CGPathCreateMutable()
    
            // 描画のペンを始点に移動。
            CGPathMoveToPoint(path, nil, firstTouchPoint.x, firstTouchPoint.y)
    
             // カーブを描く。
            CGPathAddCurveToPoint(path, nil, (firstTouchPoint.x + midX) / 2.0 , (firstTouchPoint.y + 150), midX, firstTouchPoint.y, midX, midY)
    
             // pathからSKShapeNodeを生成。
            let shapeNode = SKShapeNode(path: path)
    
            // 線の色を指定。
            shapeNode.strokeColor = SKColor.whiteColor()
    
            // 線の太さを指定。
            shapeNode.lineWidth = 3.0
    
             // Sceneに乗せる。
            self.addChild(shapeNode)
        }
    }
    
[/code]


CC BY-SA 3.0
2015-12-14T13:52:38.597
19977
2016-02-12T23:19:30.990
2015-12-14T22:00:05.650
7362
13156
question
swift
SKSceneで特定のNodeを削除することは可能ですか？


[SKNode Class
Reference](https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKNode_Ref/#//apple_ref/occ/instm/SKNode/)

このリファレンスの「Searching the Node Tree」を読みましょう。  
SpriteKitでは、ノードを名前（`name`）で管理することが推奨されます。インスタンス変数にノードを登録して、どのメソッドからでも参照できるようにするのではなくて、`name`でノードを検索してくるような設計になっています。命名の書式を工夫することで、グループ分けして、グループごと動かしたり、消したりできるということが、リファレンスには書かれています。  
それにしたがって、まず曲線のノードに名前を付けましょう。

[code]

    // pathからSKShapeNodeを生成。
    let shapeNode = SKShapeNode(path: path)
    
    // 線の色を指定。
    shapeNode.strokeColor = SKColor.whiteColor()
    
    // 線の太さを指定。
    shapeNode.lineWidth = 3.0
    
    // Sceneに乗せる。
    self.addChild(shapeNode)
    
[/code]

この部分にコードをつけ加えます。

[code]

    // "curve"という名前のノードがあったら、消去する。
    if let theNode = self.childNodeWithName(name: "curve") {
        theNode.removeFromParent()
    }
    
    let shapeNode = SKShapeNode(path: path)
    
    // ノードに名前を付ける。名称はもちろん任意。
    shapeNode.name = "curve"
    
    shapeNode.strokeColor = SKColor.whiteColor()
    
    shapeNode.lineWidth = 3.0
    
    self.addChild(shapeNode)
    
[/code]


CC BY-SA 3.0
2015-12-14T22:29:56.213
19986
2015-12-14T22:29:56.213
7362
19977
answer