过渡场景精灵套件

时间:2016-11-07 19:29:40

标签: xcode sprite-kit transition scene

我无法转换到不同场景上的预定位置。 (例如,当马里奥进入隧道时,他返回到他离开的原始场景)我能够编写一种方法来进入下一个场景,但节点没有出现,我想要它。

这是我转换到第二个场景的代码

func didBeginContact(contact: SKPhysicsContact) {
    _ = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

if (contact.bodyA.categoryBitMask == BodyType.cup.rawValue && contact.bodyB.categoryBitMask == BodyType.ball.rawValue) {

touchmain()


} else if (contact.bodyA.categoryBitMask == BodyType.ball.rawValue && contact.bodyB.categoryBitMask == BodyType.cup.rawValue) {

touchmain()

}
}

    func touchmain() {

        let second = GameScene(fileNamed:"GameScene")
        second?.scaleMode = .AspectFill
        self.view?.presentScene(second!, transition: SKTransition.fadeWithDuration(0.5))
    }

如果你们能帮助年轻的开发者,我真的很感激。非常爱!

2 个答案:

答案 0 :(得分:0)

有很多方法可以解决这个问题。它的一般要点是,在离开场景之前记住“马里奥”的位置并将其传递到下一场景中的属性。 (或者您可以使用委托来获取信息)

如果场景是他在SceneA(主要级别)中开始转移到SceneB(小型钱币隧道)然后返回到SceneA(主级别),您可以将该位置传递给SceneB并在SceneB中具有存储Mario所在位置的属性是。然后,当您转移回SceneA时,只需将该属性传递回SceneA中的属性,并相应地定位Mario和SceneA

    func touchmain() {

        let marioPos: CGPoint = Mario.position

        let second = GameScene(fileNamed:"GameScene")
        second.startingPos = marioPos
        second?.scaleMode = .AspectFill
        self.view?.presentScene(second!, transition: SKTransition.fadeWithDuration(0.5))
    }

答案 1 :(得分:0)

您可以使用SKScene上的userData字段记住位置:

在第一个场景init的某处,执行:

userData = [String : NSObject]()

此外,在您的第一个场景中,我们希望覆盖didMove(to:SKView)以根据您的用户数据设置马里奥位置:

override func didMove(to:SKView)
{
   super.didMove(to:to)
   if let position = self.userData["position"]
   {
      mario.position = position
   }
}

然后我们想要在离开场景时实际分配用户数据:

func touchmain() {
        if let userData = self.userData
        {
            userData["marioPosition"] = mario.position
        }
        if let second = GameScene(fileNamed:"GameScene")
        {
            second.scaleMode = self.scaleMode //I assume we do not want to change scaleMode between scenes
            second.userData = userData
            self.view?.presentScene(second, transition: SKTransition.fadeWithDuration(0.5))
        }
        else
        {
            print("Error creating Second scene")
        }
}

当我们回来时,我们想要将userData转回第一个屏幕。这是我之前提到的didMove发挥作用的地方,这将马里奥的位置设置到以前的位置。

...我没有看到这段代码,所以请尝试将其应用到你的工作中

func touchBackToFirst() {

        if let first = GameScene(fileNamed:"GameScene")
        {
            first.scaleMode = self.scaleMode
            first.userData = userData
            self.view?.presentScene(first, transition: SKTransition.fadeWithDuration(0.5))
        }
        else
        {
            print("Error creating Firstscene")
        }
}