Swiftで遊ぼう! - 848 - 水島企画さんのサンプルに挑戦
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- 初心者はここから!-> 50オヤジでもできるiOS開発
- 私の本業、オフィシャルなブログ-> Life-LOG
- Swift 3 対応
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 } }
すると次のようになります。解説は今後加えます。