我有一个精灵套件游戏,我想在游戏结束时显示插页式广告。那么,我可以在游戏结束后使用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)"
}
我已经更新了代码。当玩家(游戏角色)死亡,并且广告出现并关闭广告时,当前场景消失,而是显示菜单场景(这是我的应用启动后的第一个场景.... * sry,而不是欢迎使用*)的方式。我期待它向我展示在游戏结束时将其添加到HUD并添加到HUD的restartButton。 –
我还没有看到代码表明任何场景转换正在发生。请显示转到GameOverScene的转换代码 – crashoverride777
我也注意到您在GameViewController缩放模式下使用了.ResizeFill。你不应该这样做,你的游戏在每个设备上看起来都不一样,这将是一个噩梦来管理。您应该使用默认的scaleMode .aspectFill,这通常是最好的设置。 – crashoverride777