読者です 読者をやめる 読者になる 読者になる

Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 848 - 水島企画さんのサンプルに挑戦

Sprite Kitの勉強をしていたので、水島企画さんのサイトを見つけることができました。豊富なサンプルコードを公開してくれているので勉強になります。

Objective-Cで書かれたコードを自分なりにSwift 3に書き換えてみたのですが、サンプルというスタンスのせいか、実用的なMVC構造になっていないので違和感を感じます。取りあえず公開します。

Single View Applicationのプロジェクトを作って、ModelSceneというSKSceneを継承したファイルも作ってみます。

import UIKit
import SpriteKit

class ModelScene: SKScene {
    
    let myLabel = SKLabelNode(fontNamed:"Chalkduster")
    
    override func didMove(to view: SKView) {
        /* Setup your scene here */
        myLabel.text = "Card"
        myLabel.fontSize = 45
        myLabel.position = 
CGPoint(x: self.frame.midX, y:self.frame.midY - 20)
        self.addChild(myLabel)
    }
    
}

そしてViwControllerを次のようにします。

import UIKit
import SpriteKit

class ViewController: UIViewController {
    
    weak var scene: ModelScene?
    
    var isCircular: Bool = false
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupScene()
        createCard()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func setupScene() {
        let spriteKitView = SKView(frame: view.bounds)
        let modelScene = ModelScene(size: spriteKitView.frame.size)
        modelScene.backgroundColor = UIColor.init(hue: 0.25, 
                                           saturation: 1, 
                                           brightness: 0.4, 
                                                alpha: 1)
        spriteKitView.presentScene(modelScene)
        view.addSubview(spriteKitView)
        scene = modelScene
    }
    
    func createCard() {
        let dw: Double = 2.0 * M_PI / 53.0
        for i in 0...53 {
            let w = dw * Double(i)
            let card = SKSpriteNode()
            card.name = "card"
            card.position = CGPoint(x: view.frame.midX, 
                                    y: view.frame.midY)
            scene?.addChild(card)
            
            let cardShape = SKShapeNode(rect: CGRect(x: 8, 
                                                     y: -12, 
                                                 width: 16,
                                                height: 24), 
                                          cornerRadius: 2)
            cardShape.lineWidth = 2
            cardShape.position = CGPoint(x: 0, y: 100)
            cardShape.fillColor = UIColor.red
            cardShape.strokeColor = 
                UIColor.white.withAlphaComponent(0.5)
            card.addChild(cardShape)
            card.zPosition = CGFloat(w)
        }
        isCircular = true
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, 
                              with event: UIEvent?) {
        scene?.children
            .filter { $0.name == "card" }
            .enumerated().forEach{(index, node) in
            let duration: Double = 3.0
            let waittime = (duration / 52.0) * (52.0 - Double(index))
            if self.isCircular {
                node.run(
                    SKAction.group([
                      SKAction.wait(forDuration: duration),
                      SKAction.rotate(toAngle: 0, 
                                     duration: duration - waittime)]))
                print(index)
            } else {
                let w = (2.0 * M_PI / 52.0) * Double(index)
                node.run(
                    SKAction.rotate(toAngle: CGFloat(w), 
                                   duration: duration - waittime))
                print("backwords:\(index)")
            }
        }
         self.isCircular = !self.isCircular
    }
    
}

すると次のようになります。解説は今後加えます。

f:id:yataiblue:20161122001542j:plain

カードで輪