最近,我需要在iOS应用程序中振荡图像。 我遇到了一个Swift代码示例,该示例演示了如何执行该操作,并且实际上很容易做到(有关公式背后的理论请参见this )。 该代码利用了Swift中的“扩展”功能。 这是Swift中一个非常酷的功能。 该功能使您可以扩展类的功能,而不必扩展类(例如您在Java中所做的事情)。 有关此功能的基本示例,请参见以下示例 。 在我的示例中,该功能用于扩展SKAction类的功能, 这是iOS SpriteKit库中的另一个很酷的功能。
扩展名如下所示:
let π = CGFloat(M_PI)
extension SKAction {
static func oscillate(amplitude a: CGFloat, timePeriod t: CGFloat, midPoint: CGPoint) -> SKAction {
let action = SKAction.customActionWithDuration(Double(t)) { node, currentTime in
let displacement = a * sin(2 * π * currentTime / t)
node.position.y = midPoint.y - displacement
}
return action
}
}您可以使用扩展并将其应用于GameScene.swift中的SpriteNode,例如:
import SpriteKit
class GameScene: SKScene {
let ball = SKSpriteNode(imageNamed: "ball")
override func didMoveToView(view: SKView) {
/* Setup your scene here */
backgroundColor = SKColor.clearColor()
ball.position = CGPoint(x: size.width * 0.5, y: size.height * 0.5)
addChild(ball)
ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.frame.size.width)
ball.physicsBody?.restitution = 0.0
ball.physicsBody?.linearDamping = 0.0
ball.size = CGSize(width: 100, height: 100)
ball.physicsBody?.affectedByGravity = false
let oscillate = SKAction.oscillation(amplitude: size.height/4, timePeriod: 8, midPoint: ball.position)
ball.runAction(SKAction.repeatActionForever(oscillate))
}
}如您所见,我忽略了物体上的重力和其他“力”。 这导致以下行为:
翻译自: https://www.javacodegeeks.com/2016/01/example-using-extensions-swift.html