[Swift][SpriteKit] UIPinchGestureRecognizer で SKNode を拡大・縮小する

2019年4月3日ITSwift

SpriteKitNode を UIPinchGestureRecognizer 使って、拡大・縮小します。

試験的に ViewController に仕込んでみました。

import UIKit
import SpriteKit

class SpriteKitNodePinchViewController: UIViewController {

    @IBOutlet weak var skView: SKView!
    
    var scene: MyScene!
    var currentScale:CGFloat = 1.0
    
    override func viewDidLoad() {
        super.viewDidLoad()

        scene = MyScene(size: view.frame.size)
        let screensize = UIScreen.main.bounds.size
        skView.frame = CGRect(x: 0, y: 0, width: screensize.width, height: screensize.height)
        skView.showsFPS = true
        skView.showsNodeCount = true
        
        skView.ignoresSiblingOrder = true
        
        scene.scaleMode = .resizeFill
        
        skView.allowsTransparency = true
        skView.presentScene(scene)
        self.view.addSubview(skView)
        
        let pinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(pinched))
        self.skView.addGestureRecognizer(pinchGestureRecognizer)
    }

    @objc func pinched(recognizer: UIPinchGestureRecognizer) {
        for node in scene.children {
            switch recognizer.state {
            case .changed:
                if recognizer.scale > currentScale {
                    node.run(SKAction.scale(by: 1.07, duration: 0))
                }
                
                if recognizer.scale < currentScale {
                    node.run(SKAction.scale(by: 0.97, duration: 0))
                }
                
            default:
                break
            }
        }
    }
}

SKScene にある全てのノードに対して、拡大・縮小を行っています。

SKAction で対象のノードのスケールを1以上か以下か判定して、拡大するか、縮小するかしております。

1.07、0.97くらいが試していていい塩梅でした。

ただ、この実装は SKScene の touchesBegan、touchesMoved を全く考慮してませんので、ご注意ください。

サンプルプロジェクト:
https://github.com/nobuhiroharada/UIKit-Samples/tree/master/UIKitSamples/2-SpriteKitNodePinch

スポンサーリンク

Posted by nobuhiro harada