Swift:Spritekit 中的多个场景,从第二个和第一个场景的不同 Sprite 节点类型调用 touchesBegan

Posted

技术标签:

【中文标题】Swift:Spritekit 中的多个场景,从第二个和第一个场景的不同 Sprite 节点类型调用 touchesBegan【英文标题】:Swift: Multiple scenes in Sprite Kit, touchesBegan from different SpriteNodes types on 2nd and 1st scene are called 【发布时间】:2015-09-11 08:21:49 【问题描述】:

我在 Sprite Kit (Swift) 中使用多个场景时遇到问题。我设置了 3 个场景(游戏场景、偏好和帮助场景)。我定义了两个不同的 SpriteNode 类,称为 CardItem 和 MenuItem。当我只在游戏场景中使用 CardItem 时,我在所有三个场景中都使用了 MenuItem。因此,当我在游戏场景(标准场景)中触摸 CardItem SpriteNode 时,只会调用该类(在游戏场景中)的 touchesBegan 函数。但是当我跳入偏好或帮助场景(来自游戏场景)并触摸 SpriteNode MenuItem 时,不仅调用了它们的 touchesBegan 函数,而且还调用了游戏场景中 CardItem 类型的 touchesBegan !!! (在后面仍然可用)被调用。

我现在的问题是,这是我的应用程序中的功能还是错误?

这是我的带有场景初始化的 GameScene 类

class GameScene: SKScene, PreferencesSceneDelegate, HelpSceneDelegate 
var prefView: SKView?
var helpView: SKView?
var activeGame: Game?
var gamePrefs =  gamePreferences()
var prefManager: PreferencesManager!

func prefSceneDidFinish(myScene: PreferencesScene, command: String) 

    // Remove PreferencesScene from Screen

    if (command == "Abbruch") 
        myScene.view!.removeFromSuperview()
        setButtonTexture(command)
     else if command == "Done" 
        myScene.view!.removeFromSuperview()
        activeGame!.setupNewGame(self, gamePrefs: self.gamePrefs, prefManager: self.prefManager, command: 1)
     else 
        println("prefSceneDidFinish: command \(command) not specified")
    



func helpSceneDidFinish(myScene: HelpScene) 

    // Remove HelpScene from Screen
    myScene.view!.removeFromSuperview()



override func didMoveToView(view: SKView) 
    let background = Card(cardType: .background)
    background.cardID = CardName.background.rawValue
    background.anchorPoint = CGPoint(x: 0.5, y: 1.0)
    background.position = CGPoint(x: size.width/2, y: size.height)
    background.zPosition = -2
    background.userInteractionEnabled = false
    self.addChild(background)

    //
    // Preferences Initialization
    //
    self.prefView = SKView(frame: CGRectMake(0, 0, self.frame.width, self.frame.height))

    // Create and configure PreferencesScene
    prefscene = PreferencesScene(size: view.bounds.size)
    prefscene.scaleMode = .AspectFill
    prefManager = PreferencesManager(prefs: gamePrefs)
    tmpSeriesSelection = gamePrefs.inScope // Initialize after data load fromn file

    self.prefView!.presentScene(prefscene)
    prefscene!.thisDelegate = self

    // 
    // Help Initialization
    //
    self.helpView = SKView(frame: CGRectMake(0, 0, self.frame.width, self.frame.height))

    // Create and configure HelpScene
    helpscene = HelpScene(size: view.bounds.size)
    helpscene.scaleMode = .AspectFill

    self.helpView!.presentScene(helpscene)
    helpscene!.thisDelegate = self
    var helpSceneBackground = SKSpriteNode(imageNamed: "HelpSceneBackground.png")
    helpSceneBackground.anchorPoint = CGPoint(x: 0.5, y: 1.0)
    helpSceneBackground.position = CGPoint(x: size.width/2, y: size.height)
    helpSceneBackground.zPosition = 0
    helpSceneBackground.userInteractionEnabled = false
    helpscene.addChild(helpSceneBackground)


    activeGame = Game(scene: self, gamePrefs: gamePrefs, prefManager: prefManager)

这是我调用场景的代码 sn-p (MenuItem touchesBegan)

    case .help :
        println("Pressed Help")
        var transition = SKTransition.fadeWithDuration(Double(0.0))
        self.scene!.view?.addSubview(gamescene.helpView!)
    case .preferences :
        …
       var transition = SKTransition.fadeWithDuration(Double(0.0))
        self.scene!.view?.addSubview(gamescene.prefView!)
    case .ok :
        println("OK Selektion")
        …
       gamescene.prefManager.save(gamescene.gamePrefs)
        prefscene.thisDelegate!.prefSceneDidFinish(prefscene, command: "Done")

提前感谢您的帮助

【问题讨论】:

【参考方案1】:

当您的场景创建自己的 SKView-instances 呈现场景、创建视图、创建场景等时,您一定会遇到问题。因此,请跳过您的 prefViewhelpView 属性并使用场景的 @987654323 @ 属性来一个接一个地呈现你的场景。

view?.presentScene(scoreScene)

如果(出于某种原因)您需要保留 (1) 不同的场景实例,而是在您的 GameViewController 中处理此问题。

(1) 在大多数情况下,您可能不应该...

【讨论】:

谢谢,我已经重组了我的应用程序,现在它可以工作了。不幸的是,我希望避免很多工作。

以上是关于Swift:Spritekit 中的多个场景,从第二个和第一个场景的不同 Sprite 节点类型调用 touchesBegan的主要内容,如果未能解决你的问题,请参考以下文章

Swift和Spritekit sceneDidLoad被调用多个

如何使用 Swift 正确切换 SpriteKit 中的 SKScene?

使用 Swift 在 sprite kit 中的多个场景中重用相同的 sprite 节点

如何重命名 iOS SpriteKit 模板中的默认场景?

如何将SpriteKit中的单个游戏场景添加到普通的单视图Swift应用程序中

如何访问 SpriteKit 场景编辑器参考节点上自定义类中包含的 Swift 中的变量?