Недавно мне понадобилось изображение в моем приложении iOS, которое колеблется. Я натолкнулся на пример кода Swift, который показал, как это сделать, и на самом деле это было довольно легко сделать (см. Теорию, лежащую в основе формулы). Код использует функцию «расширения» в Swift. Это действительно крутая функция в Swift. Эта функция позволяет расширять функциональность класса без необходимости расширять класс (как, например, в Java). Для основного примера функции см. Этот пример . В моем примере эта функция используется для расширения функциональности класса SKAction , еще одной интересной вещи в библиотеке iOS SpriteKit.
Расширение выглядит так:
01
02
03
04
05
06
07
08
09
10
11
|
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 } } |
Вы можете использовать расширение и применить его к SpriteNode в вашем GameScene.swift, например, так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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)) } } |
Как видите, я игнорировал гравитацию и другие «силы» на объекте. Это приводит к следующему поведению:
Ссылка: | Пример использования расширений в Swift от нашего партнера по JCG Паскаля Альмы в блоге The Pragmatic Integrator . |