SKScene和UIViewController之间的争论

时间:2017-02-03 22:22:02

标签: ios swift sprite-kit swift3 segue

我用swift 3编写简单的数学游戏,我遇到了segues的问题。我有两个GameViewController's,一个UIViewController和一个NavigationViewControllerenter image description here

我想制作两个菜单,一个是游戏模式,另一个是困难,我希望困难菜单是互动的并且有重力,所以我决定在SkScene中制作它。一切正常,除了SkScene与黑屏之间的segue和用户输掉游戏时的困难菜单。我写了一个协议,当我从主菜单进入第二个菜单时可以正常工作,但是当我从游戏中使用SkScene时,它并没有。我试图制作一个手动segue,但协议并不想执行。 enter image description here

MyGVViewController代码:

    import UIKit
    import SpriteKit
    import GameplayKit

    enum skad1 {
     case game,menu
     }
    var skad = skad1.gra

    class MyGVViewController: UIViewController, GameViewControllerDelegate {

override func viewDidLoad() {
    super.viewDidLoad()

    if let view = self.view as! SKView? {
        // Load the SKScene from 'GameScene.sks'
        if let scene = SKScene(fileNamed: "Menugame") {
            let gameScene = scene as! MySKScene
            gameScene.gameViewControllerDelegate = self
            gameScene.scaleMode = .aspectFill


            gameScene.size = view.bounds.size

            // Present the scene
            view.presentScene(gameScene)
        }

        view.ignoresSiblingOrder = true

        view.showsFPS = true
        view.showsNodeCount = true
    }
}

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
}

func goback() {
    print("goback executed")
    let view = self.view as! SKView?
    view?.presentScene(nil)
    navigationController?.popViewController(animated: true)

}
func goback2() {
    print("goback2 executed")
    let view = self.view as! SKView?
    view?.presentScene(nil)
    self.performSegue(withIdentifier: "comeback", sender: nil)
}

}

我的SkScene有困难的菜单代码:

 import GameKit
 import SpriteKit
 import CoreMotion

 protocol GameViewControllerDelegate: class {
    func goback()
    func goback2()
 }



class MySKScene: SKScene {

//Variables

var motionManager: CMMotionManager!
var ball = SKSpriteNode()
var ball1 = SKSpriteNode()
var ball2 = SKSpriteNode()
var ball3 = SKSpriteNode()
var ball4 = SKSpriteNode()
weak var gameViewControllerDelegate: GameViewControllerDelegate?

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

    for touch in touches {
        let location = touch.location(in: self)
        if ball.contains(location){
            showgame(zakres: 200)
        }else if ball1.contains(location){
            showgame(zakres: 100)
        }else if ball2.contains(location) {
            showgame(zakres: 50)
        }else if ball3.contains(location) {
            showgame(zakres: 150)
        }else if ball4.contains(location) {
            if skad == .menu{
                print("should execut goback")
                self.gameViewControllerDelegate?.goback()
            }else{
                print("should execut goback2")
                self.gameViewControllerDelegate?.goback2()
            }
        }
    }
}

func showgame(zakres:Int) {

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

            // Present the scene
            gameScene.size = view.bounds.size
            view.presentScene(gameScene)
        }

        view.ignoresSiblingOrder = true

        view.showsFPS = true
        view.showsNodeCount = true
    }
}



override func didMove(to view: SKView) {

    ball = self.childNode(withName: "ball") as! SKSpriteNode
    ball1 = self.childNode(withName: "ball1") as! SKSpriteNode
    ball2 = self.childNode(withName: "ball2") as! SKSpriteNode
    ball3 = self.childNode(withName: "ball3") as! SKSpriteNode
    ball4 = self.childNode(withName: "ball4") as! SKSpriteNode
    motionManager = CMMotionManager()
    motionManager.startAccelerometerUpdates()
    let border = SKPhysicsBody(edgeLoopFrom: self.frame)
    border.friction = 0
    border.restitution = 0
    self.physicsBody = border
}


override func update(_ currentTime: TimeInterval) {
    if let accelerometerData = motionManager.accelerometerData {
        physicsWorld.gravity = CGVector(dx: accelerometerData.acceleration.x * 20, dy: accelerometerData.acceleration.y * 35)
    }
}

}

PS。
我正在阅读我写的内容,我必须更正它,在困难菜单中,我有一个按钮,执行隐藏SKScene并显示主菜单的协议。它仅适用于我从主菜单进入,但当segue来自游戏时用户丢失,协议未执行

0 个答案:

没有答案