Ios 将当前游戏场景实例传递到名为“在游戏场景中”的类中
我正在SpriteKit游戏中构建一个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
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属性。因此当你感到沮丧时