调用 class 函数
Calling a class function
我有我的主要 GameScene.swift 文件和一个 facebookLogin.swift 文件。
我正在从 facebookLogin.Swift 文件的 class 创建一个 SKSpriteNode 'FBButton',并通过 self.addChild(FBButton) 将其添加到 GameScene。 class 有两个函数 touchBegan() 和 facebookSignIn()。
当用户触摸 sprite 'FBButton' 时,touchBegan() 确认触摸按钮并调用 facebookSignIn()。然后此函数连接到用户 Facebook。到目前为止一切都很好。
然后我希望此函数调用 GameScene.swift 中的 ShowButtons() 函数。
我调用 GameScene().ShowButtons() 删除 FBLogin SpriteNode 并添加 2 个 SpriteNode 并将用户 Facebook 数据下载到 NSDictionary。
数据从用户 Facebook 获取,但是按钮不生成 FBButton 未从父项中删除。
请帮我看看哪里错了。
class facebookLogin: SKNode {
var signedIn = false
override init() {
fbButton = SKSpriteNode(imageNamed: "login_with_facebook")
fbButton.xScale = 1.0
fbButton.yScale = 1.0
super.init()
addChild(fbButton)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
let touch = touches.anyObject() as UITouch
let point = touch.locationInNode(self)
if fbButton.containsPoint(point) {
facebookSignin()
}
}
func facebookSignin() {
var permissions = ["user_about_me",
"user_birthday"];
PFFacebookUtils.logInWithPermissions(permissions, {
(user: PFUser!, error: NSError!) -> Void in
if user == nil {
NSLog("Uh oh. The user cancelled the Facebook login.")
self.signedIn = false
} else if user.isNew {
NSLog("User signed up and logged in through Facebook!")
self.signedIn = true
} else {
NSLog("User logged in through Facebook!")
self.signedIn = true
GameScene().ShowButtons()
}
})
}
}
下面是显示按钮脚本
class GameScene: SKScene {
let fbButton = facebookLogin()
var btnHostGame: SKSpriteNode = SKSpriteNode(imageNamed: "HostGame")
var btnJoinGame: SKSpriteNode = SKSpriteNode(imageNamed: "JoinGame")
override func didMoveToView(view: SKView) {
userInteractionEnabled=true
self.backgroundColor = SKColor.whiteColor()
self.fbButton.userInteractionEnabled = true
self.fbButton.position = CGPoint(x: self.size.width * 0.5, y: self.size.height * 0.5)
addChild(self.fbButton)
}
func showButtons() {
self.btnHostGame.name = "btnHostGame"
self.btnHostGame.position = CGPoint(x: self.size.width * 0.5, y: self.size.height * 0.6)
addChild(self.btnHostGame)
self.btnJoinGame.name = "btnJoinGame"
self.btnJoinGame.position = CGPoint(x: self.size.width * 0.5, y: self.size.height * 0.40)
addChild(self.btnJoinGame)
fbButton.RemoveFromParent()
}
}
除回调 GameScene 外,一切正常。按钮不会出现,FBButton 也不会被删除。
有人知道解决方案吗?
干杯
瑞恩
在 GameScene().ShowButtons()
中,您实际上是在创建 GameScene
class 的新实例。此实例不是当前添加到 SKView
的实例。这就是它不起作用的原因。
改为在 facebookLogin
节点中为 GameScene
声明一个 弱 属性。
class faceBookLogin : SKNode
{
weak var gameScene : GameScene? = nil
}
并从您的 didMoveToView
函数中添加 gameScene。
override func didMoveToView(view: SKView) {
userInteractionEnabled=true
self.backgroundColor = SKColor.whiteColor()
self.fbButton.userInteractionEnabled = true
self.fbButton.position = CGPoint(x: self.size.width * 0.5, y: self.size.height * 0.5)
addChild(self.fbButton)
self.fbButton.gameScene = self
}
通过这种方式,您可以调用来自 func facebookSignin()
的 GameScene
func facebookSignin() {
// Your code.
self.gameScene.showButtons()
}
我有我的主要 GameScene.swift 文件和一个 facebookLogin.swift 文件。
我正在从 facebookLogin.Swift 文件的 class 创建一个 SKSpriteNode 'FBButton',并通过 self.addChild(FBButton) 将其添加到 GameScene。 class 有两个函数 touchBegan() 和 facebookSignIn()。
当用户触摸 sprite 'FBButton' 时,touchBegan() 确认触摸按钮并调用 facebookSignIn()。然后此函数连接到用户 Facebook。到目前为止一切都很好。
然后我希望此函数调用 GameScene.swift 中的 ShowButtons() 函数。 我调用 GameScene().ShowButtons() 删除 FBLogin SpriteNode 并添加 2 个 SpriteNode 并将用户 Facebook 数据下载到 NSDictionary。
数据从用户 Facebook 获取,但是按钮不生成 FBButton 未从父项中删除。
请帮我看看哪里错了。
class facebookLogin: SKNode {
var signedIn = false
override init() {
fbButton = SKSpriteNode(imageNamed: "login_with_facebook")
fbButton.xScale = 1.0
fbButton.yScale = 1.0
super.init()
addChild(fbButton)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
let touch = touches.anyObject() as UITouch
let point = touch.locationInNode(self)
if fbButton.containsPoint(point) {
facebookSignin()
}
}
func facebookSignin() {
var permissions = ["user_about_me",
"user_birthday"];
PFFacebookUtils.logInWithPermissions(permissions, {
(user: PFUser!, error: NSError!) -> Void in
if user == nil {
NSLog("Uh oh. The user cancelled the Facebook login.")
self.signedIn = false
} else if user.isNew {
NSLog("User signed up and logged in through Facebook!")
self.signedIn = true
} else {
NSLog("User logged in through Facebook!")
self.signedIn = true
GameScene().ShowButtons()
}
})
}
}
下面是显示按钮脚本
class GameScene: SKScene {
let fbButton = facebookLogin()
var btnHostGame: SKSpriteNode = SKSpriteNode(imageNamed: "HostGame")
var btnJoinGame: SKSpriteNode = SKSpriteNode(imageNamed: "JoinGame")
override func didMoveToView(view: SKView) {
userInteractionEnabled=true
self.backgroundColor = SKColor.whiteColor()
self.fbButton.userInteractionEnabled = true
self.fbButton.position = CGPoint(x: self.size.width * 0.5, y: self.size.height * 0.5)
addChild(self.fbButton)
}
func showButtons() {
self.btnHostGame.name = "btnHostGame"
self.btnHostGame.position = CGPoint(x: self.size.width * 0.5, y: self.size.height * 0.6)
addChild(self.btnHostGame)
self.btnJoinGame.name = "btnJoinGame"
self.btnJoinGame.position = CGPoint(x: self.size.width * 0.5, y: self.size.height * 0.40)
addChild(self.btnJoinGame)
fbButton.RemoveFromParent()
}
}
除回调 GameScene 外,一切正常。按钮不会出现,FBButton 也不会被删除。
有人知道解决方案吗?
干杯 瑞恩
在 GameScene().ShowButtons()
中,您实际上是在创建 GameScene
class 的新实例。此实例不是当前添加到 SKView
的实例。这就是它不起作用的原因。
改为在 facebookLogin
节点中为 GameScene
声明一个 弱 属性。
class faceBookLogin : SKNode
{
weak var gameScene : GameScene? = nil
}
并从您的 didMoveToView
函数中添加 gameScene。
override func didMoveToView(view: SKView) {
userInteractionEnabled=true
self.backgroundColor = SKColor.whiteColor()
self.fbButton.userInteractionEnabled = true
self.fbButton.position = CGPoint(x: self.size.width * 0.5, y: self.size.height * 0.5)
addChild(self.fbButton)
self.fbButton.gameScene = self
}
通过这种方式,您可以调用来自 func facebookSignin()
GameScene
func facebookSignin() {
// Your code.
self.gameScene.showButtons()
}