3
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?

More than 1 year has passed since last update.

iOSAdvent Calendar 2022

Day 4

SpriteKitで2D横スクロールゲームをつくろう(その3)

Last updated at Posted at 2022-12-03

Xcode-14.1 iOS-16.0

はじめに

前回の続きです。

今回はついに横スクロールさせます。

実装

横スクロールを実現するためにはいくつか方法があるかと思いますが今回はカメラをプレイヤーに追従させて横スクロールします!

こんな感じの構成(背景は固定にしてます)。

camera

シーン上にカメラ、床、プレイヤーをのせ、カメラの上に背景をのせてプレイヤーの位置に合わせてカメラを移動させることで横スクロールさせます。

カメラ表示

固定するものは SKCameraNode 上にのせます。

final class GameScene: SKScene {

    private let cameraNode = SKCameraNode()

    override func didMove(to view: SKView) {
        camera = cameraNode
        cameraNode.position = .init(x: frame.midX, y: frame.midY)
        addChild(cameraNode)

        let backNode = SKSpriteNode(imageNamed: "background")
        backNode.size = frame.size
        cameraNode.addChild(backNode)
    }

    override func update(_ currentTime: TimeInterval) {
        // カメラのx座標だけ移動
        cameraNode.position = .init(x: player.position.x, y: frame.midY)
    }
}

注意点としてカメラの初期化は下記のようにしてはダメです。

camera = SKCameraNode()

SKScene.camera の定義が下記のように weak なので保持できません。

weak open var camera: SKCameraNode?

ボタン表示

ボタンは常に表示するためカメラに置きます。そのまま置くと床の背面に表示されるので下記のように zPosition を設定してやる必要があります。

override func didMove(to view: SKView) {
    let up = UIImage(systemName: "arrow.up")!
    let upNode = SKSpriteNode(texture: .init(image: up), size: .init(width: 40, height: 40))
    upNode.color = .white
    upNode.name = "up"
    upNode.position = .init(x: -(frame.width/2) + 40, y: -(frame.height/2) + 40)
    upNode.zPosition = 10 // これで床より前に持ってくる
    cameraNode.addChild(upNode)

    let right = UIImage(systemName: "arrow.right")!
    let rightNode = SKSpriteNode(texture: .init(image: right), size: .init(width: 40, height: 40))
    rightNode.name = "right"
    rightNode.zPosition = 10 // これで床より前に持ってくる
    rightNode.position = .init(x: -(frame.width/2) + 120, y: -(frame.height/2) + 40)
    cameraNode.addChild(rightNode)
}

おわりに

前回のと合わせるとこんな感じになります。

game

このままではただ動くだけなので次回は敵キャラを表示します!(次回はもっとボリュームのある記事になるはず:kissing_heart:

SpriteKit あまりさわったことないのでもっといい方法あればぜひ教えて下さい:bow:

まとめ

3
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
3
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?