我在'SKScene'中有一个菜单。我正在尝试将Peek和Pop功能集成到其中。我有多种可能的选择,所以我的问题是如何识别哪一个被强制触摸。
这是我的代码:
import SpriteKit
import UIKit
class Menu: SKScene, UIViewControllerPreviewingDelegate {
//SETUP Menu
func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
return UIViewController()
}
//POP
func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
return
}
}
GameViewController.swift:
import UIKit
import SpriteKit
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let scene = GameScene(fileNamed:"GameScene") {
if self.traitCollection.forceTouchCapability == .available {
registerForPreviewing(with: scene as! UIViewControllerPreviewingDelegate, sourceView: scene.view!)
}
}
// Move to Menu
}
}
我很确定我应该在sourceView
字段中传递信息。但由于这是在GameViewController中,我不知道该怎么做。我不知道如何在菜单中执行此操作,我将在哪里放置此代码?
if let scene = GameScene(fileNamed:"GameScene") {
if self.traitCollection.forceTouchCapability == .available {
registerForPreviewing(with: scene as! UIViewControllerPreviewingDelegate, sourceView: ButtonPressed)
}
}
答案 0 :(得分:0)
你将无法在SKScene或SKSpriteNode菜单中使用Peek和Pop,就像你正在尝试一样,我试图在我的一个游戏中做同样的事情。
Peek和Pop仅适用于UIKit,特别是它允许您预览(Peek)而不是打开(Pop)UIViewControllers。
在SpriteKit中,你通常只有1个ViewController,GameViewController。 GameViewController应该只处理你的SKScene演示文稿,你的实际用户界面是/应该在相关的SKScenes中直接使用SpriteKit API,如SKLabelNodes,SKSpriteNodes等。因此,你真的没有使用UIKit,你可以用Peek和Pop预览。
这有一些例外,所以它取决于你正在制作什么样的游戏。例如,在我的一个游戏中,我使用UICollectionViewController作为我的级别选择菜单(40级),因为它们非常适合该场景(单元重用,平滑滚动等)。因为该菜单是使用UIKit制作的,所以当您强行触摸单元格时,我可以注册窥视和弹出。我还有另外一个带有UILabel,UIImageViews等的UIViewController,我专门用于Peeking(见图),当我弹出时我只是开始实际的水平。
总而言之,在SpriteKit中使用Peek和Pop的情况并不多。我也不建议尝试使用UIKIt设计您的UI,以便您可以使用Peek和Pop。希望Apple有一天会更新API,以便能够查看和播放SKNodes或SKScenes,这将是非常棒的。
希望这有帮助