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 呈现场景、创建视图、创建场景等时,您一定会遇到问题。因此,请跳过您的 prefView
和 helpView
属性并使用场景的 @987654323 @ 属性来一个接一个地呈现你的场景。
view?.presentScene(scoreScene)
如果(出于某种原因)您需要保留 (1) 不同的场景实例,而是在您的 GameViewController 中处理此问题。
(1) 在大多数情况下,您可能不应该...
【讨论】:
谢谢,我已经重组了我的应用程序,现在它可以工作了。不幸的是,我希望避免很多工作。以上是关于Swift:Spritekit 中的多个场景,从第二个和第一个场景的不同 Sprite 节点类型调用 touchesBegan的主要内容,如果未能解决你的问题,请参考以下文章
Swift和Spritekit sceneDidLoad被调用多个
如何使用 Swift 正确切换 SpriteKit 中的 SKScene?
使用 Swift 在 sprite kit 中的多个场景中重用相同的 sprite 节点