如何使一行跟随触摸而不是在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
}
}    
}

这是当前结果的截图:截图

TIA ! !

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

一种修复方法是使用一个可选的形状节点来记住前一行(如果有的话)。然后只要删除并丢弃之前的形状节点(如果在触摸移动时存在)。当触摸结束时,删除线。

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

我找到了解决方案,感谢bg2b设置我在正确的轨道上…

首先,与其将'let line = SKShapeNode'包含在drawWire函数中,不如将其放在主场景设置的外部。

从那里我只是添加了'line。removeFromParent'到touchesEnded。现在它工作了!我不知道为什么会这样,但确实如此!哈哈!

最新更新