如何将面部绘制到SKShapeNode

时间:2015-07-15 19:24:06

标签: ios swift sprite-kit skshapenode

我对Swift很新,我正在为我的孩子编码。我正在使用精灵套件为他们创建一个简单的游戏。目前我正在努力学习如何为任意skshapenode画脸?我知道形状内没有孔,但除了它可以是任何形状。尽管它是什么形状,我想以编程方式画出它的眼睛和嘴巴。形状可以有多种尺寸。

有关如何处理此问题的任何建议吗?

1 个答案:

答案 0 :(得分:2)

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

我们首先扩展UIBezierPath类以添加对绘制面有用的实例方法。第一种方法是在给定位置和指定半径的路径上添加一个圆。 moveToPoint语句将路径的当前点移动到新位置。这相当于拾取“笔”并将其移动到新位置以绘制不同的非连接对象。第二种方法绘制半圆,开放面朝上。这可以用来画笑容。请注意,无法在类中定义扩展名。您可以将其置于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类来绘制由脸部轮廓(大圆圈),眼睛(两个小圆圈)和嘴巴(半圆圈)组成的脸部。通过将面部的组件添加到路径,然后将路径附加到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
    }        
}