2Dキャラをアニメーションさせる為に画像(png 透明有)を複数用意してアセットフォルダに保存する。
Playgroundアプリ画面の左上の
サイドバー アイコン>追加ファイル アイコン>写真
でアセットフォルダにコピーする画像を選ぶ。
コピー後にファイル名を分かりやすい名前に変更しておく。
透明部分有りのPNGファイルはパソコンで作った方が簡単かな?
動作テストなら写真フォルダ内の適当な画像を設定する。かなり縮小されますが(笑)
【ContentView.swift】
import SwiftUI
import SpriteKit
struct ContentView: View {
var currentScene: SKScene {
let scene = MySKScene()
scene.scaleMode = .resizeFill
return scene
}
var body: some View {
ZStack {
SpriteView(scene: self.currentScene)
.frame(width: 300, height: 250)
}
}
}
class MySKScene: SKScene {
// シーンがViewに表示されたときに実行する処理をdidMoveメソッド内に書きます
override func didMove(to view: SKView) {
let node = SKSpriteNode()
node.size = CGSize(width: 50, height: 50)
node.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))
self.addChild(node)
// 複数の画像を用意して順次0.3秒で切り替えてアニメーション表示させる
let textures: [SKTexture] = [
.init(imageNamed: "Test-a"), // アセット内のファイル名を指定する
.init(imageNamed: "Test-b"),
.init(imageNamed: "Test-c")
]
let action = SKAction.animate(with: textures, timePerFrame: 0.3)
node.run(.repeatForever(action))
}
}
【追記】
システムのアイコンを画像変換して利用をし、アニメーションの確認をするコード。
import SwiftUI
import SpriteKit
struct ContentView: View {
var currentScene: SKScene {
let scene = MySKScene()
scene.scaleMode = .resizeFill
scene.backgroundColor = .yellow // 追加
return scene
}
var body: some View {
ZStack {
SpriteView(scene: self.currentScene)
.frame(width: 300, height: 250)
}
}
}
class MySKScene: SKScene {
// シーンがViewに表示されたときに実行する処理をdidMoveメソッド内に書きます
override func didMove(to view: SKView) {
let node = SKSpriteNode()
node.size = CGSize(width: 50, height: 50)
node.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))
self.addChild(node)
let dummy = SKTexture(imageNamed: "dummy") // cgiが失敗した時の画像。アセットに用意しておく
var texture1 = dummy
if let cgi1 = UIImage(systemName: "arrowshape.up.circle" )?.cgImage { // システムのアイコンを利用する
texture1 = SKTexture(cgImage: cgi1)
}
var texture2 = dummy
if let cgi2 = UIImage(systemName: "arrowshape.forward.circle" )?.cgImage {
texture2 = SKTexture(cgImage: cgi2)
}
var texture3 = dummy
if let cgi3 = UIImage(systemName: "arrowshape.down.circle" )?.cgImage {
texture3 = SKTexture(cgImage: cgi3)
}
var texture4 = dummy
if let cgi4 = UIImage(systemName: "arrowshape.backward.circle" )?.cgImage {
texture4 = SKTexture(cgImage: cgi4)
}
let textures: [SKTexture] = [
texture1,
texture2,
texture3,
texture4
]
let action = SKAction.animate(with: textures, timePerFrame: 0.3)
node.run(.repeatForever(action))
}
}