2014-08-28 40 views
0

我正在製作遊戲。遊戲的代碼幾乎完全在PlayScene.swift文件中。但是,由於我需要識別平移手勢,因此必須將UIPanGestureRecognizer添加到我的ViewController.swift中。當玩家拖動屏幕時,我想旋轉在PlayScene.swift中聲明和使用的SpriteNode。這個spriteNode的名稱是Tommy,但是當我從ViewController(這是我在PlayScene.swift中的一個自定義函數)中執行PlayScene().rotateTommyLeft()時,函數rotateTommyLeft被調用,但它不會旋轉當前正在運行的同一個sprite 。它創建一個類PlayScene的新實例,創建新的SpriteNode tommy,然後旋轉那個。swift:從控制器訪問正在使用的場景變量

如何從當前正在運行的PlaySceen訪問SpriteNode tommy?

編輯:我發佈代碼的部分,所以我們可以解決存儲場景並在其他類之間傳輸的問題。

在我的GameScene類的頂部,我聲明瞭變量storedPlayScene來存儲遊戲發生的場景。

var storedPlayScene = PlayScene()

然後,我創建了現場,目前它當按下播放按鈕(也GameScene類)

var scene = PlayScene(size: self.size) 
       let skView = self.view as SKView 
       skView.ignoresSiblingOrder = true 
       scene.scaleMode = .ResizeFill 
       scene.size = skView.bounds.size 
       scene.backgroundColor = UIColor(red: 106/255.0, green: 180/255.0, blue: 1.0, alpha: 1.0) 

       storedPlayScene = scene 

       skView.presentScene(scene) 

現在令人吃驚的一部分出現,當我試圖獲得兩個變量屬於PlayScene類,來自ViewController類。

當我寫這篇文章的視圖控制器類

var rotation = GameScene().getStoredPlayScene().tommy.zRotation我獲得正確的zRotation。 但是,當我在相同的ViewController類var position = GameScene().getStoredPlayScene().getPos()中編寫該數據時,數據不正確。它表示位置是(0,0)。

我有問題搞清楚爲什麼位置不正確,而zRotation是好的。

+1

何時/在哪裏創建正在使用的PlayScene實例?您需要存儲對該實例的引用,並使用該引用來調用'playScene.rotateTommyLeft()'。 – 2014-08-28 14:59:41

+0

謝謝。我找到了代碼。它正在被稱爲GameScene的前一場景中創建。我究竟如何存儲它,以便我可以從控制器訪問它?我試圖將它存儲在NSUserDefaults中,但我無法檢索它。有沒有其他的變量,你推薦存儲它? – Sam 2014-08-28 16:26:14

+1

_不要使用NSUserDefaults,這不是它的目的。沒有看到你的代碼和/或知道你的項目是如何佈置的,很難準確地說出你應該做什麼。但是,一般來說,這聽起來像'PlayScene'應該是一個[屬性](https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/ 'GameScene'上的doc/uid/TP40014097-CH14-XID_368),它應該是視圖控制器上的一個屬性。然後你可以通過'self.gameScene.playScene'這樣的東西從你的視圖控制器訪問'PlayScene'。 – 2014-08-28 19:48:39

回答

1

當您致電PlayScene().rotateTommyLeft()時,您將創建一個新實例PlayScene,並且不訪問當前在您遊戲中運行的playScene。所以,你需要在某個地方存儲playScene,以便你可以訪問它。由於您在gameScene內部創建了playScene,因此GameScene類是爲playScene添加屬性的好地方。

便箋:您提到了嘗試將它存儲在註釋中的NSUserDefaults中。這不僅不起作用,但那不是NSUserDefaults的用處。 NSUserDefaults是爲簡單的喜好而設計的,沒有其他的東西。你可能會存儲他們用於獲得高分的姓氏,或者他們目前所處的水平,但通常不會比這更復雜。

既然我們有一個playScene的地產gameScene,您需要能夠從您的視圖控制器訪問它。要做到這一點,您需要能夠從您的視圖控制器訪問gameScene。因此,就像您將playScene屬性添加到gameScene一樣,將gameScene屬性添加到您的視圖控制器。一旦到位並正確設置,您就可以訪問您嘗試撥打的原始方法:self.gameScene.playScene.rotateTommyLeft()

Re:旋轉和位置在您的編輯中。你在那裏做同樣的事情:你在每個呼叫上創建GameScene的新實例。如果你改變它來使用我們上面創建的屬性,它應該可以正常工作。

+0

謝謝。完美和詳細的答案,解決了我的問題。 – Sam 2014-08-30 14:46:35

相關問題