SpriteKitで雪を降らせてみよう！

# SpriteKitとは
Appleが提供している2Dのゲームを作るためのフレームワーク。
SpriteKitは、形状、パーティクル、テキスト、画像、ビデオを2次元で描画するための汎用フレームワーク。

https://developer.apple.com/spritekit/

# SpriteKitを使ってみよう！
下記の画像のように雪を降らせてみます！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/37cfb362-fd00-5b29-453f-50d2264492a1.png" width=300>



今回はUIKitのプロジェクトにSpriteKit Practice Fileを追加します！
![af2655b853ea656b7bf83a9f7c79866e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/a2cfd27c-43ce-4b46-755d-c999c44ec48e.png)

今回は雪を降らせたいので、テンプレートをSnowにします！
![25b8cc6a72bde45e636981f34f615c1d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/3b17f2cb-2631-e678-827f-2c5774fa8e51.png)

下記のような新しいファイルが作成されます！
![72ced44d2974326328a5bb3212deb319.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/131581bd-ef69-513b-e90a-923155208e13.jpeg)
IBOutletでskViewを接続します！
![69737b67acdc20fa898077132fcbd42d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/118b542c-9c4e-1872-9e37-cc9ce641db84.png)

UIViewを追加し、画面全体に広げ、ClassをSKViewに準拠させる！その上にLabelとImageを追加させます！
![bfc8f75d1715e6b53001cf470fa94bb8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/6f59cf3c-9fcb-ebd6-72b6-0e81b072732f.png)


青色のUIView、その上にSKView、その上にSKScene、その上にLabel・Imageといった階層です！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/38d4b590-8816-7787-3106-d3ca6590deb2.png" width=300>

コードは下記のように書きました！
```Swift:ViewController.swift
import UIKit
import SpriteKit

class ViewController: UIViewController {

    @IBOutlet weak var skView: SKView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Sceneを追加
        setupSnow()
    }
    func setupSnow() {
        let scene = SKScene(size: self.view.frame.size)
        let path = Bundle.main.path(forResource: "Snow", ofType: "sks")
        let particle = NSKeyedUnarchiver.unarchiveObject(withFile: path!) as! SKEmitterNode
        particle.name = "Snow"
        particle.position = CGPointMake(self.view.frame.width / 2, self.view.frame.height)
        scene.addChild(particle)
        self.skView!.presentScene(scene)
        self.view.addSubview(self.skView!)
    }
}
```
`SpriteKit`インポートします！

`SKScene(size: CGSize)`を作成する！
すべてのアクティブな SpriteKit コンテンツを編成するオブジェクト

https://developer.apple.com/documentation/spritekit/skscene

`path(forResource:ofType:inDirectory:)`
指定された名前とファイル拡張子で識別され、指定されたバンドル サブディレクトリにあるリソースの絶対パス名を返す。
```Swift
func path(
    forResource name: String?,
    ofType ext: String?,
    inDirectory subpath: String?
) -> String?
```
https://developer.apple.com/documentation/foundation/bundle/1409670-path

`NSKeyedUnarchiver`

https://developer.apple.com/documentation/foundation/nskeyedunarchiver

`unarchiveObject(with:)`
SKEmitterNodeとしてデコードして返す！
指定されたオブジェクトによって以前にエンコードされ、格納されていたオブジェクト グラフをデコードして返す！

https://developer.apple.com/documentation/spritekit/skemitternode


`SKEmitterNode`
さまざまなパーティクル エフェクトのソース。
オブジェクトは、小さなパーティクル スプライトを自動的に作成してレンダリングするノード
パーティクル表示をする際には SKEmitterNode を使う！

https://developer.apple.com/documentation/spritekit/skemitternode

`position(_:)`
このビューの中心を親の座標空間内の指定された点に配置する。
```Swift
func position(_ position: CGPoint) -> some View
```

https://developer.apple.com/documentation/swiftui/view/position(_:)


`CGPointMake(_:_:)`
指定された座標の点を返す！
```Swift
func CGPointMake(
    _ x: CGFloat,
    _ y: CGFloat
) -> CGPoint
```

https://developer.apple.com/documentation/coregraphics/1455746-cgpointmake

`addChild(_:)`
指定されたビューコントローラーを現在のビューコントローラーの子として追加。
particle:SKEmitterNodeを子として追加する！
```Swift
func addChild(_ childController: UIViewController)
```

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621394-addchild

`presentScene(_:transition:)`
現在のシーンから新しいシーンに遷移する！
```Swift
func presentScene(
    _ scene: SKScene,
    transition: SKTransition
)
```
https://developer.apple.com/documentation/spritekit/skview/1520090-presentscene

`addSubview(_:)`
受信者のサブビューのリストの最後にビューを追加。
SKViewを追加。
```Swift
func addSubview(_ view: UIView)
```

https://developer.apple.com/documentation/uikit/uiview/1622616-addsubview

 # 参考文献
 
https://qiita.com/Koi-fumi/items/55f5e68ef89a48a057b4
 
 https://qiita.com/akatsuki174/items/11e740410177242b710d

 https://qiita.com/ariiyu/items/ffe5a0e32ebda70e4f02