2015-11-12 4 views
7

こんにちは、SwiftのSpriteKitゲームで作業中です。現在、ロードシーンとゲームシーンの2つのシーンしかありません。ゲームシーンは、提示される前に情報を得るためにデータベースに達する。ゲームシーンのすべてが素晴らしい作品です。私はゲームシーンにまっすぐではなく、最初にロードシーンに行くときに問題にぶつかっています。コールバックを介して、データベースシーンの処理が完了したら、シーンを提示するようにロードシーンに指示します。新しいシーンに移行するときにUIElementsに関するエラーが発生する

2015年11月12日09:48:33.880 SpaceAcademy [2373:764586]このアプリケーションは バックグラウンドスレッドから自動レイアウトエンジンを変更している、私が提示しようとすると、しかし、私は、これらの大規模なエラーの10+を取得します はエンジンの破損や奇妙なクラッシュにつながります。これにより、将来のリリースで 例外が発生します。 (ランダムな情報が続いています)

これで、ボタン、スライダ、ラベルなど、私のUIElementが原因であることがわかりました。しかし、私はそれらをdidMoveToView関数に移動しました。なぜなら、「バックグラウンドスレッド」にあるために、なぜ彼らはまだエラーを投げているのか混乱しています。

また、これらは致命的なエラーではありません。私のコンソールは爆発し、UIElementsは10秒遅れて表示されます。何か他の奇妙なことは、私がボタンが実際にボタンが実際にそこにあったかのように呼び出されているとわかっている場所をタップすると、それがまだ呼び出されているということです。

私はコンソールの爆発を取り除くための解決に感謝しますが、もっと重要なのは、UI Elementsの10秒遅れを取り除く、ありがとう!! GameSceneから

import Foundation 
import SpriteKit 

class LoadingScene:SKScene{ 
    var newScene:SKScene! 
    var oldCount = 0 
    var loadCount = 0{ 
    didSet{ 
     print(loadCount) 
     if loadCount == 0{ 
      if oldCount == 1{ 
       self.view?.presentScene(newScene) 
      } 
     } 
     oldCount = loadCount 
    } 
} 

init(size: CGSize, newScene:SKScene) { 
    self.newScene = newScene 
    super.init(size: size) 

} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

override func didMoveToView(view: SKView) { 
    self.backgroundColor = UIColor.blackColor() 
    let imageArray = [ 
     SKTexture(imageNamed: "Loader/Loader1.png"), 
     SKTexture(imageNamed: "Loader/Loader2.png"), 
     SKTexture(imageNamed: "Loader/Loader3.png") 
    ] 

    let loader = SKSpriteNode(texture: imageArray[0]) 
    let animation = SKAction.animateWithTextures(imageArray, timePerFrame: 0.33) 
    loader.runAction(SKAction.scaleBy(0.25, duration: 0)) 
    loader.zPosition = 100 
    loader.runAction(SKAction.repeatActionForever(animation)) 
    loader.position = CGPointMake(self.size.width/2, self.size.height/2) 
    self.addChild(loader) 
} 

func start(){ 
    self.loadCount = self.loadCount + 1 
} 

func end(){ 
    self.loadCount = self.loadCount - 1 
} 

} 

コード:

func setEverythingUp(myLoadingScene: LoadingScene){ 

    let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults() 

    var Id = 0 
    if let tempID = defaults.objectForKey("UserId") as? Int { 
     Id = tempID 
    }else{ 
     print("newUser") 
     defaults.setObject(0, forKey: "UserId") 
     defaults.synchronize() 
    } 

    self.mySettings = Settings(UserId: Id) 
    self.myURLRequests = URLRequests(thesettings: self.mySettings) 

    ///////////call back system here, start() increments number of tasks waiting to finish, end() means a task is finished 

    myLoadingScene.start() 
    myURLRequests.getFleet(self, UserId: self.mySettings.UserId, enemy: false){() ->() in 
     myLoadingScene.end() 
    } 

    myLoadingScene.start() 
    myURLRequests.getFleet(self, UserId: self.mySettings.UserId, enemy: true){() ->() in 
     myLoadingScene.end() 
    } 



    self.backgroundColor = SKColor.blackColor() 
    self.physicsWorld.contactDelegate = self 
    self.physicsWorld.gravity = CGVector(dx: 0, dy: 0) 
    addStars() 


    self.anchorPoint = CGPoint(x:self.size.width/2, y:self.size.height/2) 
    self.myCamera.position = CGPointMake(200, 0) 
    self.addChild(self.myCamera) 
    self.camera = self.myCamera 
    self.myAnchor.position = self.myCamera.position 
} 



override func didMoveToView(view: SKView) { 
    print("in view") 

    let pinch = UIPinchGestureRecognizer(target: self, action: Selector("PinchScale:")) 
    let tap = UITapGestureRecognizer(target: self, action: Selector("Tap:")) 
    let pan = UIPanGestureRecognizer(target: self, action: Selector("DragMove:")) 

    self.view?.addGestureRecognizer(pinch) 
    self.view?.addGestureRecognizer(tap) 
    self.view?.addGestureRecognizer(pan) 


    let fireButton = UIButton(type: .System) 
    fireButton.setTitle("Fire!", forState: UIControlState.Normal) 
    fireButton.titleLabel!.font = UIFont(name: "TrebuchetMS", size: 70) 
    fireButton.sizeToFit() 
    fireButton.frame = CGRect(x: self.size.width*0.5 - 80, y: 20, width: self.size.width*0.3, height: 30) 
    fireButton.addTarget(self, action: Selector("FireButtonClicked"), forControlEvents: UIControlEvents.TouchUpInside) 
    self.view?.addSubview(fireButton) 

    let alternateControls = false 

    let AngleLabel = UILabel() 
    AngleLabel.text = "Angle" 
    AngleLabel.font = UIFont(name: "TrebuchetMS", size: 30) 
    AngleLabel.textColor = UIColor.blueColor() 


    let AngleSlider = UISlider() 
    AngleSlider.addTarget(self, action: Selector("AngleSlided:"), forControlEvents: UIControlEvents.ValueChanged) 
    AngleSlider.maximumValue = 90 
    AngleSlider.minimumValue = -90 
    AngleSlider.value = 0 
    AngleSlider.continuous = true 



    let PowerLabel = UILabel() 
    PowerLabel.text = "Power" 
    PowerLabel.font = UIFont(name: "TrebuchetMS", size: 30) 
    PowerLabel.textColor = UIColor.blueColor() 


    let PowerSlider = UISlider() 
    PowerSlider.addTarget(self, action: Selector("PowerSlided:"), forControlEvents: UIControlEvents.ValueChanged) 
    PowerSlider.maximumValue = 0.99 
    PowerSlider.minimumValue = 0.1 
    PowerSlider.value = 0.5 
    PowerSlider.continuous = true 


    if alternateControls{ 
     AngleLabel.frame = CGRect(x: self.size.width*0.05, y: 10, width: self.size.width*0.3, height: 60) 
     AngleSlider.frame = CGRect(x: self.size.width * -0.05, y: self.size.height*0.55, width: self.size.height*0.7, height: 30) 
     AngleSlider.transform = CGAffineTransformMakeRotation(CGFloat(M_PI) * 1.5) 
     PowerLabel.frame = CGRect(x: self.size.width*0.7, y: 10, width: self.size.width*0.3, height: 60) 
     PowerSlider.frame = CGRect(x: self.size.width * 0.65, y: self.size.height*0.55, width: self.size.height*0.7, height: 30) 
     PowerSlider.transform = CGAffineTransformMakeRotation(CGFloat(M_PI) * 1.5) 
    }else{ 
     AngleLabel.frame = CGRect(x: self.size.width*0.21, y: self.size.height-80, width: self.size.width*0.3, height: 60) 
     AngleSlider.frame = CGRect(x: self.size.width * 0.025, y: self.size.height-30, width: self.size.width*0.45, height: 30) 
     PowerLabel.frame = CGRect(x: self.size.width*0.71, y: self.size.height-80, width: self.size.width*0.3, height: 60) 
     PowerSlider.frame = CGRect(x: self.size.width * 0.525, y: self.size.height-30, width: self.size.width*0.45, height: 30) 
    } 

    self.view?.addSubview(AngleLabel) 
    self.view?.addSubview(AngleSlider) 
    self.view?.addSubview(PowerLabel) 
    self.view?.addSubview(PowerSlider) 

} 
+0

UIElementsを削除するとエラーの半分が削除されますが、まだ約8程度です – AwesomeTN

+0

UIElementとは何ですか?あなたが投稿したコードにUIElementへの参照がありません。 AutoLayoutはUIKitの機能です。あなたが見せているのはSpriteKitです。 –

+0

UIButton、UILabel、等 – AwesomeTN

答えて

6

あなたはこれをやっている:ロードシーン

コードの設定シーン

let skView = view as! SKView 
    skView.showsFPS = false 
    skView.showsNodeCount = false 
    skView.ignoresSiblingOrder = true 

    let scene = GameScene(size: view.bounds.size) 
    scene.scaleMode = SKSceneScaleMode.ResizeFill 


    let loading = LoadingScene(size: view.bounds.size, newScene: scene) 
    skView.presentScene(loading, transition: SKTransition.crossFadeWithDuration(1)) 

    scene.setEverythingUp(loading) 

myURLRequests.getFleet(self, UserId: self.mySettings.UserId, enemy: false){() ->() in 
    myLoadingScene.end() 
} 

URL要求が完了すると、おそらくバックグラウンドスレッドでmyLoadingScene.end()と呼ばれます。 endは、新しいビューを開始するセッターを持つloadCountを設定します。self.view?.presentScene(newScene)

メインスレッドで実行する必要があるこの最後の部分です。

は、あなたがメインスレッド上で何かを実行するための便利な機能を持っていたとしましょう:

func on_main_async (closure:()->()) { 
    dispatch_async(dispatch_get_main_queue()) { 
     closure() 
    } 
} 

トリックを行う必要があり、あなたが

on_main_async() { self.view?.presentScene(newScene) } 

にシーンのプレゼンテーションコードを変更することができます。

+0

awesome!完璧に動作します! 'newScene'を 'self.newScene'に変更するだけでした – AwesomeTN

+0

素晴らしい!それはうまくいった! UIKit/autolayoutとSceneKitの違いをよりよく理解していただければ幸いです。 –

関連する問題