gpt4 book ai didi

swift - SKCameraNode.position didSet 在使用 SKAction 移动时不会被触发

转载 作者:可可西里 更新时间:2023-11-01 02:08:53 29 4
gpt4 key购买 nike

我有一个 SKCameraNode 的简单子(monad)类,我称之为 InteractiveCameraNode。现在它非常简单:我需要在我的相机位置改变时发生一些事情。这是我所做的:

class InteractiveCameraNode: SKCameraNode {
// MARK: - Properties
var enableInteraction = true
var positionResponders = [(CGPoint, CGPoint) -> Void]()


/// Calls every closure in the `positionResponders` array
override var position: CGPoint {
didSet {
if enableInteraction {
for responder in positionResponders {
responder(oldValue, position)
}
}
}
}
}

由于相机移动时我可能会发生多种情况,因此我有一个闭包数组,当相机的位置发生变化时会调用这些闭包。到目前为止,一切正常,除了 didSet 如果我使用 Action 移动相机,观察者不会被调用。如果我在相机上使用约束使其跟踪一个节点,然后通过一个 Action 移动该节点,它就可以工作。如果我用手移动相机,它就可以工作。为什么它不适用于 Action ?

最佳答案

我之前的回答 100% 不正确。导致我得出这个答案的是我的其他错误,我深表歉意。我今天也学到了一些有用的东西:)

看起来您看到的行为要么是 A) 错误,要么是 B) 我不理解的 Swift/SK 的一些更深层次的机制。

这是一个在 Playground 上对我有用的解决方法:

class Noder: SKSpriteNode {

var myPosition: CGPoint = CGPoint.zero { didSet { print(position) } }

func initialize(scene: SKScene) {
isUserInteractionEnabled = true
scene.addChild(self)
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
position = touches.first!.location(in: self.scene!)
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
print(self.position)
run(.moveBy(x: -35, y: 0, duration: 0.5), completion: {
self.myPosition = self.position
})
}
}

使用:

// In didmovetoview:
let node = Noder(color: .black, size: CGSize(width: 25, height: 25))
node.initialize(scene: self)

输出,显示实际位置已从 Action 和didSet更新:

(50.0, -118.0)
(14.9999971389771, -118.0)


但这对于您想要的可能太慢了,所以您最好在 update() 中手动设置 positionmyPosition > 每一帧(无论哪一个都适用于 didSet 哈哈..)

(本段归功于混淆)。


此外,我想知道 KVO 是否可以在这里工作。我没有使用过它们,但 CameraNode 已经是一个 NSObject 了……可能需要研究一下,因为这可能是某种错误……

关于swift - SKCameraNode.position didSet 在使用 SKAction 移动时不会被触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41601001/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com