如何画脸到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
}
}
我是 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
}
}