2

好的,这是代码

class GameViewController:  UIViewController,  SceneTransitionDelegate, 
GKGameCenterControllerDelegate, ADBannerViewDelegate {

var coolbool:Bool = false

...abunch of unimportant stuff functions and stuff

 }

这就是我想要从我的 SKScene 中做的事情

func thing1()
{
        let controller = GameViewController()
        controller.coolbool = true
        println(controller.coolbool) // Will say that it is true
        sceneDelegate.transitionToScene(Menu.self) //Menu.self is the skscene that
       we used to be in and will be in
}

func thing2()
{
        println(controller.coolbool) // Will say that it is false
        if (controller.coolbool == true)
        {
           //Put rainbows over every sprite and change generator settings
        }
}

所以基本上发生的事情是“coolbool”被初始化为假。直到 thing1() 被调用导致变量“coolbool”改变。我在过渡之后立即确认其更改。然而,在转换之后(到同一个场景(如果布尔为真,我试图让它看起来不同))如果你问值是什么,它说它是假的......即使我只是将它设置为真.

无论如何,我认为我做错了什么,他们是更好的方法吗???万一你想要它是过渡功能

func transitionToScene(sceneClass:Scene.Type) {
    playing = false
    var sizeRect = UIScreen.mainScreen().applicationFrame
    var width = sizeRect.size.width * UIScreen.mainScreen().scale
    var height = sizeRect.size.height * UIScreen.mainScreen().scale
    let skView = self.view as! SKView
    let scene = sceneClass(size: skView.bounds.size)
    scene.size = CGSizeMake(width, height)
    rwidth = width
    rheight = height
    swidth = width
    sheight = height
    skView.ignoresSiblingOrder = true

    scene.scaleMode = .AspectFill
    scene.sceneDelegate = self

    skView.presentScene(scene)
}
4

1 回答 1

0

你需要获取 GameViewController 的当前实例,所以这个语句:

let controller = GameViewController()

不起作用,因为它声明了一个新的控制器实例,它与SKView您当前使用的无关。相反,我们需要获取当前的呈现视图控制器。

获取视图控制器的实例:

在这里可以帮助我们的最接近的方法是在UIResponder类中,它是nextResponder:. 它的一般功能是查找并返回当前的下一个响应者,这似乎很模糊,对我们来说没有多大用处,直到 Apple 提到:

子类必须重写此方法以设置下一个响应者。UIView 通过返回管理它的 UIViewController 对象(如果有)或其父视图(如果没有)来实现此方法

这意味着如果我们在一个场景中,我们可以通过使用场景的self.view呈现SKView对象(继承自UIView)来找到视图控制器。我们所要做的就是在我们的响应者链中找到视图控制器。

迅速:

var currentViewController: GameViewController?
var upstreamResponder: UIResponder? = self.view
var found = false

while (found != true){
    upstreamResponder = upstreamResponder!.nextResponder()
    if let viewController = upstreamResponder as? GameViewController {
        currentViewController = viewController
        found = true
    }
    if upstreamResponder == nil {
        //could not find VC, PANIC!
        break
    }
}

Objective-C:(可能必须#include“GameViewController.h”)

GameViewController *currentViewController;
UIResponder *upstreamResponder = self.view;
BOOL found = false;

while (found != true) {
    upstreamResponder = [upstreamResponder nextResponder];
    if ([upstreamResponder isKindOfClass:[GameViewController class]]) {
        currentViewController = (GameViewController *)upstreamResponder;
    }
    if (upstreamResponder == nil) {
        //omg where did VC go?!
        break;
    }
}

在视图控制器上设置属性

现在您有了当前的视图控制器,设置任何所需的属性非常简单。所以如果你想改变coolbool,你所要做的就是声明:

currentViewController.coolbool = true

希望这可以帮助!
-最大限度

于 2015-08-29T13:01:20.520 回答