Проблема со SKVideoNode в SpriteKit, симулятор просто показывает серый экран

Попытка запустить 'Cut Scense Video' перед входом в мою сборку игры. Игра отлично работает. Я создал отдельную сцену, которую я назвал "StartScene", чтобы воспроизвести мою сцену. Сборка удалась, но когда она добралась до фрагмента сцены на симуляторе, я получил пустой серый экран. Я выполнил поиск в Интернете и получил много проблем с изменением размера видео, однако Apple Developer говорит следующее:

При создании видео узла его свойство размера инициализируется в соответствии с базовым размером видеоконтента, но вы можете изменить его, если хотите. Видеоконтент автоматически растягивается до нового размера.

Пример кода, скопированный с Apple Developer:

let sample = SKVideoNode(fileNamed: "sample.mov")
sample.position = CGPoint(x: frame.midX,
                      y: frame.midY)
addChild(sample)
sample.play()

Вот мой код в моем StartScene.swift для воспроизведения вырезанной сцены:

import SpriteKit
import GameplayKit

class StartScene: SKScene {
    override func sceneDidLoad() {
        let openingVideo = SKVideoNode(fileNamed: "MyCutScene.mp4")
        openingVideo.position = CGPoint(x: frame.midX, y: frame.midY)
        addChild(openingVideo)
        openingVideo.play()
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let gameSceneTemp = GameScene(fileNamed: "GameScene")
        self.scene?.view?.presentScene(gameSceneTemp!, transition: SKTransition.doorsCloseHorizontal(withDuration: 1.0))
    }
}

Возможно, это ошибка новичка в простом форматировании сцены вообще. Я думал, что это будет довольно просто. Видео сохраняется в комплекте приложений в разделе "Активы", и да, я убедился, что имя совпадает с тем, что я вставил в строку кода. Последний фрагмент кода - это просто мой переход к GameScene с функцией touchesBegan.

1 ответ

Я спросил друга разработчика Apple, и он понял это для меня. Вот шаги, чтобы заставить SKVideoNode играть правильно:Обратите внимание, моя сцена для этой сборки называется StartScene.

  1. Установите класс в файле StartScene.sks для StartScene Моя проблема здесь в том, что я не изменил "Custom Class" на имя моей сцены. Не сомневайся, новичок ошибся мной точно.

  2. Добавьте mp4 к этапу сборки "Copy Bundle Resources" (не уверен, зачем это нужно, я не думаю, что это в типичном приложении, но, возможно, игры разные) Убедитесь, что видеофайл находится не только в файлах приложения слева, но также скопирован в область "Фазы сборки" -> "Копировать набор ресурсов".

  3. В этот момент он будет воспроизводиться, но вы услышите только звук видео. Чтобы увидеть это вам нужно установить размер. Поэтому добавьте строку в функцию didMove в классе StartScene, чтобы установить размер.

    override func didMove(to view: SKView) {
    let openingVideo = SKVideoNode(fileNamed: "UncleClaryWolfIntro.mp4")
    openingVideo.anchorPoint = CGPoint(x: 0.5, y: 0.5)
    openingVideo.position = CGPoint(x: 0, y: 0)
    openingVideo.size = frame.size
    addChild(openingVideo)
    openingVideo.play()
    }
    

Все о том, как правильно выбрать размер экрана.

  1. Видео теперь должно показываться, но соотношение сторон будет отключено. Так что в GameViewController измените эту строку

    scene.scaleMode = .aspectFill
    

    К этому

    scene.scaleMode = .fill
    

и вуаля! Видео должно воспроизводиться, и мое видео теперь воспроизводится с этим кодом, и шаги выполнены. Надеюсь, это поможет вам, как и мне. Удачного кодирования!

Другие вопросы по тегам