现在我正在通过SKSpriteNode
更改它的位置来移动func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
。
我的问题是,当我移动SpriteNode时,SKPhysicsBody
的速度不会改变。因此,当SpriteNode
确实与另一个SKSpriteNode
发生冲突时,第二个SpriteNode
只会被推到并且不会像您期望的那样真正反弹。
无论如何要解决这个问题?我已经在考虑手动将速度应用到func didBegin(_ contact: SKPhysicsContact)
上的第二个SpriteNode,但我对这种解决方案并不满意。
谢谢!
答案 0 :(得分:1)
一般来说,在SpriteKit中你应该避免将基于物理的运动与直接运动混合在一起。通过基于物理的运动,我的意思是通过施加力/脉冲或直接设置其力度属性来移动节点的物理体。通过直接移动,我的意思是直接设置其位置属性(听起来像你在做)或使用像SKAction
这样的moveTo:duration:
。
因此,如果您已经使用物理移动节点,则应继续使用物理移动它而不是直接改变其移动。或者,如果您仅使用直接移动移动节点,然后想要查找有关其速度的信息(例如您的速度),则必须编写自己的计算以确定对象在帧之间移动的距离。这是因为物理引擎没有执行对象的移动。
当然,您不必遵循这种做法。但是你可能会遇到类似你遇到过的问题。
另外一点是,如果你想检测两个节点是否相互接触 - 但是不相互碰撞 - 那么可以在物理机构上使用直接移动。但在你的情况下,听起来你正在处理碰撞的物体,所以我建议坚持使用一种方法或另一种保持整洁。