如何使一条线跟随触摸而不是在 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。现在可以了!我不知道为什么会这样,但确实如此!哈哈!
我试图在触摸某个精灵对象后让一条直线跟随我的手指。到目前为止我一直在工作,除了不是绘制一条线,而是在触摸后绘制无限线...
我的代码:
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。现在可以了!我不知道为什么会这样,但确实如此!哈哈!