2015-11-12 4 views
7

हैलो मैं स्विफ्ट में SpriteKit गेम पर काम कर रहा हूं कि अभी केवल दो दृश्य, लोडिंग दृश्य और गेम दृश्य हैं। गेम दृश्य प्रस्तुत होने से पहले जानकारी प्राप्त करने के लिए डेटाबेस तक पहुंच जाता है। खेल दृश्य में सबकुछ बढ़िया काम करता है। जब मैं सीधे लोडिंग दृश्य में जाता हूं तो मैं सीधे गेम दृश्य के बजाय मुद्दों में भाग ले रहा हूं। कॉल बैक के माध्यम से मैं डेटाबेस दृश्य करने के बाद गेम दृश्य पेश करने के लिए लोडिंग दृश्य को बताता हूं।स्प्राइटकिट को नए दृश्य में संक्रमण करते समय UIElements के बारे में त्रुटि मिल रही है

2015-11-12 09: 48: लेकिन जब मैं पेश करने की कोशिश मैं इन बड़े पैमाने पर त्रुटियों की 10+ मिल 33.880 SpaceAcademy [2373: 764,586] इस आवेदन एक पृष्ठभूमि धागा, से 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) 

लोड हो रहा है दृश्य: 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 का कोई संदर्भ नहीं दिखाई देता है। ऑटोलाउट एक यूआईकिट सुविधा है, जो आप दिखा रहे हैं वह स्प्राइटकिट है। –

+0

UIButton, UILabel, ect – AwesomeTN

उत्तर

6

आप इस कार्य कर रहे हैं:

myURLRequests.getFleet(self, UserId: self.mySettings.UserId, enemy: false){() ->() in 
    myLoadingScene.end() 
} 
एक बार यूआरएल अनुरोध पूरा होने के बाद

जो संभावित रूप से myLoadingScene.end() को पृष्ठभूमि थ्रेड पर कॉल करता है। endloadCount सेट करता है, जिसमें एक नया सेट शुरू होता है, self.view?.presentScene(newScene)

यह अंतिम टुकड़ा है जो मुख्य धागे पर चलने की आवश्यकता है।

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

तो फिर तुम

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

के दृश्य प्रस्तुति कोड बदल सकता है चाल करना चाहिए:

मान लीजिए कि आप मुख्य थ्रेड पर कुछ को चलाने के लिए एक आसान समारोह था करते हैं।

+0

कमाल जोड़ा गया! सही काम करता है! केवल 'newScene' को 'self.newScene' में बदलना पड़ा – AwesomeTN

+0

बढ़िया! खुशी हुई यह काम किया! मुझे उम्मीद है कि अब आप UIKit/autolayout और SceneKit के बीच अंतरों की बेहतर समझ लेंगे। –

संबंधित मुद्दे

 संबंधित मुद्दे