Xcode 更改场景后节点不移动
我做了一个(基本的)游戏,工作完美,进入游戏场景,当它从游戏场景回到游戏场景时,玩家(Spritode)不再移动 我在游戏场景代码中评论了它的功能 我没有从Xcode得到任何错误 该bug位于gamescene.swift文件中(功能:swipedRight+swipedLeft+swipedUp+swipedDown): gameviewcontroller文件:Xcode 更改场景后节点不移动,xcode,swift,Xcode,Swift,我做了一个(基本的)游戏,工作完美,进入游戏场景,当它从游戏场景回到游戏场景时,玩家(Spritode)不再移动 我在游戏场景代码中评论了它的功能 我没有从Xcode得到任何错误 该bug位于gamescene.swift文件中(功能:swipedRight+swipedLeft+swipedUp+swipedDown): gameviewcontroller文件: import UIKit import SpriteKit import AVFoundation class GameView
import UIKit
import SpriteKit
import AVFoundation
class GameViewController: UIViewController, UITextFieldDelegate{
var scene:GameScene!
func swipedRight(sender: UISwipeGestureRecognizer){
scene.swipedRight1(sender)
}
func swipedLeft(sender: UISwipeGestureRecognizer){
scene.swipedLeft1(sender)
}
func swipedDown(sender: UISwipeGestureRecognizer){
scene.swipedDown1(sender)
}
func swipedUp(sender: UISwipeGestureRecognizer){
scene.swipedUp1(sender)
}
override func viewDidLoad() {
super.viewDidLoad()
let skView = view as SKView
skView.multipleTouchEnabled = false
scene = GameScene(size: skView.bounds.size)
scene.scaleMode = SKSceneScaleMode.AspectFill
skView.presentScene(scene)
let swipeRight:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("swipedRight:"))
swipeRight.direction = .Right
view.addGestureRecognizer(swipeRight)
let swipeLeft:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("swipedLeft:"))
swipeLeft.direction = .Left
view.addGestureRecognizer(swipeLeft)
let swipeUp:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("swipedUp:"))
swipeUp.direction = .Up
view.addGestureRecognizer(swipeUp)
let swipeDown:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("swipedDown:"))
swipeDown.direction = .Down
view.addGestureRecognizer(swipeDown)
}
override func prefersStatusBarHidden() -> Bool {
return true
}
}
您在错误的场景中调用了
swipedUp1
(etc)方法。下面是正在发生的事情:
游戏场景
实例的引用。它的手势和动作方法就是如此,一切都很好GameOverScene
启动新游戏时,将创建GameScene
的新实例并将其显示在视图中。现在您有了两个游戏场景的实例:视图控制器仍指向的实例和视图正在渲染的实例
游戏场景
对话。所以你的日志行会被打印出来,但是你看不到任何事情发生,因为第二个游戏场景就是正在显示的
scene
属性并让手势动作调用到view.scene
来解决这两个问题(在适当的施法之后):
这样,滑动将转到视图控制器的视图当前显示的任何场景
或者,您可以保留原始的swipedUp
(etc)代码,并将场景
从存储属性更改为只读计算属性,以始终获取当前显示的场景:
var scene: GameScene {
let skView = view as SKView
return skView.scene as GameScene
}
请通过删除所有不必要的空行来重新格式化代码-一行可以,两行可以,三行或更多行不行。另外,最好至少指定要查找的方法的名称,或者指定要搜索的文本,这样读者就不必逐行滚动代码来查找它。
import UIKit
import SpriteKit
import AVFoundation
class GameViewController: UIViewController, UITextFieldDelegate{
var scene:GameScene!
func swipedRight(sender: UISwipeGestureRecognizer){
scene.swipedRight1(sender)
}
func swipedLeft(sender: UISwipeGestureRecognizer){
scene.swipedLeft1(sender)
}
func swipedDown(sender: UISwipeGestureRecognizer){
scene.swipedDown1(sender)
}
func swipedUp(sender: UISwipeGestureRecognizer){
scene.swipedUp1(sender)
}
override func viewDidLoad() {
super.viewDidLoad()
let skView = view as SKView
skView.multipleTouchEnabled = false
scene = GameScene(size: skView.bounds.size)
scene.scaleMode = SKSceneScaleMode.AspectFill
skView.presentScene(scene)
let swipeRight:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("swipedRight:"))
swipeRight.direction = .Right
view.addGestureRecognizer(swipeRight)
let swipeLeft:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("swipedLeft:"))
swipeLeft.direction = .Left
view.addGestureRecognizer(swipeLeft)
let swipeUp:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("swipedUp:"))
swipeUp.direction = .Up
view.addGestureRecognizer(swipeUp)
let swipeDown:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("swipedDown:"))
swipeDown.direction = .Down
view.addGestureRecognizer(swipeDown)
}
override func prefersStatusBarHidden() -> Bool {
return true
}
}
func swipedUp(sender: UISwipeGestureRecognizer) {
let skView = view as SKView
let gameScene = skView.scene as GameScene
gameScene.swipedUp1(sender)
}
var scene: GameScene {
let skView = view as SKView
return skView.scene as GameScene
}