SpriteViewの中にスプライト画像を表示し、それをドラッグで移動させる。
テクスチャーの初期化部分をMyTextureクラスに分離しました。
【ContentView.swift】
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 {
var image: SKSpriteNode!
var beforeDragPosition: CGPoint?
// シーンがViewに表示されたときに実行する処理をdidMoveメソッド内に書きます
override func didMove(to view: SKView) {
image = SKSpriteNode()
image.size = CGSize(width: 32, height: 32)
image.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))
self.addChild(image)
let action = SKAction.animate(with: MyTextures().imageTextures(), timePerFrame: 0.3)
image.run(.repeatForever(action))
}
// ドラッグした際に呼ばれる
override func touchesMoved(_ touches: Set, with event: UIEvent?) {
for t in touches {
self.touchMoved(toPoint: t.location(in: self))
}
}
//ドラッグが終了したとき(画面から指が離れたとき)に呼ばれる
override func touchesEnded(_ touches: Set, with event: UIEvent?) {
for t in touches { self.touchUp(atPoint: t.location(in: self)) }
}
// 指が画面から離れた際に呼ばれる
func touchUp(atPoint pos : CGPoint){
self.beforeDragPosition = nil
}
// 画像の位置を更新
func touchMoved(toPoint pos : CGPoint) {
if let p1 = self.beforeDragPosition {
self.image.position.x += pos.x - p1.x
self.image.position.y += pos.y - p1.y
// SpriteView の左右に飛び出ないようにする
let imagePosXMin = self.image.size.width/2
let imagePosXMax = self.size.width - imagePosXMin
if ( self.image.position.x < imagePosXMin ) {
self.image.position.x = imagePosXMin
}
else if ( self.image.position.x > imagePosXMax ) {
self.image.position.x = imagePosXMax
}
// SpriteView の上下に飛び出ないようにする
let imagePosYMin = self.image.size.height/2
let imagePosYMax = self.size.height - imagePosYMin
if ( self.image.position.y < imagePosYMin ) {
self.image.position.y = imagePosYMin
}
else if ( self.image.position.y > imagePosYMax ) {
self.image.position.y = imagePosYMax
}
}
self.beforeDragPosition = pos
}
}
テクスチャーの初期化。
【MyTextures.swift】
import SwiftUI
import SpriteKit
public class MyTextures {
public func imageTextures() -> [SKTexture] {
return _imageTextures
}
private var _imageTextures:[SKTexture] = []
init() {
if let uii = UIImage(systemName: "arrowshape.up.circle" ) {
_imageTextures.append(SKTexture(image: uii))
}
if let uii = UIImage(systemName: "arrowshape.forward.circle" ) {
_imageTextures.append(SKTexture(image: uii))
}
if let uii = UIImage(systemName: "arrowshape.down.circle" ) {
_imageTextures.append(SKTexture(image: uii))
}
if let uii = UIImage(systemName: "arrowshape.backward.circle" ) {
_imageTextures.append(SKTexture(image: uii))
}
}
}
init() {} 内のコードを書き換えました。
UIImageが使えないと思い込み CGImage で設定していました。
参考にしたサイトのURLを見失ってしまいました。
見つけ次第掲載します。