Swift-SKShapeNode来自用户绘制的图像(使用CGMutablePath())

Swift-SKShapeNode来自用户绘制的图像(使用CGMutablePath()),swift,swift3,drawing,cgpath,skshapenode,Swift,Swift3,Drawing,Cgpath,Skshapenode,各位! 我打赌这是一个简单的解决办法,但我不能全神贯注于此。在我正在制作的游戏中,我希望用户能够绘制一些东西(一个曲线、一个圆等),并从该图形中创建一个SKNode(SpriteNode、ShapeNode等)。我几乎可以让它工作了,但当我在屏幕上画画时,它会在屏幕右上角的一个随机点开始画画,并垂直(但不是水平)翻转我的手指运动。要真正了解我的问题,您可能需要了解它,以下是我的游戏场景。swift代码: import SpriteKit import GameplayKit class Gam

各位!

我打赌这是一个简单的解决办法,但我不能全神贯注于此。在我正在制作的游戏中,我希望用户能够绘制一些东西(一个曲线、一个圆等),并从该图形中创建一个SKNode(SpriteNode、ShapeNode等)。我几乎可以让它工作了,但当我在屏幕上画画时,它会在屏幕右上角的一个随机点开始画画,并垂直(但不是水平)翻转我的手指运动。要真正了解我的问题,您可能需要了解它,以下是我的游戏场景。swift代码:

import SpriteKit
import GameplayKit

class GameScene: SKScene {

var lastPoint = CGPoint.zero
var swiped = false

var ref = CGMutablePath()
var lineDrawing = SKShapeNode()

override func didMove(to view: SKView) {

    lineDrawing = SKShapeNode(rectOf: self.frame.size)
    lineDrawing.lineWidth = 10
    lineDrawing.position = CGPoint.zero
    self.addChild(lineDrawing)

}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    swiped = false

    if let touch = touches.first {

        lastPoint = touch.location(in: self.view)

    }
}



func drawLineFrom(fromPoint: CGPoint, toPoint: CGPoint) {

    ref.move(to: fromPoint)
    ref.addLine(to: toPoint)

    lineDrawing.path = ref
    lineDrawing.lineCap = CGLineCap.round
    lineDrawing.lineWidth = 10
    lineDrawing.strokeColor = SKColor.black//maybe .strokeTexture for chalk

}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    swiped = true
    if let touch = touches.first {
        let currentPoint = touch.location(in: view)
        drawLineFrom(fromPoint: lastPoint, toPoint: currentPoint)

        // 7
        lastPoint = currentPoint
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

    if !swiped {
        // draw a single point
        drawLineFrom(fromPoint: lastPoint, toPoint: lastPoint)
    }

}

override func update(_ currentTime: TimeInterval) {
    // Called before each frame is rendered
}
}
导入SpriteKit
导入游戏工具包
类游戏场景:SKScene{
var lastPoint=CGPoint.zero
var swiped=false
var ref=CGMutablePath()
var lineDrawing=SKShapeNode()
覆盖func didMove(到视图:SKView){
lineDrawing=SKShapeNode(rectOf:self.frame.size)
lineDrawing.lineWidth=10
lineDrawing.position=CGPoint.zero
self.addChild(线条绘制)
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
刷卡=错误
如果让触摸=先触摸{
lastPoint=touch.location(在:self.view中)
}
}
func drawLineFrom(起点:CGPoint,地形点:CGPoint){
参考移动(至:起点)
参考添加线(至:拓扑点)
lineDrawing.path=ref
lineDrawing.lineCap=CGLineCap.round
lineDrawing.lineWidth=10
lineDrawing.strokeColor=SKColor.black//maybe.strokeTexture用于粉笔
}
覆盖功能触摸移动(touchs:Set,带有事件:UIEvent?){
刷卡=正确
如果让触摸=先触摸{
让currentPoint=触摸位置(在:视图中)
drawLineFrom(起点:最后一点,拓扑点:当前点)
// 7
lastPoint=currentPoint
}
}
覆盖函数touchesend(touchs:Set,带有事件:UIEvent?){
如果!刷卡{
//画一个点
drawLineFrom(起点:最后一点,地形点:最后一点)
}
}
覆盖函数更新(uCurrentTime:TimeInterval){
//在渲染每个帧之前调用
}
}

在这个问题上,我真的非常感谢你的帮助:)谢谢你

我修好了。问题是我在touch.location(in:___;)中使用了“查看”而不是“自我”。出于某种原因,“视图”的原点位于屏幕的左上角,而“自我”的原点位于屏幕的中心。(这可能是另一种方式,我忘记了。我修复了它。问题是我在touch.location(在:____;)中使用了“查看”而不是“自我”几次。出于某种原因,“查看”的原点位于屏幕的左上角,而“自我”的原点位于屏幕的中心。(我忘了,可能是另一种方式。)。