4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SwiftAdvent Calendar 2023

Day 23

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

Last updated at Posted at 2023-12-24

SpriteKitとは

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

SpriteKitを使ってみよう!

下記の画像のように雪を降らせてみます!

今回はUIKitのプロジェクトにSpriteKit Practice Fileを追加します!
af2655b853ea656b7bf83a9f7c79866e.png

今回は雪を降らせたいので、テンプレートをSnowにします!
25b8cc6a72bde45e636981f34f615c1d.png

下記のような新しいファイルが作成されます!
72ced44d2974326328a5bb3212deb319.jpg
IBOutletでskViewを接続します!
69737b67acdc20fa898077132fcbd42d.png

UIViewを追加し、画面全体に広げ、ClassをSKViewに準拠させる!その上にLabelとImageを追加させます!
bfc8f75d1715e6b53001cf470fa94bb8.png

青色のUIView、その上にSKView、その上にSKScene、その上にLabel・Imageといった階層です!

コードは下記のように書きました!

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 コンテンツを編成するオブジェクト

path(forResource:ofType:inDirectory:)
指定された名前とファイル拡張子で識別され、指定されたバンドル サブディレクトリにあるリソースの絶対パス名を返す。

func path(
    forResource name: String?,
    ofType ext: String?,
    inDirectory subpath: String?
) -> String?

NSKeyedUnarchiver

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

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

position(_:)
このビューの中心を親の座標空間内の指定された点に配置する。

func position(_ position: CGPoint) -> some View

CGPointMake(_:_:)
指定された座標の点を返す!

func CGPointMake(
    _ x: CGFloat,
    _ y: CGFloat
) -> CGPoint

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

func addChild(_ childController: UIViewController)

presentScene(_:transition:)
現在のシーンから新しいシーンに遷移する!

func presentScene(
    _ scene: SKScene,
    transition: SKTransition
)

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

func addSubview(_ view: UIView)

参考文献

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?