【问题标题】:Sprite position not updating to where it is being moved to精灵位置未更新到要移动到的位置
【发布时间】:2018-04-04 13:51:51
【问题描述】:

由于我在 spritekit 中工作,我决定不使用 UIScrollview,因为据我所知,它很难实现。相反,根据在线研究,我决定创建一个SKNode,并将我所有的精灵添加为SKNode 的子代。从那里,在touchesMoved 函数中,我移动了我的SKNode 以复制UIScrollview。这部分工作完美。 SKNode 的所有精灵都在我滚动模拟动作的任何地方移动,但是,如果我打印出 -> print(spriteA.position),则该值不会从它的初始位置改变。当我打印出print(SKNode.position) 时,该值确实从它的初始位置发生了变化。

    blueBottle = SKSpriteNode(texture: SKTexture(imageNamed: "Bottle"), size: CGSize(width: 0.065*size.height, height: 0.2*size.height))
    blueBottle.position = CGPoint(x: 0.8*size.width, y: topShelf.position.y + 0.5*topShelf.size.height + 0.5*blueBottle.size.height)
    blueBottle.name = "Play"
    blueBottle.zPosition = Layer.ui.rawValue
    moveableNode.addChild(blueBottle)

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch: AnyObject in touches {
            let location = touch.location(in: self)
            touchPoint = location
            secondLocation = location
        }
        moveableNode.position.y =  touchPoint.y - (firstLocation.y - moveableNodePos.y)
        print(moveableNode.position.y)
        print(bluebottle.position.y)
     }

这对我来说很奇怪,因为精灵成功移动了,但是位置没有更新......我唯一能想到的是精灵没有正确附加到SKNode

【问题讨论】:

    标签: swift sprite-kit position sknode touchesmoved


    【解决方案1】:

    它工作正常,结果符合预期。

    position 是父级中的位置。所以在你的情况下,SKNode 中的精灵位置永远不会改变。

    如果我让你装一个冷却器,并说在冷却器的左边装可乐,在右边装 Coronas,你可以这样想。当我们将冷却器移到营地时,可乐在冷却器中的位置仍然相同。 ;)

    编辑

    下面是我的同一个例子

    如果我想找出可乐相对于露营地的位置,而不是冷却器,我就必须转换它。

    使用...

    convert(_:to:)convert(_:from:)

    来自苹果...

    坐标空间之间的转换 使用节点树时,有时您需要将位置从一个坐标空间转换到另一个坐标空间。例如,在物理系统中指定关节时,关节位置在场景坐标中指定。因此,如果您在局部坐标系中有这些点,则需要将它们转换为场景的坐标空间。 以下代码显示了如何将节点的位置转换为场景坐标系。要求场景执行转换。请记住,节点的位置是在其父坐标系中指定的,因此代码将 node.parent 作为要转换的节点传递。您可以通过调用convert(_:to:) 方法反向执行相同的转换。

    【讨论】:

    • 哦,好吧,这很有意义!有什么办法可以更新位置吗?
    • 主要目标是能够在我单击精灵 (touchesBegan) 时启动一个动作 -> 所以如果我的精灵从屏幕底部开始并且我将它移动到顶部,如果我在顶部单击它,它什么也不做。如果我单击它原来所在底部的空白区域,将调用该操作。奇怪的是它不会识别 spriteA.frame.position 不存在:(
    • 理论上我可以在 touchesMoved 中为我想要移动的每个精灵写一行代码——如果我有的话,这似乎是很多冗余代码——比如说 20 多个精灵一次移动.
    • 非常感谢!我想通了,现在可以正常工作了:)非常有帮助的罗恩!
    猜你喜欢
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多