Ios 将当前游戏场景实例传递到名为“在游戏场景中”的类中

Ios 将当前游戏场景实例传递到名为“在游戏场景中”的类中,ios,swift,class,sprite-kit,Ios,Swift,Class,Sprite Kit,我正在SpriteKit游戏中构建一个PauseButton类,我想在游戏场景激活时为其绘制一个标签。但是,我需要在didMoveToView之外实例化按钮(就在它的前面,在GameScene中),这样我就可以从touchStart方法更“全局”地访问它 let pauseButton = PauseButton(theTexture: pauseButtonTexture,gameScene:GameScene) override func didMoveToView(view: SKView

我正在SpriteKit游戏中构建一个
PauseButton
类,我想在
游戏场景激活时为其绘制一个标签。但是,我需要在
didMoveToView
之外实例化按钮(就在它的前面,在
GameScene
中),这样我就可以从
touchStart
方法更“全局”地访问它

let pauseButton = PauseButton(theTexture: pauseButtonTexture,gameScene:GameScene)
override func didMoveToView(view: SKView) {

理想情况下,我可以通过在
didMoveToView
中实例化视图来传递视图,但现在我不知道如何执行此操作,也不知道如何从场景的其余部分访问它。也就是说,有没有一种方法可以传递我正在使用的当前
GameSecene
实例,以便我可以从button类的方法内部执行类似于
GameSecene.addchild(label)
的操作?我找不到任何有用的东西,所以任何帮助都会很好

你基本上可以用两种方法来做

1) 只需像这样创建属性

var pauseButton: PauseButton!
然后像这样在didMoveToView中实例化它

override func didMoveToView(view: SKView) {
     pauseButton = PauseButton(theTexture: pauseButtonTexture,gameScene: self)
     addChild(pauseButton)
}
2) 使用惰性实例化,以便可以执行最初尝试执行的操作

最简单形式的惰性变量允许您在不执行步骤1的情况下使用self

lazy var pauseButton: PauseButton = PauseButton(theTexture: pauseButtonTexture,gameScene: self)

override func didMoveToView(view: SKView) { 
您甚至可以这样做,在同一位置添加此按钮的更多属性

lazy var pauseButton: PauseButton = {
       let button = PauseButton(theTexture: pauseButtonTexture,gameScene: self)
       button.zPosition = 200
       button.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
       button.alpha = 0.5

       return button
}()

override func didMoveToView(view: SKView) {
        addChild(pauseButton)
}
请记住,每个SKNode/SKSpriteNode等都有一个场景属性。如果您的button类是SKNode/SKSpriteNode的子类,则可以获取其场景属性,并使用“as”操作符获取对游戏场景的引用,而无需在初始化方法中传递场景

e、 g

作为提示,我不会在pauseButton子类中添加pause标签,而是从场景本身或pause menu子类中添加它。 此外,我不会子类每个按钮,我会板条箱1类,可用于所有按钮在您的游戏。您可以创建一个带有按钮名称的枚举,并将其传递到init方法,以便在按下按钮时区分它们

你的按钮子类应该只处理动画,纹理等。你可以查看苹果游戏DemoBots的例子


希望这对你有所帮助,你基本上可以用两种方法来做

1) 只需像这样创建属性

var pauseButton: PauseButton!
然后像这样在didMoveToView中实例化它

override func didMoveToView(view: SKView) {
     pauseButton = PauseButton(theTexture: pauseButtonTexture,gameScene: self)
     addChild(pauseButton)
}
2) 使用惰性实例化,以便可以执行最初尝试执行的操作

最简单形式的惰性变量允许您在不执行步骤1的情况下使用self

lazy var pauseButton: PauseButton = PauseButton(theTexture: pauseButtonTexture,gameScene: self)

override func didMoveToView(view: SKView) { 
您甚至可以这样做,在同一位置添加此按钮的更多属性

lazy var pauseButton: PauseButton = {
       let button = PauseButton(theTexture: pauseButtonTexture,gameScene: self)
       button.zPosition = 200
       button.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
       button.alpha = 0.5

       return button
}()

override func didMoveToView(view: SKView) {
        addChild(pauseButton)
}
请记住,每个SKNode/SKSpriteNode等都有一个场景属性。如果您的button类是SKNode/SKSpriteNode的子类,则可以获取其场景属性,并使用“as”操作符获取对游戏场景的引用,而无需在初始化方法中传递场景

e、 g

作为提示,我不会在pauseButton子类中添加pause标签,而是从场景本身或pause menu子类中添加它。 此外,我不会子类每个按钮,我会板条箱1类,可用于所有按钮在您的游戏。您可以创建一个带有按钮名称的枚举,并将其传递到init方法,以便在按下按钮时区分它们

你的按钮子类应该只处理动画,纹理等。你可以查看苹果游戏DemoBots的例子


希望这有帮助

如果你从GameSecene方法内部传递GameSecene,请使用
self
@phillipMills参数类型是什么??当我调用游戏场景中的
let pauseButton=pauseButton(文本:pausebuttonexture,游戏场景:self)
之前的
didMoveToView
时,我得到错误
无法将NSobject->()->->->gamesene的值类型转换为预期的参数类型gamesene
。init看起来像:
init(文本:SKTexture,游戏场景:GameSecene){
。谢谢!这似乎是在说你没有在游戏场景方法中调用它。这里还有一个问题,有人在
self
@phillipMills上犯了同样的错误,我把它放在
didMoveToView
上面,如问题所示,所以我想它不在方法中。我需要在一个方法中使用它吗?真的吗n我甚至没有把它放在
didMoveToView
中,是因为我想从其他游戏场景方法(如
touch
)中访问
pauseButton
,而让它在游戏场景中全局化是我知道的唯一方法。如果你从游戏场景方法内部传递游戏场景,请使用
self
@phillipMills这是什么参数类型??当我调用
let pauseButton=pauseButton(文本:pausebuttonexture,游戏场景:self)
时,我得到一个错误
无法将NSobject->()->->游戏场景的值类型转换为预期的参数类型GameScene
。初始化看起来像:
init(纹理:SKTexture,游戏场景:游戏场景){
。谢谢!这似乎是在说你没有在游戏场景方法中调用它。这里还有一个问题,有人在
self
@phillipMills上犯了同样的错误,我把它放在
didMoveToView
上面,如问题所示,所以我想它不在方法中。我需要在一个方法中使用它吗?真的吗n我甚至没有把它放在
didMoveToView
中,是因为我想从其他游戏场景方法(如
touch
)中访问
pauseButton
,而让它在游戏场景中全局化是我知道的唯一方法?我只是回顾这个问题,想知道你是否可以使用
var pauseButton:P来解释auseButton!
?我知道这与选项有关,但我没有完全从概念上理解它们。在
PauseButton之后编写
有什么区别?当然,可能必须将其拆分为两个注释。基本上!意味着您正在展开var PauseButton属性。因此当你感到沮丧时