2017-04-19 59 views
0

我有一个精灵套件游戏,我想在游戏结束时显示插页式广告。那么,我可以在游戏结束后使用NotificationCenter展示广告,但问题在于当我关闭广告时,它会返回到WelcomeScene。我想在关闭广告后返回到GameOverScene,但是如何? GameViewController.swift当GameOver显示插页式广告后,场景返回到WelcomeScene

import UIKit 
import SpriteKit 
import GameplayKit 
import GoogleMobileAds 

class GameViewController: UIViewController , GADInterstitialDelegate { 


var interstitialAds : GADInterstitial! 


override func viewDidLoad() { 
    super.viewDidLoad() 



    createAndLoadAd() 
    NotificationCenter.default.addObserver(self, selector: #selector(GameViewController.showAds), name: NSNotification.Name("notification"), object: nil) 


} 


func createAndLoadAd(){ 
    let request = GADRequest() 
    let interstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910") 
    request.testDevices = [kGADSimulatorID] 
    interstitial.delegate = self 
    interstitial.load(request) 
    interstitialAds = interstitial 
} 

func showAds(){ 

    if interstitialAds.isReady { 
     interstitialAds.present(fromRootViewController: self) 
    } 
} 

func interstitialDidDismissScreen(_ ad: GADInterstitial) { 
    createAndLoadAd() 
} 


override var shouldAutorotate: Bool { 
    return true 
} 

override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
    if UIDevice.current.userInterfaceIdiom == .phone { 
     return .allButUpsideDown 
    } else { 
     return .all 
    } 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Release any cached data, images, etc that aren't in use. 
} 

override var prefersStatusBarHidden: Bool { 
    return true 
} 

override func viewWillLayoutSubviews() { 

    super.viewWillLayoutSubviews() 

    let menu = Menu() 
    let skView = self.view as! SKView 

    skView.ignoresSiblingOrder = true 

    menu.size = view.bounds.size 
    menu.scaleMode = SKSceneScaleMode.resizeFill 
    skView.presentScene(menu) 


} 

}

GameScene.swift

func gameOver(){ 

    NotificationCenter.default.post(name: NSNotification.Name("notification"), object: nil) 

    //reset everything 
    self.run(SKAction.playSoundFileNamed("Sound/die.wav", waitForCompletion: false)) 
    hud.updateScore(score: Int(score)) 


    player.die() 
    hud.showScore() 
    hud.showRestartMenu() 



} 

HUD.swift

import SpriteKit 

    class HUD : SKNode { 
    var scoreLabel = SKLabelNode(text: "0") 
    let restartBut = SKSpriteNode() 
    let menuBut = SKSpriteNode() 
    let highScoreLabel = SKLabelNode() 

    func createNode(screenSize : CGSize){ 

    scoreLabel.fontName = "AppleSDGothicNeo-SemiBold" 
    scoreLabel.position = CGPoint(x: (screenSize.width/2) - (screenSize.width/4 * 2) , y: (screenSize.height/2) - 50) 
    scoreLabel.fontColor = UIColor.black 
    scoreLabel.fontSize = 40 
    scoreLabel.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.center 
    scoreLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.center 
    scoreLabel.zPosition = 50 
    self.addChild(scoreLabel) 

    //Restart and Menu button 
    restartBut.texture = SKTexture(imageNamed: "restartButton") 
    restartBut.name = "restartButton" 
    restartBut.position = CGPoint(x: 0, y: 0) 
    restartBut.zPosition = 50 
    restartBut.size = CGSize(width: 400, height: 400) 

    menuBut.texture = SKTexture(imageNamed: "menuButton") 
    menuBut.name = "menuButton" 
    menuBut.position = CGPoint(x: 0, y: -300) 
    menuBut.zPosition = 50 
    menuBut.size = CGSize(width: 150, height: 150) 

    highScoreLabel.fontName = "AppleSDGothicNeo-SemiBold" 
    highScoreLabel.position = CGPoint(x: 0, y: 450) 
    highScoreLabel.fontColor = UIColor.black 
    highScoreLabel.fontSize = 45 
    highScoreLabel.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.center 
    highScoreLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.center 
    highScoreLabel.zPosition = 50 
    } 

    func showRestartMenu(){ 

    restartBut.alpha = 0 
    menuBut.alpha = 0 
    highScoreLabel.alpha = 0 

    self.addChild(restartBut) 
    self.addChild(menuBut) 
    self.addChild(highScoreLabel) 

    restartBut.run(SKAction.fadeAlpha(to: 1, duration: 0.35)) 
    menuBut.run(SKAction.fadeAlpha(to: 1, duration: 0.35)) 
    highScoreLabel.run(SKAction.fadeAlpha(to: 1, duration: 0.35)) 





    } 

    func updateScore(score : Int){ 
    var highScore = UserDefaults().integer(forKey: "highScore") 
    let number = NSNumber(value: score) 
    let formatter = NumberFormatter() 

    if let scoreText = formatter.string(from: number){ 
     scoreLabel.text = scoreText 
    } 




    if Int(score) > highScore { 
     highScore = Int(score) 
     highScoreLabel.text = NSString.init(format: "Highscore : %i", highScore) as String 

     let highScoreDefs = UserDefaults.standard 
     highScoreDefs.set(highScore, forKey: "highScore") 
     highScoreDefs.synchronize() 

    } 

    highScoreLabel.text = "Highscore : \(highScore)" 

} 

回答

1

转到您的GameViewController和移动从ViewWillLayoutSubviews所有代码为ViewDidLoad。只有在加载GameViewController时才调用ViewDidLoad。另一方面,ViewWillLayoutSubviews可以多次调用,就像您的广告展示时一样,这会比再次加载您的MenuScene。

作为一个提示,你应该把你的通知键放入一个扩展名中,以避免错别字,并将其作为一个良好实践的更具体的名称。

所以添加此上述任何一类或一个新雨燕文件

extension Notification.Name { 
    static let showAd = Notification.Name("ShowAdNotification") 
} 

比你可以改变你的观察到这一

NotificationCenter.default.addObserver(self, selector: #selector(showAds), name: .showAd, object: nil) 

NotificationCenter.default.post(name: .showAd, object: nil) 

您还可以看看我的助手在GitHub上,如果你想有一个更清洁更可重用的解决方案。

https://github.com/crashoverride777/SwiftyAds

我也注意到,你在你的GameViewController规模模式下使用.resizeFill。你不应该这样做,你的游戏在每个设备上看起来都不一样,这将是一个噩梦来管理。您应该使用默认的scaleMode .aspectFill,这通常是最好的设置。

根据视图的边界(view.bounds.size),您还应该给场景一个固定的大小并且不要调整它的大小。

How to make SKScene have fixed width?

How do I size sprites in a universal sprite kit game

希望这有助于

+0

我已经更新了代码。当玩家(游戏角色)死亡,并且广告出现并关闭广告时,当前场景消失,而是显示菜单场景(这是我的应用启动后的第一个场景.... * sry,而不是欢迎使用*)的方式。我期待它向我展示在游戏结束时将其添加到HUD并添加到HUD的restartButton。 –

+0

我还没有看到代码表明任何场景转换正在发生。请显示转到GameOverScene的转换代码 – crashoverride777

+0

我也注意到您在GameViewController缩放模式下使用了.ResizeFill。你不应该这样做,你的游戏在每个设备上看起来都不一样,这将是一个噩梦来管理。您应该使用默认的scaleMode .aspectFill,这通常是最好的设置。 – crashoverride777

相关问题