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

Posted

技术标签:

【中文标题】如何让一条线跟随触摸而不是在 spritekit 中绘制无限?【英文标题】:How to make one line follow touch instead of drawing infinite in spritekit? 【发布时间】:2021-12-08 16:58:54 【问题描述】:

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

我的代码:

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!!

【问题讨论】:

"而不是画一条线" 从什么点到什么点?如果你只是想画一条直线,不就是将touchesBegan的一个点连接到touchesEnded的另一个点吗? 我不确定。我是新来的快速大声笑。但我并不想在触摸结束后保留​​“绘图”。我希望这条线在 touchesEnded 时消失,但这部分不是我正在努力解决的问题。当您触摸屏幕时,我希望一条线跟随您的手指,而不是连续打印线条。 【参考方案1】:

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

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

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

【讨论】:

谢谢你,我会试试这个!【参考方案2】:

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

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

从那里我刚刚将“line.removeFromParent”添加到 touchesEnded。现在它起作用了!我不知道为什么这有效,但确实有效!哈哈!

【讨论】:

嗨!在这种情况下,你应该接受他的回答(bg2b's)而不是你的回答(你甚至说你不知道它是如何工作的)。也很高兴相应地投票有用的答案。这可能是对您的问题而不是答案的编辑(在问题的末尾放置真正对您有用的东西,但由于您无法真正记录它不应该是答案):) 感谢您的信息!我会改变的!不幸的是,我还没有足够的声誉来支持他!我试过了!

以上是关于如何让一条线跟随触摸而不是在 spritekit 中绘制无限?的主要内容,如果未能解决你的问题,请参考以下文章

跟随我在oracle学习php(41)

如何判断一个点是在一条线的右侧还是左侧

SpriteKit - 如何检测使用触摸影响哪个节点?

SKShapeNode 检测两条线的交点

SpriteKit 中的持续移动

如何在 SpriteKit 中呈现场景后立即接收触摸事件?