【问题标题】:Xcode 7 Sprite Kit X Coordinate Off-Center in iOS SimulatorXcode 7 Sprite Kit X Coordinate Off-Center in iOS Simulator
【发布时间】:2016-01-02 17:22:59
【问题描述】:

我刚刚更新到 Xcode 7 / Swift 2,我遇到了这个问题,iOS 模拟器中 SpriteKit 中的 x 轴似乎偏离了中心。有人请尝试验证,这很简单。在 Xcode 7 中创建一个新的 SpriteKit 项目,并在 touchesBegan 方法中,在 GameScene.swift 文件中的 let location = touch.locationInNode(self) 下方添加这段代码 print(location)

然后在 iOS 模拟器(任何设备,尽管我选择 iPhone 4s)中运行它,并在查看输出结果的同时在视图中单击。 Y 轴在底部为零,但 X 轴在左侧似乎在 300 左右,并且随着您向右移动而增加。我正在为此失去理智!

整个touchesBegan 方法将如下所示:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
   /* Called when a touch begins */
    for touch in touches {
        let location = touch.locationInNode(self)
        print(location) // <-- *** ADD THIS LINE ***

        let sprite = SKSpriteNode(imageNamed:"Spaceship")
        sprite.xScale = 0.5
        sprite.yScale = 0.5
        sprite.position = location
        let action = SKAction.rotateByAngle(CGFloat(M_PI), duration:1)
        sprite.runAction(SKAction.repeatActionForever(action))
        self.addChild(sprite)
    }
}

如果你能重现它,请告诉我,为什么会这样!

【问题讨论】:

    标签: ios sprite-kit ios-simulator xcode7


    【解决方案1】:

    尝试在 GameViewController 的 viewWillLayoutSubviews() 方法中添加下一行:

    scene.size = skView.bounds.size
    

    我在scene.scaleMode = .AspectFill 行之前添加了它。这解决了问题吗?

    【讨论】:

    • 这解决了我的问题,但是样板 SpriteKit 项目模板在 viewDidLoad() 而不是 viewWillLayoutSubviews() 中有场景设置代码。虽然我的一些旧项目在viewWillLayoutSubviews() 中有它。我不确定 Xcode 是否更改了模板,或者我自己更改了它并且不记得了。但从 Xcode 7.0.1 开始,它位于 viewDidLoad() 中。但真正的问题是:为什么突然需要这个 sn-p 才能让项目模板像以前一样工作?
    • 没有。问题出在 SpriteKit 模板中。当应用调用 viewDidLoad 方法时,skView 还没有添加到主视图中,所以它的尺寸还不能访问(在viewDidLoad() 你甚至无法知道 skView 是横向还是纵向)。但是,如果您在viewWillLayoutSubviews() 中设置尺寸,您只需确保 skView 已经加载到主视图中,现在您可以获取它的尺寸。最后,我很确定您自己在旧模板中进行了更改,因为这一直是必要的。
    【解决方案2】:

    请在找到下一段代码后找到GameViewController.swift

    if let scene = GameScene(fileNamed:"GameScene") {
        // Configure the view.
        let skView = self.view as! SKView
        skView.showsFPS = true
        skView.showsNodeCount = true
    
        /* Sprite Kit applies additional optimizations to improve rendering performance */
        skView.ignoresSiblingOrder = true
    
        /* Set the scale mode to scale to fit the window */
        scene.scaleMode = .AspectFill
    
        skView.presentScene(scene)
    }
    

    所以你必须添加:

     scene.size = UIScreen.mainScreen().bounds.size
    

    行后:

    scene.scaleMode = .AspectFill
    

    这将解决您的问题。 希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 2014-11-22
      • 2012-09-13
      相关资源
      最近更新 更多