2016-02-21 10 views
7

मेरे पास मेरे कोड पर गेम को रोकने के लिए एक बटन है। मैं जो चाहता हूं वह है कि उस बटन के साथ गेम को रोकना एक संदेश बनाता है जो "रुका हुआ" दिखाई देता है। हालांकि, चूंकि दृश्य रुक गया है, संदेश प्रकट नहीं होता है।स्प्राइटकिट: दृश्य चलाएं जबकि दृश्य रोका गया है

मेरे पास अभी क्या है, शुरुआत में 0.0 पर अल्फा के साथ एक SKLabelNode है और जब उपयोगकर्ता गेम को रोकता है, तो यह 1.0 में fadeInWithDuration() के साथ बदल जाता है। फिर जब उपयोगकर्ता फिर से बटन दबाता है, तो यह fadeOutWithDuration() के साथ 0.0 पर वापस बदल जाता है। समस्या यह है कि जब दृश्य रोक दिया जाता है तो fadeInWithDuration() के साथ SKAction नहीं चलता है।

मैं इसे कैसे प्राप्त कर सकता हूं?

उत्तर

7

सबसे अच्छा तरीका, एक ऐप्पल "डेमोबॉट्स" में भी उपयोग करता है, यह एक विश्व नोड बनाने के लिए है जिसे आप दृश्य के बजाय रोकते हैं।

एक worldNode प्रॉपर्टी बनाएं

class GameScene: SKScene { 

    let worldNode = SKNode() 
} 

didMoveToView

addChild(worldNode) 

में दृश्य में जोड़ कर की तुलना में सब कुछ आप worldNode रोक की जरूरत जोड़ें। यह कार्रवाई है कि सामान्य रूप से दृश्य द्वारा चलाए जा रहे हैं शामिल अपने ठहराव में (जैसे। टाइमर, दुश्मन आदि को उत्पन्न करने)

worldNode.addChild(someNode) 
worldNode.run(someSKAction) 

से समारोह आप कहते हैं

worldNode.isPaused = true 
physicsWorld.speed = 0 

और फिर से शुरू में

worldNode.isPaused = false 
physicsWorld.speed = 1 

यदि आपके पास ऐसी चीजें हैं जो आप रुकने पर अनदेखा करना चाहते हैं तो आप अपने अपडेट फ़ंक्शन में अतिरिक्त चेक भी जोड़ सकते हैं।

override func update(_ currentTime: CFTimeInterval) { 

    guard !worldNode.isPaused else { return } 

    // your code 
} 

इस तरह यह आपका गेम क्योंकि आप वास्तव में दृश्य नहीं रोक दिया है रुका हुआ है अपने रुके हुए लेबल या अन्य यूआई जोड़ने के लिए बहुत आसान है।आप जो भी एक्शन चाहते हैं उसे भी चला सकते हैं, जब तक कि उस कार्रवाई को दुनिया में नोड या दुनिया के बच्चे को जोड़ा न जाए।

आशा इस

+0

आपने मुझे बचाया, आदमी! मैं इस समाधान की सराहना करता हूं क्योंकि मैंने एक और विराम मुद्दा हल किया था! ऐसा लगता है कि ऐसा इसलिए था क्योंकि मैं रूट से रोक रहा था ... यह भौतिकी को रोक नहीं रहा था .. अब एसकेएनओडी समाधान के साथ सबकुछ सही काम करता है! – msqar

1

तो आप के बाद खेल निष्पादन को पूरा करना चाहते हैं।

class GameScene: SKScene { 

    let pauseLabel = SKLabelNode(text: "Paused") 

    override func didMoveToView(view: SKView) { 
     pauseLabel.alpha = 0 
     pauseLabel.position = CGPoint(x: CGRectGetMaxY(self.frame), y: CGRectGetMidY(self.frame)) 
     self.addChild(pauseLabel) 
    } 


    func pause(on: Bool) { 
     switch on { 
     case true: pauseLabel.runAction(SKAction.fadeInWithDuration(1)) { 
      self.paused = true 
     } 
     case false: 
      self.paused = false 
      pauseLabel.runAction(SKAction.fadeOutWithDuration(1)) 
     } 
    } 
} 
2

एक त्वरित समाधान का बाद SKLabelNode स्क्रीन पर दिखाई देता अपने खेल को रोकने के लिए होगा:

let action = SKAction.fadeOutWithDuration(duration) 
runAction(action) { 
    // Pause your game 
} 

एक अन्य विकल्प UIKit और SpriteKit मिश्रण और ViewController वापस सूचित है कि यह इस लेबल को दिखाने की जरूरत होगी । दृश्य रोक की

class ViewController: UIViewController { 
    var gameScene: GameScene! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     gameScene = GameScene(...) 
     gameScene.sceneDelegate = self 
    } 
} 

extension ViewController: GameSceneDelegate { 
    func gameWasPaused() { 
     // Show your Label on top of your GameScene 
    } 
} 

protocol GameSceneDelegate: class { 
    func gameWasPaused() 
} 

class GameScene: SKScene { 
    weak var sceneDelegate: GameSceneDelegate? 

    func pauseGame() { 
     // Pause 
     // ... 
     sceneDelegate?.gameWasPaused() 
    } 
} 
2

इसके बजाय, आप कुछ नोड्स इस

SKScene 
|--SKNode 1 
| |-- ... <--place all scene contents here 
|--SKNode 2 
| |-- ... <--place all overlay contents here 

की तरह अपने दृश्य परत सकता है फिर जब आप खेल को रोकना चाहते हैं, तो आप को थामने केवल SKNode 1.

यह अनुमति देता है नोड SKNode 2 को जारी रखने के लिए, ताकि आप एनीमेशन चलने जैसी चीजें कर सकें, और एक बटन है जो आपके लिए दृश्य को रोक देता है, मिश्रण में कुछ गैर स्प्राइट किट ऑब्जेक्ट जोड़ने की आवश्यकता के बिना।

0

में मदद करता है मैं

self.addChild(nameOfLabel) 

साथ लेबल जोड़ना होगा और फिर साथ

self.scene?.paused = true 

यह सभी की अगर pauseButton छुआ है भाग में जाना चाहिए खेल रोक कर अपने कोड।

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