游戏结束后如何在 Swift SceneKit 游戏中启用广告?

Posted

技术标签:

【中文标题】游戏结束后如何在 Swift SceneKit 游戏中启用广告?【英文标题】:How do I enable ads in a Swift SceneKit game when it's game over? 【发布时间】:2015-07-06 23:29:49 【问题描述】:

如果您曾经玩过 Flappy Bird 游戏并结束游戏,则应用顶部会显示一则广告,直到您开始新游戏。我想这样做,但我很难将所需的代码传递给 gameOver 函数(如果可能的话)。

我是否必须为此添加一个全新的场景,或者我可以在 GameScene 的类中完成吗?

我知道展示广告,你去 ViewController.swift 做这个:

class GameViewController: UIViewController 

  override func viewDidLoad() 
   super.viewDidLoad()
   let scene = GameScene(size: CGSize(width: 2048, height: 1536))
   let skView = view.self as! SKView
   skView.ignoresSiblingOrder = false
   scene.scaleMode = .AspectFill
   skView.presentScene(scene)

   self.canDisplayBannerAds = true
  

唯一的问题是它会一直显示广告,即使在游戏运行时也是如此。一旦它移入 GameScene.swift 文件,广告仍在运行。因此,我尝试将 viewDidLoad() 添加到 GameScene.swift 文件中(这是整个游戏屏幕。我的游戏没有标题场景或游戏结束场景。这些场景发生在 GameScene 类中;它所做的只是显示图像)。

我将它添加到 GameScene.swift 中,但它没有做任何事情。

class adBannerView: UIViewController 

 override func viewDidLoad() 

   super.viewDidLoad()

   self.canDisplayBannerAds = true

  

gameOver() 函数出现时如何让广告弹出?还是比赛结束的时候?我尝试过查看其他问题,但它们与我的不同。我不能只在 gameOver 函数中添加 self.canDisplayAds = true。

请注意,需要的代码是 Swift 2.0,我使用的是 Xcode 7 Prerelease 2。

【问题讨论】:

您的编辑应该作为答案发布。 【参考方案1】:

从您的 viewDidLoad 中删除 self.canDisplayBannerAds = true 并将其添加到您的游戏结束功能。然后在重启游戏的函数中添加self.canDisplayBannerAds = false。这将删除 iAd 横幅。

func gameOver() 
    // Display ad when game ends
    self.canDisplayBannerAds = true


func replayGame() 
    // Game will restart so remove ad
    self.canDisplayBannerAds = false

请注意,当您显示 iAd 横幅时,它可能需要一秒钟才能加载。

【讨论】:

我会尽可能尝试这个,但如果我记得的话,它不会起作用,因为 canDisplayBannerAds 必须在 viewDidLoad() 函数中。我想我以前试过这个,但什么也没发生。我再检查一下。【参考方案2】:

解决方案 我解决了它,同时环顾四周。我将以下代码添加到我的 viewController 类中。

var SH = UIScreen.mainScreen().bounds.height
let transition = SKTransition.fadeWithDuration(0)
var UIiAd: ADBannerView = ADBannerView()

override func viewWillAppear(animated: Bool) 
    var BV = UIiAd.bounds.height
    UIiAd.delegate = self
    UIiAd.frame = CGRectMake(UIScreen.mainScreen().bounds.width / 4.6, SH + BV, 0, 0)
    self.view.addSubview(UIiAd)


override func viewWillDisappear(animated: Bool) 
    UIiAd.delegate = nil
    UIiAd.removeFromSuperview()


func bannerViewDidLoadAd(banner: ADBannerView!) 
    var BV = UIiAd.bounds.height
    UIView.beginAnimations(nil, context: nil)
    UIView.setAnimationDuration(0.5) // Time it takes the animation to complete
    UIiAd.alpha = 1 // Fade in the animation
    UIView.commitAnimations()


func bannerView(banner: ADBannerView!, didFailToReceiveAdWithError error: NSError!) 
    UIView.beginAnimations(nil, context: nil)
    UIView.setAnimationDuration(0.5)
    UIiAd.alpha = 0
    UIView.commitAnimations()


func showBannerAd() 
    UIiAd.hidden = false
    var BV = UIiAd.bounds.height

    UIView.beginAnimations(nil, context: nil)
    UIView.setAnimationDuration(0.5) // Time it takes the animation to complete
    UIiAd.frame = CGRectMake(UIScreen.mainScreen().bounds.width /  4.6, SH - BV, 0, 0) // End position of the animation
    UIView.commitAnimations()


func hideBannerAd() 
    UIiAd.hidden = true
    var BV = UIiAd.bounds.height

    UIView.beginAnimations(nil, context: nil)
    UIView.setAnimationDuration(0.5) // Time it takes the animation to complete
    UIiAd.frame = CGRectMake(UIScreen.mainScreen().bounds.width /  4.6, SH + BV, 0, 0) // End position of the animation
    UIView.commitAnimations()


override func viewDidLoad() 
    super.viewDidLoad()

    self.UIiAd.hidden = true
    self.UIiAd.alpha = 0

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "hideBannerAd", name: "hideadsID", object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "showBannerAd", name: "showadsID", object: nil)
//My other code

然后我将此代码添加到将显示广告的 scene.swift 文件中。这些函数放在类之外。

func showAds() 
    NSNotificationCenter.defaultCenter().postNotificationName("showadsID", object: nil)

func hideAds() 
NSNotificationCenter.defaultCenter().postNotificationName("hideadsID", object: nil)

然后当我想展示广告时,我使用 showAds() 调用 gameOver() 中的函数。完美运行!

【讨论】:

以上是关于游戏结束后如何在 Swift SceneKit 游戏中启用广告?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SCNFloor 的属性与 Swift 和 Scenekit 一起使用?

SpriteKit 和 SceneKit – 如何完全暂停游戏?

SpriteKit和SceneKit - 如何完全暂停游戏?

Swift - 如何更改SCNNode对象的Pivot

SceneKit:在 Swift 4 中缩放相机

使用 Swift 在 Scenekit 中移动相机