swift 在SpriteKit场景中播放本地视频

2ic8powd  于 2022-12-10  发布在  Swift
关注(0)|答案(1)|浏览(162)

工作采取约23个“.mov”文件-短动画-将拼凑成一本儿童读物,与选择自己的冒险风格。
我觉得我对需要做什么有了一个很好的把握,在一个场景中呈现视频,一旦视频完成,创建x个按钮,将启动用户进入下一章/场景。进一步的道路将添加一些简单的动画和音乐/声音以及。
然而,我在播放视频时遇到了一些问题,我成功地创建了一个以截图为背景的场景,其中有一个按钮可以启动下一个场景,但对于添加视频,我既迷失了方向,也很难找到关于该主题的资源。
Apple Dev的解决方案是用途:

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

我在我的GameScene.swift文件中尝试了这个方法,尽管可能不正确。

import SpriteKit
    import GameplayKit

        class GameScene: SKScene {
    
        private var label : SKVideoNode?
    
        override func didMove(to view: SKView) {
        let sample = SKVideoNode(fileNamed: "V1.mov")
        sample.position = CGPoint(x: frame.midX,
                                  y: frame.midY)
        addChild(sample)
        sample.play()
        
        }
    }

我希望这将是-谁知道,也许它仍然是,我的金蛋的解决方案,因为然后其余的将真的只是一个复制和粘贴会议与多个场景,但我无法得到视频加载。
是否需要进一步将SKVideoNode连接到“V1.mov“文件?
此外,我认为我的一些困惑源于我是通过编程还是通过.sks /故事板文件来实现视频,是一个比另一个容易吗?
我也意识到这个问题可能更多地涉及到一些非常初级的东西,我在我的学习过程中已经刷过了,如果是这样的话,我为我的过度热情道歉:p
感谢你们能给予我的任何建议,我会非常感激的:)
最新消息:
好的,这是我目前为止的代码,它是我正在制作的书的框架,这是一个选择你自己的冒险,所以每个场景都有多个选项带你到其他场景:

import SpriteKit
import Foundation
import SceneKit

class v1Scene: SKScene {
    
    var trashButtonNode:SKSpriteNode!
    var bikeButtonNode:SKSpriteNode!
    var backButtonNode:SKSpriteNode!
    
    override func didMove(to view: SKView) {
        
        trashButtonNode = (self.childNode(withName: "trashButton") as? SKSpriteNode)
        bikeButtonNode = (self.childNode(withName: "bikeButton") as? SKSpriteNode)
        backButtonNode = (self.childNode(withName: "backButton") as? SKSpriteNode)
        
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch = touches.first
        let v2Scene = v2Scene(fileNamed: "v2Scene")
        let v3Scene = v3Scene(fileNamed: "v3Scene")
        let MainMenu = MainMenu(fileNamed: "MainMenu")
        
        if let location = touch?.location(in: self) {
            let nodesArray = self.nodes(at: location)
            
            if nodesArray.first?.name == "trashButton" {
                let transistion = SKTransition.fade(withDuration: 2)
                self.view?.presentScene(v2Scene!, transition: transistion)
                
            } else if nodesArray.first?.name == "bikeButton" {
                let transistion = SKTransition.fade(withDuration: 2)
                self.view?.presentScene(v3Scene!, transition: transistion)
                
            } else if nodesArray.first?.name == "backButton" {
                let transistion = SKTransition.fade(withDuration: 2)
                self.view?.presentScene(MainMenu!, transition: transistion)
                }
                
            }
        }
    }

我试图实现的是,当点击“trashButton”时,v2 Scene会启动并自动播放一段视频。每段视频都是一本书中的一个“页面”,所以需要为每段视频分配一个场景。
这些文件位于我的项目中的一个文件夹和Assets. xcastes文件夹中,尽管.mov文件在该文件夹中似乎不起作用。
谢谢,欧文

nmpmafwu

nmpmafwu1#

因为视频文件在它们自己的文件夹中,所以不能使用带有文件名的SKVideoNode init。必须使用带有URL作为参数的init。
要获取视频文件的URL,必须调用Bundle类的url函数,提供文件名、扩展名和视频文件所在文件夹的路径名。
以下代码显示了从应用捆绑包中的文件创建视频节点所需执行的操作,并以问题中的V1.mov文件为例:

let bundle = Bundle.main
if let videoURL = bundle.url(forResource: "V1", 
    withExtension: "mov", 
    subdirectory "FolderName" {

    sample = SKVideoNode(url: videoURL)
}

FolderName是视频文件所在的文件夹。
请确定包含视频文件的文件夹处于应用程序目标的“拷贝捆绑资源”构建阶段。文件夹必须处于此构建阶段,Xcode才能在构建项目时将其拷贝到应用程序捆绑。请执行以下步骤来查看目标的构建阶段:
1.通过选择项目窗口左侧的项目文件打开项目编辑器。
1.选择项目编辑器左侧的目标。
1.点按项目编辑器顶部的“构建阶段”按钮。

相关问题