我创建了一个 AR 应用程序,可以在特定图像锚点上播放视频。我想扩展该应用程序以处理超过 1 个图像。现在,当我扫描第一张图像时,它会播放视频,当我扫描第二张图像时,它会播放另一个视频。这里出现的问题是两个视频同时播放。
代码:
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
let node = SCNNode()
if let imageAnchor = anchor as? ARImageAnchor {
//below code needs to be duplicated in order to add more news
if imageAnchor.referenceImage.name == "harrypotter" {
let videoNode = SKVideoNode(fileNamed: "harrypotter.mp4")
videoNode.play()
let videoScene = SKScene(size: CGSize(width: 480, height: 360))
videoNode.position = CGPoint(x: videoScene.size.width / 2, y: videoScene.size.height / 2)
videoNode.yScale = -1.0
videoScene.addChild(videoNode)
let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)
plane.firstMaterial?.diffuse.contents = videoScene
let planeNode = SCNNode(geometry: plane)
planeNode.eulerAngles.x = -.pi / 2
node.addChildNode(planeNode)
}
if imageAnchor.referenceImage.name == "deatheater" {
let videoNode = SKVideoNode(fileNamed: "deatheater.mp4")
videoNode.play()
let videoScene = SKScene(size: CGSize(width: 480, height: 360))
videoNode.position = CGPoint(x: videoScene.size.width / 2, y: videoScene.size.height / 2)
videoNode.yScale = -1.0
videoScene.addChild(videoNode)
let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)
plane.firstMaterial?.diffuse.contents = videoScene
let planeNode = SCNNode(geometry: plane)
planeNode.eulerAngles.x = -.pi / 2
node.addChildNode(planeNode)
}
我尝试使用 2 个 if 条件来帮助在特定图像锚点上播放视频。现在,当我扫描第一张图像时,它会播放视频,当我扫描第二张图像时,它会播放另一个视频。这里出现的问题是两个视频同时播放。我希望每当我播放另一个视频时,第一个视频应该自动停止。
这里有一些建议,可以帮助您获得您想要的并改进您的代码。
不要为每个图像重复代码,而是创建一个执行所有这些操作的函数。
跟踪当前正在播放的歌曲,以便您可以停止它。
我不熟悉这些 API,但你会得到这样的信息:
class Player
{
private let rootNode = SCNNode()
private var playingNode: SCNNode?
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor)
{
if let imageAnchor = anchor as? ARImageAnchor
{
if let newNode = playVideo(names: imageAnchor.referenceImage.name)
{
<inset code to stop playing 'playingNode' and remove it>
playingNode = newNode
}
}
}
private func playVideo(named name: String) -> SCNNode?
{
guard <check if video file with 'name' exists> else { return nil }
let videoNode = SKVideoNode(fileNamed: "\(name).mp4")
videoNode.play()
let videoScene = SKScene(size: CGSize(width: 480, height: 360))
videoNode.position = CGPoint(x: videoScene.size.width / 2,
y: videoScene.size.height / 2)
videoNode.yScale = -1.0
videoScene.addChild(videoNode)
let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width,
height: imageAnchor.referenceImage.physicalSize.height)
plane.firstMaterial?.diffuse.contents = videoScene
let planeNode = SCNNode(geometry: plane)
planeNode.eulerAngles.x = -.pi / 2
return planeNode
}
}