Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 更改场景后节点不移动_Xcode_Swift - Fatal编程技术网

Xcode 更改场景后节点不移动

Xcode 更改场景后节点不移动,xcode,swift,Xcode,Swift,我做了一个(基本的)游戏,工作完美,进入游戏场景,当它从游戏场景回到游戏场景时,玩家(Spritode)不再移动 我在游戏场景代码中评论了它的功能 我没有从Xcode得到任何错误 该bug位于gamescene.swift文件中(功能:swipedRight+swipedLeft+swipedUp+swipedDown): gameviewcontroller文件: import UIKit import SpriteKit import AVFoundation class GameView

我做了一个(基本的)游戏,工作完美,进入游戏场景,当它从游戏场景回到游戏场景时,玩家(Spritode)不再移动

我在游戏场景代码中评论了它的功能

我没有从Xcode得到任何错误

该bug位于gamescene.swift文件中(功能:swipedRight+swipedLeft+swipedUp+swipedDown):

gameviewcontroller文件:

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
    }