【问题标题】:Smoothing Edges of Unstroked Paths on SKShapeNode平滑 SKShapeNode 上未描边路径的边缘
【发布时间】:2017-01-27 13:53:15
【问题描述】:

我一直在使用 Swift 的内置绘图工具绘制简单的直线路径。我注意到的一个异常情况是,如果您想要一条已填充但边缘没有线条笔划的路径,则它会在没有抗锯齿的情况下进行渲染并且外观粗糙。相反,默认情况下,一条线总是平滑渲染。有一个选项可以打开抗锯齿,但这也没有什么区别。我可以让笔触与填充颜色相同,但这意味着边缘会从定义形状的点位置向外扩展。

   //creates shape node to contain path
            let myTriangle = SKShapeNode()
    //declares path object
            let myPath = CGPathCreateMutable()
    //moves to starting point of shape
            CGPathMoveToPoint(myPath, nil, -50, 0)
    //draws lines of shape
            CGPathAddLineToPoint(myPath, nil, 0, 100 )
            CGPathAddLineToPoint(myPath, nil, 50, 0 )
            CGPathAddLineToPoint(myPath, nil, -50, 0 )
    //closes path
            CGPathCloseSubpath(myPath)

            myTriangle.antialiased = true
//adds path to shape node
            myTriangle.path = myPath
//sets fill colour and zero line width
            myTriangle.fillColor = SKColor.blueColor()
            myTriangle.lineWidth = 0
//sets antialiasing
            myTriangle.antialiased = true
//sets position in parent object and adds node
            myTriangle.position = CGPointMake(600, 600)
            self.addChild(myTriangle)

有什么想法吗?

非常感谢, 千瓦

【问题讨论】:

  • 你能提供一些截图来说明问题和理想吗?
  • 这是我创建的一个示例。三角形有我发布的代码,除了最左边的点,我移动它以更清楚地显示边缘。请注意,红色框和黑色圆圈有一条白线,并且非常光滑。红框在旋转,仍然完美渲染。我将图片放大了 200%,希望您能看到不同之处:imgur.com/a/ypPFk
  • 这有点令人惊讶。如果你抚摸三角形,它看起来不错?

标签: swift sprite-kit cgpath skshapenode


【解决方案1】:

关于抗锯齿,您可以在这里查看document。 我还看到你有一个等于 0 的 lineWidth,这对本文档没有帮助..

要改善路径的外观,您还可以尝试:

yourPath.lineCap = CGLineCap(rawValue: 1)!

在哪里,根据来源:

/* Line cap styles. */
public enum CGLineCap : Int32 {   
    case butt
    case round
    case square
}

一些用 Swift 3 编写的示例代码:

        let myTriangle = SKShapeNode()
        let myPath = CGMutablePath()
        myPath.move(to: CGPoint(x:-110,y: 0))
        myPath.addLine(to: CGPoint(x:0,y: 290))
        myPath.addLine(to: CGPoint(x:260,y: 0))
        myPath.addLine(to: CGPoint(x:-110,y: 0))
        myPath.closeSubpath()
        myTriangle.path = myPath
        myTriangle.fillColor = SKColor.white
        myTriangle.lineWidth = 2
        myTriangle.lineCap = CGLineCap(rawValue: 1)!
        myTriangle.strokeColor = SKColor.white
        myTriangle.isAntialiased = true
        myTriangle.position = CGPoint(x:self.frame.midX,y:self.frame.midY)
        self.addChild(myTriangle)

输出此代码(lineWidth 2 和 lineCap valorized..):

您的输出lineWidth 等于 0):

【讨论】:

  • 我认为这只是改变了线条末端和角落的渲染方式,类似于 Adob​​e Illustrator。
  • @Kwangle 我添加了一些代码来帮助您进行研究
  • 是的,这很好,但我想要平滑边缘,而不必在路径周围绘制笔触。似乎 Swift 只允许对描边路径进行平滑处理。当我使用形状检查碰撞检测代码时,我需要精确的对象边界,因此不希望添加几个像素的宽度。非常感谢您的研究和投入。
  • SKShapeNode 有一些限制,这是肯定的,但是如果你从你的形状尺寸中减去一个合理的宽度,比如 2 个点,你应该解决你的问题,特别是因为笔划具有相同的形状颜色。关于检查碰撞,如何检查碰撞?你在用物理引擎吗?
  • 是的,但是计算不规则形状的插图会变得很尴尬,这对于 SpriteKit 来说似乎是一个奇怪的遗漏。我正在编写自己的碰撞检测例程作为练习,并且已经让圆到圆和圆到有角度的盒子工作。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多