如何在xcode中多次运行函数?

时间:2018-03-17 19:26:29

标签: swift xcode admob interstitial

我想在玩家死后展示我的插页式广告。这意味着插页式广告将在我的游戏中加载到场景中。但我不能只在viewdidload部分写入函数名称。那么当玩家进入gameOverScene时,我有办法运行我的interstitialAd函数吗?

如果有更新函数,我只会像这样设置一个布尔值:

var interstitialAdShow = false

然后在我的didmovetoview中写下这个:

interstitalAdShow = true

然后在我的更新功能中:

If interstitailAdShow == true{
     interstitial.present(fromRootViewController: self)
}

但是现在当GameViewController中没有更新功能,并且我无法在我的gameOverScene.swift内部执行此操作时我无法使用此解决方案,是否还有另一种方法可以触发我的插页式广告功能gameOverScene出现了。

BTW这是我的代码

import UIKit
import SpriteKit
import StoreKit
import GameplayKit
import GoogleMobileAds


var reklameNummer = 0


class GameViewController: UIViewController, GADBannerViewDelegate, GADRewardBasedVideoAdDelegate {


    var rewardBaseAd: GADRewardBasedVideoAd!


    var interstitial: GADInterstitial!

    @IBOutlet weak var bannerView: GADBannerView!

    override func viewDidLoad() {





        super.viewDidLoad()

        let request2 = GADRequest()
        request2.testDevices = [kGADSimulatorID]
        bannerView.delegate = self
        bannerView.adUnitID = "ca-app-pub-1110799225910030/5762940412"
        bannerView.rootViewController = self
        //bannerView.load(request2)


        interstitial = GADInterstitial(adUnitID: "ca-app-pub-1110799225910030/7460037600")
        let request = GADRequest()
        interstitial.load(request)









        if let view = self.view as! SKView? {
            // Load the SKScene from 'GameScene.sks'
            if let scene = SKScene(fileNamed: "MenuScene") {
                runTheInterStitialAd()
                // Set the scale mode to scale to fit the window
                scene.scaleMode = .aspectFill

                // Present the scene
                view.presentScene(scene)



                rewardBaseAd = GADRewardBasedVideoAd.sharedInstance()
                rewardBaseAd.delegate = self
                //rewardBaseAd.load(GADRequest(), withAdUnitID: "ca-app-pub-1110799225910030/4904503594")

            }



            view.ignoresSiblingOrder = true

            view.showsFPS = false
            view.showsNodeCount = false
        }
    }

    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
    }



//MARK:     Video ad
    func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd,
                            didRewardUserWith reward: GADAdReward) {

    }
    func rewardBasedVideoAdDidReceive(_ rewardBasedVideoAd:GADRewardBasedVideoAd) {
        //print.text?.append("Reward based video ad is received.\n")
    }
    func rewardBasedVideoAdDidOpen(_ rewardBasedVideoAd: GADRewardBasedVideoAd) {
        //print.text?.append("Opened reward based video ad.\n")
    }
    func rewardBasedVideoAdDidStartPlaying(_ rewardBasedVideoAd: GADRewardBasedVideoAd) {
        //print.text?.append("Reward based video ad started playing.\n")
    }
    func rewardBasedVideoAdDidClose(_ rewardBasedVideoAd: GADRewardBasedVideoAd) {
    }
    func rewardBasedVideoAdWillLeaveApplication(_ rewardBasedVideoAd: GADRewardBasedVideoAd) {
        //print.text?.append("Reward based video ad will leave application.\n")
    }
    func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd,
                            didFailToLoadWithError error: Error) {
        //print.text?.append("Reward based video ad failed to load.\n")
    }





//MARK:     Interstitial ad
    func runTheInterStitialAd(){
        var runFunc = SKAction.run(showInterstitialAdInScene)
        var wait = SKAction.wait(forDuration: 1)
        var sequence = SKAction.sequence([wait, runFunc])
    }
    func showInterstitialAdInScene() {
        print("this code is working")
        if var scene = SKScene(fileNamed: "Gameoverscene") {

            //  TRUE
            if (interstitial.isReady) == true{
                interstitial.present(fromRootViewController: self)
                gameNumber = 0
            }




            //  FALSE
            if (interstitial.isReady) == false{
                interstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/1033173712")
                let request = GADRequest()
                interstitial.load(request)
            }
        }
    }






    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        if rewardBaseAd.isReady{
            if reklameNummer == 1{
                reklameNummer += 1
                //rewardBaseAd.present(fromRootViewController: self)
                //rewardBaseAd.load(GADRequest(), withAdUnitID: "ca-app-pub-1110799225910030/4904503594")
            }
        }
        if rewardBaseAd.isReady{
            if reklameNummer == 2{
                reklameNummer = 0
                //rewardBaseAd.present(fromRootViewController: self)
                //rewardBaseAd.load(GADRequest(), withAdUnitID: "ca-app-pub-1110799225910030/4904503594")
            }
        }



        if gameNumber == 2{
            //showInterstitialAdInScene()
        }

    }
}

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是使用回调,这是一种将创建新类(场景)的类作为参数发送到新类(场景)的方法。这样,新类(场景)可以从旧类调用函数。下面是如何在您的代码中实现这一点。首先,我创建一个自定义初始化器,它将创建类作为参数,并将其分配给局部变量(myCreator)。然后在玩家死亡时调用的函数(deathFunction())中,我从创建类调用runIntersitialAd()函数。我还将GameViewController中设置MenuScene的代码更改为GameViewController初始化中作为参数的自身发送(MenuScene类)。

将您的场景类更改为以下内容:

class MenuScene {
    var myCreator : GameViewController!

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    convenience init(fileNamed: String, VCwhoCreatedMe: GameViewController) {

       self.init(fileNamed: fileNamed, VCwhoCreatedMe: VCwhoCreatedMe)
       myCreator = VCwhoCreatedMe
    } 

    ....your other code

    deathFunction() { //whatever code you use when the player dies
       myCreator.runTheInterStitialAd() //because of the callback construction this is now possible.
       ...other code
    }
}

在GameViewController中,函数viewDidLoad():

if let view = self.view as! SKView? {

   if let scene = MenuScene(fileNamed: "MenuScene",VCwhoCreatedMe: self ) {
       runTheInterStitialAd()

       scene.scaleMode = .aspectFill


       view.presentScene(scene)    
       ..... other code    
   }
}
相关问题