如何在swift中点击颜色精灵后返回上一个场景?

时间:2023-01-22 23:36:10

So for a school project, I have been tasked with making a 2D game. The game is fine but I'm struggling with how to make a back button (In the middle of the page) so was wondering if there was specific code to make this work. I am using spriteKit so I'm trying to go back to the previous scene after clicking on a colour sprite.

因此,对于一个学校项目,我的任务是制作2D游戏。游戏很好,但我正在努力制作一个后退按钮(在页面中间),所以想知道是否有特定的代码使这项工作。我正在使用spriteKit所以我在点击颜色精灵后试图回到上一个场景。

I apologise if this is a stupid question but I am slightly new to Swift.

如果这是一个愚蠢的问题我很抱歉,但我对Swift稍微有点新意。

Kind Regards, James

亲切的问候,詹姆斯

2 个解决方案

#1


0  

Too add a button the simplest way is to detect touches on your sprite(s) in the relevant SKScene.

添加按钮最简单的方法是检测相关SKScene中精灵的触摸。

enum NodeName: String {
   case coloredSprite1
   case coloredSprite2
}

class GameScene: SKScene {

     let coloredSprite = SKSpriteNode(imageNamed: "YourImageName")

     /// Scene setup
     override func didMove(to view: SKView) {
       // set up your colored sprite if necessary
       // Give your sprites unique names to identify them

       coloredSprite.name = NodeName.coloredSprite1.rawValue // always use enums for things like string identifiers so you avoid typos
     }

     /// Touches
     override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
         for touch in touches {
             let location = touch.location(in: self)
             let touchedNode = atPoint(location)

             // Way 1 by node (probably less preferable)
             switch touchedNode {
             case coloredSprite:
                 // do something (e.g call loadScene method)
                // see below
             default: 
                 break
             }

             // Way 2 by node name (probably more preferable)
             // name is an optional so we have to unwrap it when using it in the switch statement. 
             // The easiest way is by providing an alternative string, by using the nil coalescing operator (?? "NoNodeNameFound")

             switch touchedNode.name ?? "NoNodeNameFound" {
             case NodeName.coloredSprite1.rawValue:
                // do something (e.g call loadScene method)
                // see below
             default: 
                break
             }
        }
    }

    // Also call touchesEnded, touchesMoved and touchesCancelled and do necessary stuff
}

For a more reusable solution you ideally want to create a button subclass. There is quite a few tutorials to google on how to do this.

对于更可重用的解决方案,理想情况下,您需要创建一个按钮子类。谷歌有很多关于如何做到这一点的教程。

To than transition between SKScenes you can create a loadScene method in each scene and than call them when necessary.

要在SKScenes之间进行转换,您可以在每个场景中创建一个loadScene方法,并在必要时调用它们。

// Start Scene
class StartScene: SKScene {
   ...

   func loadGameScene() {

        // If you do everything in code
        let gameScene = GameScene(size: self.size)
        view?.presentScene(gameScene, transition: ...)

        // If you use SpriteKit scene editor
        guard let gameScene = SKScene(fileNamed: "GameScene") else { return } // fileNamed is the name you gave the .sks file
        view?.presentScene(gameScene, transition: ...)
   }
}

// Game scene
class GameScene: SKScene {
     ....

     func loadStartScene() {
        // If you do everything in code
        let startScene = StartScene(size: self.size)
        view?.presentScene(startScene, transition: ...)

        // If you use SpriteKit scene editor
        guard let startScene = SKScene(fileNamed: "StartScene") else { return } // fileNamed is the name you gave the .sks file
        view?.presentScene(startScene, transition: ...)
   }
}

Hope this helps

希望这可以帮助

#2


1  

Here is an example of how you can create a button using a colored sprite. It shows how you can set up a button to receive touch events and how you can use those touch events to navigate between scenes.

以下是如何使用彩色精灵创建按钮的示例。它显示了如何设置按钮以接收触摸事件以及如何使用这些触摸事件在场景之间导航。

In this example you can navigate forward to new scenes and backwards to previous scenes.

在此示例中,您可以向前导航到新场景并向后导航到之前的场景。

import SpriteKit

class Button: SKSpriteNode {

    var tapped: (() -> Void)?

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        tapped?()
    }

}

class GameScene: SKScene {

    var parentScene: SKScene?
    var sceneCount = 1

    override func didMove(to view: SKView) {
        if parentScene != nil {
            let backButton = addButton(color: .red, position: CGPoint(x: -200, y: 0))
            backButton.tapped = {
                if let previousScene = self.parentScene {
                    view.presentScene(previousScene)
                }
            }
        }

        let nextButton = addButton(color: .blue, position: CGPoint(x: 200, y: 0))
        nextButton.tapped = {
            if let nextScene = SKScene(fileNamed: "GameScene") as? GameScene {
                nextScene.scaleMode = self.scaleMode
                nextScene.parentScene = self
                nextScene.sceneCount = self.sceneCount + 1
                view.presentScene(nextScene)
            }
        }

        let label = SKLabelNode(text: "Scene \(sceneCount)")
        addChild(label)
    }

    func addButton(color: SKColor = .white, position: CGPoint = .zero) -> Button {
        let button = Button(color: color, size: CGSize(width: 200, height: 200))
        button.position = position
        button.isUserInteractionEnabled = true
        addChild(button)
        return button
    }

}

#1


0  

Too add a button the simplest way is to detect touches on your sprite(s) in the relevant SKScene.

添加按钮最简单的方法是检测相关SKScene中精灵的触摸。

enum NodeName: String {
   case coloredSprite1
   case coloredSprite2
}

class GameScene: SKScene {

     let coloredSprite = SKSpriteNode(imageNamed: "YourImageName")

     /// Scene setup
     override func didMove(to view: SKView) {
       // set up your colored sprite if necessary
       // Give your sprites unique names to identify them

       coloredSprite.name = NodeName.coloredSprite1.rawValue // always use enums for things like string identifiers so you avoid typos
     }

     /// Touches
     override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
         for touch in touches {
             let location = touch.location(in: self)
             let touchedNode = atPoint(location)

             // Way 1 by node (probably less preferable)
             switch touchedNode {
             case coloredSprite:
                 // do something (e.g call loadScene method)
                // see below
             default: 
                 break
             }

             // Way 2 by node name (probably more preferable)
             // name is an optional so we have to unwrap it when using it in the switch statement. 
             // The easiest way is by providing an alternative string, by using the nil coalescing operator (?? "NoNodeNameFound")

             switch touchedNode.name ?? "NoNodeNameFound" {
             case NodeName.coloredSprite1.rawValue:
                // do something (e.g call loadScene method)
                // see below
             default: 
                break
             }
        }
    }

    // Also call touchesEnded, touchesMoved and touchesCancelled and do necessary stuff
}

For a more reusable solution you ideally want to create a button subclass. There is quite a few tutorials to google on how to do this.

对于更可重用的解决方案,理想情况下,您需要创建一个按钮子类。谷歌有很多关于如何做到这一点的教程。

To than transition between SKScenes you can create a loadScene method in each scene and than call them when necessary.

要在SKScenes之间进行转换,您可以在每个场景中创建一个loadScene方法,并在必要时调用它们。

// Start Scene
class StartScene: SKScene {
   ...

   func loadGameScene() {

        // If you do everything in code
        let gameScene = GameScene(size: self.size)
        view?.presentScene(gameScene, transition: ...)

        // If you use SpriteKit scene editor
        guard let gameScene = SKScene(fileNamed: "GameScene") else { return } // fileNamed is the name you gave the .sks file
        view?.presentScene(gameScene, transition: ...)
   }
}

// Game scene
class GameScene: SKScene {
     ....

     func loadStartScene() {
        // If you do everything in code
        let startScene = StartScene(size: self.size)
        view?.presentScene(startScene, transition: ...)

        // If you use SpriteKit scene editor
        guard let startScene = SKScene(fileNamed: "StartScene") else { return } // fileNamed is the name you gave the .sks file
        view?.presentScene(startScene, transition: ...)
   }
}

Hope this helps

希望这可以帮助

#2


1  

Here is an example of how you can create a button using a colored sprite. It shows how you can set up a button to receive touch events and how you can use those touch events to navigate between scenes.

以下是如何使用彩色精灵创建按钮的示例。它显示了如何设置按钮以接收触摸事件以及如何使用这些触摸事件在场景之间导航。

In this example you can navigate forward to new scenes and backwards to previous scenes.

在此示例中,您可以向前导航到新场景并向后导航到之前的场景。

import SpriteKit

class Button: SKSpriteNode {

    var tapped: (() -> Void)?

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        tapped?()
    }

}

class GameScene: SKScene {

    var parentScene: SKScene?
    var sceneCount = 1

    override func didMove(to view: SKView) {
        if parentScene != nil {
            let backButton = addButton(color: .red, position: CGPoint(x: -200, y: 0))
            backButton.tapped = {
                if let previousScene = self.parentScene {
                    view.presentScene(previousScene)
                }
            }
        }

        let nextButton = addButton(color: .blue, position: CGPoint(x: 200, y: 0))
        nextButton.tapped = {
            if let nextScene = SKScene(fileNamed: "GameScene") as? GameScene {
                nextScene.scaleMode = self.scaleMode
                nextScene.parentScene = self
                nextScene.sceneCount = self.sceneCount + 1
                view.presentScene(nextScene)
            }
        }

        let label = SKLabelNode(text: "Scene \(sceneCount)")
        addChild(label)
    }

    func addButton(color: SKColor = .white, position: CGPoint = .zero) -> Button {
        let button = Button(color: color, size: CGSize(width: 200, height: 200))
        button.position = position
        button.isUserInteractionEnabled = true
        addChild(button)
        return button
    }

}