2015-11-12 3 views
7

Привет, я работаю над игрой SpriteKit в Swift, которая сейчас имеет только две сцены, сцену загрузки и сцену игры. Игровая сцена обращается к базе данных, чтобы получить информацию до ее представления. Все в игровой сцене отлично работает. Я сталкиваюсь с проблемами, когда сначала перехожу на сцену загрузки, а не прямо к игровой сцене. Через обратные вызовы я рассказываю сценарию загрузки, чтобы представить сцену игры, как только это будет сделано с использованием базы данных. Однако, когда я пытаюсь представлением я получаю 10+ этих массовых ошибок:SpriteKit получает ошибку относительно UIElements при переходе на новую сцену

2015-11-12 09: 48: 33,880 SpaceAcademy [2373: 764586] Это приложение модификации autolayout двигателя от фонового потока, который может привести к повреждению двигателя и странным авариям. Это приведет к исключению в будущей версии. (С последующей связкой случайной информации)

Теперь через некоторые испытания я понял, что это моя UIElement, такие как кнопки, слайдеры и этикетки, которые вызывают это. Но я переместил их в функцию didMoveToView, поэтому я смущен, почему они все еще бросают ошибки, потому что они находятся в «фоновом потоке».

Также что-то странное в том, что это не фатальные ошибки. Моя консоль просто взрывается, а UIElements появляется после десяти секундной задержки. Что-то еще странное в том, что если я нахожусь там, где знаю, что кнопка должна быть функцией, она все еще называется так, как будто кнопка на самом деле там.

Я был бы очень признателен за решение, чтобы избавиться от взрыва в консоли, но, что более важно, избавиться от десяти секундной задержки UI Elements, показывая, спасибо!

Код Настройка сцены

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) 

Загрузка Сцена:

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 
} 

} 

код из GameScene:

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 удалено половину ошибок, но theres все еще около 8 или около того – AwesomeTN

+0

Что такое UIElement? Я не вижу ссылки на UIElement в опубликованном вами коде. AutoLayout - это функция UIKit, то, что вы показываете, - это SpriteKit. –

+0

UIButton, UILabel, ect – AwesomeTN

ответ

6

Вы делаете это:

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

Что, по-видимому, вызывает myLoadingScene.end() в фоновом потоке после завершения запроса URL-адреса. 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. –

Смежные вопросы