栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

将GameViewController.swift链接到GameScene.swift

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将GameViewController.swift链接到GameScene.swift

这似乎是SpriteKit游戏存在的一个普遍问题,因此让我们来了解一下SpriteKit游戏和UIKit应用之间的区别。

当您制作常规的UIKit应用程序(例如YouTube,Facebook)时,将对每个看到的屏幕/菜单(主屏幕,频道屏幕,订阅频道屏幕等)使用ViewControllers,CollectionViews,Views等。因此,您将为此使用UIKit
API,例如UIButtons,UIImageViews,UILabels,UIViews,UICollectionViews等。为实现此目的,我们将使用情节提要。

另一方面,在SpriteKit游戏中,它的工作方式有所不同。您可以为看到的每个屏幕使用SKScenes(MenuScene,SettingScene,GameScene,GameOverScene等),并且只有1个ViewController(GameViewController)。带有SKView的GameViewController将显示您的所有SKScenes。

因此,我们应该使用SpriteKit
API(例如SKLabelNodes,SKSpriteNodes,SKNodes等)将UI直接添加到相关的SKScenes中。要在视觉上做到这一点,我们将使用SpriteKit场景级编辑器,而不是故事板。

因此,一般的逻辑是像往常一样从GameViewController加载您的第一个SKScene,然后从相关的SKScenes中加载其余的。除了默认代码外,您的GameViewController基本上应该没有代码。您还可以非常轻松地从一个场景过渡到另一个场景(GameScene->
GameOverScene)。

如果您将GameViewController用于您的UI,那么如果您有多个SKScenes,它将很快变得混乱,因为UI将被添加到GameViewController中,因此将被添加到所有SKScenes中。因此,当您在场景之间切换时,必须删除/显示UI,这很疯狂。

要在SpriteKit中添加标签,应该是这样的

 class GameScene: SKScene {  lazy var scoreLabel: SKLabelNode = {      let label = SKLabelNode(fontNamed: "HelveticaNeue")      label.text = "SomeText"      label.fontSize = 22      label.fontColor = .yellow      label.position = CGPoint(x: self.frame.midX, y: self.frame.midY)      return label  }()  override func didMove(to view: SKView) {      addChild(scoreLabel)  }}

要制作按钮,您实质上是创建一个SKSpriteNode并为其命名,然后在touchesBegan或touchesEnded中寻找它,然后在其上运行SKAction以获得动画和一些代码。

enum ButtonName: String {     case play     case share}class GameScene: SKScene {       lazy var shareButton: SKSpriteNode = { let button = SKSpriteNode(imageNamed: "ShareButton") button.name = ButtonName.share.rawValue button.position = CGPoint(x: self.frame.midX, y: self.frame.midY) return button        }()       override func didMove(to view: SKView) {  addChild(shareButton)       }       /// Touches began       override open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {  for touch in touches {      let location = touch.location(in: self)      let node = atPoint(location)      if let nodeName = node.name {switch nodeName {case ButtonName.play.rawValue:    // run some SKAction animation and some precase ButtonName.share.rawValue:    let action1 = SKAction.scale(to: 0.9, duration: 0.2)    let action2 = SKAction.scale(to: 1, duration: 0.2)    let action3 = SKAction.run { [weak self] in       self?.openShareMenu(value: "(self!.score)", image: nil) // image is nil in this example, if you use a image just create a UIImage and pass it into the method    }    let sequence = SKAction.sequence([action1, action2, action3])    node.run(sequence)default:     break         }    }          }     }}

为了使此操作变得更加容易,我将创建一个按钮帮助器类,作为一个简单的示例,请查看此 https://nathandemick.com/2014/09/buttons-sprite-
kit-using-swift/

您还可以查看Apple的示例游戏DemoBots,以获得更多功能丰富的示例。

这样,您可以在助手类中添加动画等内容,而不必为每个按钮重复执行代码。

为了进行共享,我实际上将使用UIActivityController而不是那些可能很快就会弃用的较旧的Social
API。这还允许您通过1个UI共享到多个服务,并且您的应用程序中也只需要1个共享按钮。在您调用它的SKScene中,它可能是一个简单的函数。

func openShareMenu(value: String, image: UIImage?) {    guard let view = view else { return }    // Activity items    var activityItems = [AnyObject]()    // Text    let text = "Can you beat my score " + value    activityItems.append(text as AnyObject)    // Add image if valid    if let image = image {        activityItems.append(image)    }    // Activity controller    let activityController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)    // iPad settings    if Device.isPad {        activityController.popoverPresentationController?.sourceView = view        activityController.popoverPresentationController?.sourceRect = CGRect(x: view.bounds.midX, y: view.bounds.midY, width: 0, height: 0)        activityController.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.init(rawValue: 0)    }    // Excluded activity types    activityController.excludedActivityTypes = [        UIActivityType.airDrop,        UIActivityType.print,        UIActivityType.assignToContact,        UIActivityType.addToReadingList,    ]    // Present    view.window?.rootViewController?.present(activityController, animated: true)}

然后按正确的按钮,这样调用它(请参见上面的示例)

openShareMenu(value: "(self.score)", image: SOMEUIIMAGE)

希望这可以帮助



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/391062.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号