如何使一条线跟随触摸而不是在 spritekit 中绘制无限?

How to make one line follow touch instead of drawing infinite in spritekit?

我试图在触摸某个精灵对象后让一条直线跟随我的手指。到目前为止我一直在工作,除了不是绘制一条线,而是在触摸后绘制无限线...

我的代码:

import SpriteKit
import GameplayKit

class WireDrawTest: SKScene{
    
    
    var drawingLayer: CAShapeLayer!
    var redBox = SKSpriteNode()
    var redBoxPoint = CGPoint(x: 445, y: 800)
    var redBoxTouched:Int = -1
    
    var currentTouch = touchesMoved
    
    func drawLine(from: CGPoint, to: CGPoint) {
        let line = SKShapeNode()
        let path = CGMutablePath()
        path.addLines(between: [from, to])
        line.path = path
        line.strokeColor = UIColor.yellow
        line.lineWidth = 13
        addChild(line)
    }
    
    override func didMove(to view: SKView) {
        redBox = self.childNode(withName: "redBox") as! SKSpriteNode
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print(redBoxTouched)
    }
    
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        
        let touch = touches.first
        
        if let location = touch?.location(in: self){
            let nodesArray = self.nodes(at: location)
            
            if nodesArray.first?.name == "redBox" {
                if redBoxTouched == -1 {
                    redBoxTouched = 1
                }
            }
        
            if redBoxTouched == 1 {
                drawLine(from: redBoxPoint, to: location)
            }
        
        }
        
    }
    
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        print(redBoxTouched)
        if redBoxTouched == 1 {
            redBoxTouched = -1
        }
    }    
}

这是当前结果的截图: screenshot

TIA!!

每次调用 drawLine 时,您都会创建一个新的形状节点并将其添加到场景中。但是,您永远不会删除这些形状节点中的任何一个,因此当您移动手指时线条的数量会增加。

一个解决方法是有一个可选的形状节点,它可以记住上一行(如果有的话)。然后,如果触摸移动时有一个形状节点,则只需删除并丢弃前一个形状节点。当触摸结束时,删除线。

或者您可以创建一个形状节点并在触摸开始时将其添加到场景中,在触摸移动时更改其路径,并在触摸结束时将其从场景中移除。如果我没记错的话,形状节点会在内部复制路径,因此只有可变路径并更改路径不会更新形状节点。但我相信你可以创建一条新路径并分配给形状节点的 path 属性 来更新节点。

由于 bg2b 使我走上了正确的轨道,我找到了解决方案...

首先,不是 'let line = SKShapeNode' 被包含在 drawWire 函数内部,它需要在它的外部,在主场景设置中。

从那里我刚刚将 'line.removeFromParent' 添加到 touchesEnded。现在可以了!我不知道为什么会这样,但确实如此!哈哈!