简体   繁体   中英

App crash when 2 fingers are on the screen, touches began, touches moved

I'm not sure what's happening so i can't really describe it to you properly, I made an app that draws a line with the dragging of the users finger, its a sprite kit Game so i used touchesBegan and touchesMoved, so what happens is if i place a finger on the screen while I'm drawing another line the game crashes. what I'm looking for is a way to ignore the second touch until the first is over.My game Draws a line from the start position of the touch till the end position when the touches end here is the code in my touches functions

var lineNode = SKShapeNode()

        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch: AnyObject in touches{
            positionOfStartTouch = touch.location(in: self)
            lastPoint = touch.location(in: self)
            firstPoint = touch.location(in: self)
        }
        let pathToDraw = CGMutablePath()
        print(pathToDraw.isEmpty)
        pathToDraw.move(to: CGPoint(x: firstPoint.x, y: firstPoint.y))
        if frame.width == 375 {
            lineNode.lineWidth = 4
        }else if frame.width == 414 {
            lineNode.lineWidth = 6
        }else if frame.width == 768 {
            lineNode.lineWidth = 8
        }
        lineNode.strokeColor = UIColor.white
        lineNode.name = "Line"
        lineNode.zPosition = 100000
        lineNode.path = pathToDraw
        self.addChild(lineNode)
        shapeNodes.append(lineNode)
}
}
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch: AnyObject in touches{
            positionInScene = touch.location(in: self)
        }
        let pathToDraw = lineNode.path as! CGMutablePath
        lineNode.removeFromParent()
        pathToDraw.move(to: CGPoint(x: firstPoint.x, y: firstPoint.y))
        pathToDraw.addLine(to: CGPoint(x: positionInScene.x, y: positionInScene.y))
        lineNode.path = pathToDraw
        shapeNodes.append(lineNode)
        self.addChild(lineNode)
        firstPoint = positionInScene
    }

The node can only have one parent. You are trying to add lineNode multiple times the the scene. Try this:

 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch: AnyObject in touches{
        positionInScene = touch.location(in: self)
    }
    let pathToDraw = lineNode.path as! CGMutablePath
    lineNode.removeFromParent()
    pathToDraw.move(to: CGPoint(x: firstPoint.x, y: firstPoint.y))
    pathToDraw.addLine(to: CGPoint(x: positionInScene.x, y: positionInScene.y))
    lineNode.path = pathToDraw

    if let copy = lineNode.copy() as? SKShapeNode {
        shapeNodes.append(copy)
        self.addChild(copy)
    }

    firstPoint = positionInScene

}

Do the same in touchesBegan . Of course I am not going into your logic about what should happen when multiple touches occur. I am just pointing out where is the error and why your app crashes.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM