2015-11-08 18 views
0

我改變了函數中的值,並想訪問同一類中另一個函數的值。我的代碼:Swift:變量的公共值仍然是本地的?

class person{ 

var fieldsWidth = CGFloat() 
var xPos = CGFloat() 
var yPos = CGFloat() 
var player = SKSpriteNode() 

func addPlayer(gameScene: GameScene, x: CGFloat, y: CGFloat){ 
    fieldsWidth = gameScene.screenWidth/CGFloat(hintergrund().fieldsX) 
    player = SKSpriteNode(imageNamed: "player") 
    player.size = CGSize(width: fieldsWidth, height: fieldsWidth) 
    player.position = CGPoint(x: x, y: y) 
    gameScene.addChild(player) 
    xPos = x 
} 

func move(gameScene: GameScene, point: CGPoint, fWidth: CGFloat){ 
    print(xPos) 
} 

}

和GameScene:

class GameScene: SKScene { 

var screenWidth = CGFloat() 
var screenHeight = CGFloat() 
var touchLocation = CGFloat() 
var fieldsWidth = CGFloat() 
let player = person() 

override func didMoveToView(view: SKView) { 
    screenWidth = self.size.width 
    screenHeight = self.size.height 
    fieldsWidth = screenWidth/CGFloat(hintergrund().fieldsX) 
    person().addPlayer(self, x: fieldsWidth/2, y: fieldsWidth/2) 
} 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    /* Called when a touch begins */ 
    let touch = touches.first 
    var point = CGPoint() 
    point = touch!.locationInNode(self) 
    player.move(self, point: point, fWidth: fieldsWidth) 
} 

}

不知何故XPOS的值是addPlayer只是局部的。我如何正確訪問xPos的值?希望你能幫助我。

回答

1

我覺得CGFloat的是值0.0讓你的錯誤的最可能的原因是你調用函數2在函數之前你的代碼。錯誤在別的地方。

編輯自從你發佈代碼。我會嘗試這個(建立一個新的球員,並保留它 - 我不是一個精靈套件專家):

class GameScene: SKScene { 

    var screenWidth = CGFloat() 
    var screenHeight = CGFloat() 
    var touchLocation = CGFloat() 
    var fieldsWidth = CGFloat() 
    var player = person() // SEE HERE - Variable, so that you can reassign it 

    override func didMoveToView(view: SKView) { 
     screenWidth = self.size.width 
     screenHeight = self.size.height 
     fieldsWidth = screenWidth/CGFloat(hintergrund().fieldsX) 
     player = person().addPlayer(self, x: fieldsWidth/2, y: fieldsWidth/2) // SEE HERE - Create new player and retain it into your scene 
    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     /* Called when a touch begins */ 
     let touch = touches.first 
     var point = CGPoint() 
     point = touch!.locationInNode(self) 
     player.move(self, point: point, fWidth: fieldsWidth) 
    } 
} 

PS:以上可能會奏效,但說真的,從我的理解,你需要創建的每個玩家時間didMoveToView被調用。如果是這樣的話,那麼我將爲player類做一個指定的初始化程序,而不是做這個人爲的addPlayer函數。類似於(未經測試):

func init(scene: SKScene, x: CGFLoat, y: CGFloat) { 
// ETC... 
} 
+0

我在錯誤可能的地方添加了更多的代碼。 –

+0

怎樣才能獲得句柄? –

+0

初始化者絕對是要走的路。謝謝。 –

2

運行完全按照預期下面的代碼,我在的XCode 7.1版(7B91b)操場

class person{ 

    var yPos = CGFloat() 

    func function1(y: CGFloat){ 
     yPos = y 
     print(yPos) //Value of yPos is 31.25; correct! 
    } 

    func function2(){ 
     print(yPos) //Value of yPos is 0.0; wrong!?? 
    } 
} 

let foo = person() 
foo.function1(31.25) 
foo.function2() //Outputs 31.25 
+0

這是我所期待的。函數中有更多的代碼,並且我使用的是SpriteKit,這是否有所不同?我將代碼縮減爲必要的部分。 –

+0

現在我添加了更多的錯誤代碼。 –