[Swift]SpriteKit_タップするとネズミが座標を移動する

タップするとネズミの画像が座標を移動するサンプルコードです。

コードの前提

・GameSceneを使うため、プロジェクトの設定でSpriteKitゲームテンプレートを選択している必要あり
・GameScene クラスで、白い背景にネズミのスプライトを表示
・touchesBegan メソッドで、画面がタッチされたときにネズミが新しい位置に移動するようにしている。

タップすると画像が上下に動くだけのシンプルなコード

import SpriteKit

class GameScene: SKScene {
    let mouseNode = SKSpriteNode(imageNamed: "mouse")
    var isMouseAboveCenter = false

    override func didMove(to view: SKView) {
        backgroundColor = SKColor.white

        // シーンのサイズとアンカーポイントを設定
        self.size = view.bounds.size
        self.anchorPoint = CGPoint(x: 0.5, y: 0.5)

        // ネズミの初期位置をシーンの中心に設定
        mouseNode.position = CGPoint(x: 0, y: 0)
        mouseNode.size = CGSize(width: mouseNode.size.width / 5, height: mouseNode.size.height / 5)
        addChild(mouseNode)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        // ネズミを画面中央の上か下に移動
        moveMouse()
    }

    func moveMouse() {
        let centerY = 0 // シーンの中心Y座標
        let moveToY: CGFloat

        if isMouseAboveCenter {
            // 画面中央より少し下に移動
            moveToY = CGFloat(centerY - 50) // 50は任意のオフセット値
        } else {
            // 画面中央より少し上に移動
            moveToY = CGFloat(centerY + 50) // 50は任意のオフセット値
        }

        // 移動先が画面外に出ないように制限
        let safeAreaInsets = view?.safeAreaInsets ?? UIEdgeInsets.zero
        let minY = safeAreaInsets.bottom - size.height / 2
        let maxY = size.height / 2 - safeAreaInsets.top
        let clampedY = max(minY, min(moveToY, maxY))

        let moveAction = SKAction.moveTo(y: clampedY, duration: 0.5)
        mouseNode.run(moveAction)

        // ネズミの位置をトラッキング
        isMouseAboveCenter.toggle()
    }
}

ネズミの近くをタップするとランダムな座標に移動

import SpriteKit

class GameScene: SKScene {
    let mouseNode = SKSpriteNode(imageNamed: "mouse")

    override func didMove(to view: SKView) {
        backgroundColor = SKColor.white

        self.size = view.bounds.size
        self.anchorPoint = CGPoint(x: 0.5, y: 0.5)

        mouseNode.position = CGPoint(x: 0, y: 0)
        mouseNode.size = CGSize(width: mouseNode.size.width / 5, height: mouseNode.size.height / 5)
        addChild(mouseNode)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        guard let touch = touches.first else { return }
        let touchLocation = touch.location(in: self)

        // ネズミとタッチの位置の距離を計算
        let distance = hypot(mouseNode.position.x - touchLocation.x, mouseNode.position.y - touchLocation.y)

        if distance < 50 { // ネズミの近くをタッチした場合
            moveMouseRandomly()
        }
    }

    func moveMouseRandomly() {
        let safeAreaInsets = view?.safeAreaInsets ?? UIEdgeInsets.zero
        let minX = safeAreaInsets.left - size.width / 2
        let maxX = size.width / 2 - safeAreaInsets.right
        let minY = safeAreaInsets.bottom - size.height / 2
        let maxY = size.height / 2 - safeAreaInsets.top

        let randomX = CGFloat.random(in: minX...maxX)
        let randomY = CGFloat.random(in: minY...maxY)

        let moveAction = SKAction.move(to: CGPoint(x: randomX, y: randomY), duration: 0.5)
        mouseNode.run(moveAction)
    }
}

お知らせ

ヒヨコ歩数計という歩きながらヒヨコが育っていくアプリを作って、いろんな方に結構使ってもらっています。
RealmSwift, Admobの動画・インステ・バナー広告、UICollectionView、iOS-Charts、UITableViewを使用しているので、是非ご利用ください!