如何画脸到SKShapeNode

How to draw a face to SKShapeNode

我是 Swift 的新手,我正在为我的孩子们编写代码。我正在使用 sprite-kit 为他们创建一个简单的游戏。目前我正在为如何为任意 skshapenode 绘制一张脸而苦苦挣扎?我知道形状内没有孔,但除此之外它可以是任何形状。不管它是什么形状,我想以编程方式为它画眼睛和嘴巴。形状可以有多种尺寸。

有什么解决方法的建议吗?

下面是如何用 SKShapeNode 绘制笑脸的示例。它提供了一个框架,您可以扩展该框架以绘制更复杂的面孔。

我们首先扩展 UIBezierPath class 以添加对绘制人脸有用的实例方法。第一种方法在给定位置和指定半径的路径上添加一个圆。 moveToPoint 语句将路径的当前点移动到新位置。这相当于拿起一个 "pen" 并将其移动到一个新位置以绘制一个不同的、未连接的对象。第二种方法画一个半圆,开口的一面朝上。这可以用来画笑脸。请注意,不能在 class 中定义扩展名。您可以将其放在 GameScene 定义之上。

extension UIBezierPath {
    func addCircle(center:CGPoint, radius:CGFloat) {
        self.moveToPoint(CGPointMake(center.x+radius, center.y))
        self.addArcWithCenter(center, radius: radius, startAngle: 0, endAngle: CGFloat(2*M_PI), clockwise: true)
    }
    func addHalfCircle(center:CGPoint, radius:CGFloat) {
        self.moveToPoint(CGPointMake(center.x+radius, center.y))
        self.addArcWithCenter(center, radius: radius, startAngle: 0, endAngle: CGFloat(M_PI), clockwise: false)
    }
}

我们现在可以使用扩展的UIBezierPath class来绘制由面部轮廓(一个大圆圈)、眼睛(两个小圆圈)和嘴巴(半个圆圈)组成的脸).通过将面部的组件添加到路径然后将路径附加到 SKShapeNode.

来构造面部
class GameScene: SKScene {

    override func didMoveToView(view: SKView) {
        scaleMode = .ResizeFill
        let face = SKShapeNode()
        // The argument determines the size of the face
        face.path = drawFace(50)
        face.lineWidth = 2
        // Place the face in the center of the scene
        face.position = CGPointMake (CGRectGetMidX(view.frame),CGRectGetMidY(view.frame))
        addChild(face)
    }

    func drawFace(radius:CGFloat) -> CGPathRef {

        var path = UIBezierPath()

        // Add the outline of the face
        let center = CGPointZero
        path.addCircle(center, radius: radius)

        // Add the eyes
        let eyeOffset = radius * 0.35
        let eyeRadius = radius * 0.125

        let left = CGPointMake(-eyeOffset, eyeOffset)
        path.addCircle(left, radius: eyeRadius)

        let right = CGPointMake(eyeOffset, eyeOffset)
        path.addCircle(right, radius: eyeRadius)

        // Add the mouth
        let smileRadius = radius*0.65
        path.addHalfCircle(center, radius: smileRadius)

        return path.CGPath
    }        
}