Swift SpriteKit 精灵移动但保留原始位置

3
使用普通的游戏应用程序设置和集成游戏玩法套件。在场景加载时,我添加了以下内容:
  self.hero = SKShapeNode.init(rectOf: CGSize.init(width: 10, height: 10), cornerRadius: 1)
    if let hero = self.hero {
        let pos = CGPoint.init(x: -50, y: -90)
        hero.lineWidth = 5
        hero.position = pos
    }

    self.addChild(self.hero!)

然后在更新函数中,我添加了:
 if let hero = self.hero {
        let moveAction = SKAction.moveTo(x: 12, duration: 1)
        hero.run(moveAction)
    }

这个程序正常运行,精灵按照预期移动,但似乎还有一个精灵在原始位置上。我错过了什么?肯定不需要在每次更新时删除并重新添加。

你如何在另一个函数中访问变量hero,你将它设为全局变量了吗?请展示所有相关代码。 - Eric
你应该添加更多的代码,特别是在调用self.addChild(self.hero!)这一行的地方。也许这行代码被多次调用,你只是复制了它(类似于重用TableViewCell时常见的错误,人们每次都会添加一个新的控件)。 - muescha
我认为只需在update函数中删除不必要的let hero = self.hero,这可能导致您的应用程序每次都重新创建hero。 - Eric
1个回答

1
这是因为你应该使用(作为“hello world”Sprite-kit游戏模板语法):
override func didMove(to view: SKView) {}

代替:
override func sceneDidLoad() {}

似乎 sceneDidLoad 会被触发两次,xCode 首先设置了场景的虚拟版本,然后是真正的场景。还有一个关于此问题的错误已经被报告。

您的代码输出

enter image description here

输出使用 didMove(to view:) 函数:

enter image description here


关于您的评论,请看这张图片(来自Xcode 8.2.1版本 - 新项目 - 游戏模板(SpriteKit)):

enter image description here


这个方法是有效的,但是我对于(作为“hello world” Sprite-kit 游戏模板语法)中的 sceneDidLoad 有点困惑,因为在模板中它是默认的。 - dragonly
根据外观来看,如果你选中了“整合GameplayKit”复选框,它将更改为sceneDidLoad。 - dragonly
希望他们在下个版本中修正sceneDidLoad这个问题。你不是第一个遇到这个问题的程序员。将它改成didMove(to view:,同样从“集成gameplaykit”模板开始,你会得到正确的结果。 - Alessandro Ornano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接