雪碧套件中的iCarousel

说明

我试图build立一个类似Crossy Road的人物select菜单(正如你在这里看到的)。 所以我发现了这个iCarousel ,它可以帮助我完成所有的工作,但是我读到的所有内容都是关于将其实现到ViewController ,这不是我的情况。 我使用的是GameScene ,但是我没有发现任何关于它的事情。 无论如何,我可以执行它到我的游戏? 甚至是另一个类似于上面提到的字符select菜单的效果?


尝试(beyowulf)

你可以在这里下载。

GameScene.swift

 import SpriteKit class GameScene: SKScene { var show = SKSpriteNode() var hide = SKSpriteNode() func showCharPicker(){ NSNotificationCenter.defaultCenter().postNotificationName("showCharPicker", object: nil) } func hideCharPicker(){ NSNotificationCenter.defaultCenter().postNotificationName("hideCharPicker", object: nil) } override func didMoveToView(view: SKView) { /* Setup your scene here */ print("didMoveToView") show = SKSpriteNode(imageNamed: "show") show.anchorPoint = CGPointZero show.position = CGPointZero addChild(show) hide = SKSpriteNode(imageNamed: "hide") hide.anchorPoint = CGPointZero hide.position = CGPoint(x: self.frame.width / 2 - hide.frame.width / 2, y: 0) addChild(hide) } override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { for touch in touches{ let location = touch.locationInNode(self) let node = nodeAtPoint(location) if node == show{ print("show") showCharPicker() } else if node == hide{ print("hide") hideCharPicker() } } } } 

GameViewController.swift

 import UIKit import SpriteKit class GameViewController: UIViewController, iCarouselDataSource, iCarouselDelegate{ var squaresArray : NSMutableArray = NSMutableArray() @IBOutlet weak var carousel: iCarousel! deinit{ NSNotificationCenter.defaultCenter().removeObserver(self) } func showCarousel(){ self.carousel.hidden = false } func hideCarousel(){ self.carousel.hidden = true } override func viewDidLoad(){ super.viewDidLoad() // Configure iCarousel carousel.dataSource = self carousel.delegate = self carousel.type = .CoverFlow carousel.reloadData() self.carousel.hidden = true // Register showCarousel and hideCarousel functions NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.showCarousel), name: "showCharPicker", object: nil) NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.hideCarousel), name: "hideCharPicker", object: nil) // Configure view let skView = SKView() self.view.insertSubview(skView, belowSubview: self.carousel) skView.frame = self.view.bounds // Additionals skView.showsFPS = true skView.showsNodeCount = true skView.ignoresSiblingOrder = true // Configure scene let scene = GameScene(size:self.view.bounds.size) scene.scaleMode = .ResizeFill scene.size = self.view.bounds.size skView.presentScene(scene) } //iCarousel override func awakeFromNib(){ super.awakeFromNib() squaresArray = NSMutableArray(array: ["square1","square2","square3"]) } func numberOfItemsInCarousel(carousel: iCarousel) -> Int{ return squaresArray.count } func carousel(carousel:iCarousel, didSelectItemAtIndex index:NSInteger){ //self.hideCarousel() } func carousel(carousel: iCarousel, viewForItemAtIndex index: Int, reusingView view: UIView?) -> UIView{ var itemView: UIImageView if (view == nil){ itemView = UIImageView(frame:CGRect(x:0, y:0, width:200, height:200)) itemView.contentMode = .Center } else{ itemView = view as! UIImageView; } itemView.image = UIImage(named: "\(squaresArray.objectAtIndex(index))") return itemView } func carousel(carousel: iCarousel, valueForOption option: iCarouselOption, withDefault value: CGFloat) -> CGFloat{ if (option == .Spacing){ return value * 2 } return value } } 

发生了什么:

在这里输入图像说明

提前致谢,
路易斯。

你可以使用NSNotifications来显示你的angular色select器。 你只需要观察你的SKScene发布的通知。 你的viewDidLoad应该看起来像这样:

 override func viewDidLoad(){ super.viewDidLoad() carousel.type = .CoverFlow carousel.reloadData() let spriteKitView = SKView() spriteKitView.frame = self.view.bounds self.view.insertSubview(spriteKitView, belowSubview: self.carousel) spriteKitView.showsFPS = true spriteKitView.showsNodeCount = true spriteKitView.ignoresSiblingOrder = true self.gameScene = GameScene(size:self.view.bounds.size) self.gameScene.scaleMode = .AspectFill self.gameScene.imageName = self.images[0] as! String self.carousel.hidden = true spriteKitView.presentScene(self.gameScene) NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.showCarousel), name: gameScene.kShowNotification, object: nil) } 

你会想要实现carousel(carousel:iCarousel, didSelectItemAtIndex index:NSInteger)所以你知道select什么,所以你可以返回到游戏。 例如:

 func carousel(carousel:iCarousel, didSelectItemAtIndex index:NSInteger) { self.gameScene.imageName = self.images[index] as! String self.hideCarousel() } 

在视图控制器被释放之前,您还需要删除观察。

 deinit { NSNotificationCenter.defaultCenter().removeObserver(self) } 

然后您的SKScene可以发布通知:

 import SpriteKit class GameScene: SKScene { var imageName = "square1"{ didSet{ self.hidden = false self.childNode.texture = SKTexture(imageNamed: imageName) } } let kShowNotification = "showPicker" var childNode = SKSpriteNode() override func didMoveToView(view: SKView) { /* Setup your scene here */ self.childNode = SKSpriteNode(imageNamed: imageName) self.childNode.anchorPoint = CGPointZero self.childNode.position = CGPointZero self.addChild(self.childNode) } override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { self.showCharPicker() } func showCharPicker() { self.hidden = true NSNotificationCenter.defaultCenter().postNotificationName(kShowNotification, object: nil) } } 

如果你想改变命中检测,你需要inheritance你需要改变的视图的子类。 这种情况下你的iCarousel视图。

您可以重写hitTestpointInside 。 我已经创build了一个iCarousel子类,并且覆盖了iCarousel ,只有当点在旋转木马的contentView的子视图中时才返回true。

 class CarouselSubclass: iCarousel { override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { var inside = false for view in self.contentView.subviews { inside = CGRectContainsPoint(view.frame, point) if inside { return inside } } return inside } } 

您需要记住在界面构build器中更改您的传送带的类,并更新您的sockets。