我基本上想要" sprites"当他们粘在一起时发生碰撞但是,我不想要"联合"要僵硬;我基本上希望精灵能够在彼此接触时移动。想象一下连接两个圆圈,只要它保持接触,你就可以围绕另一个圆圈移动一圈。
我发现了这个问题:How to make one body stick to another moving object in SpriteKit和许多其他资源解释了如何让精灵在碰撞时坚持下去,但他们都使用SKJoints,它们都是僵硬的并不是非常灵活。
我想另一种说法的方式就是说我想让精灵坚持下去,但我希望他们能够“滑动”#34;在彼此身上。
答案 0 :(得分:0)
好吧,我可以想到一个解决方法,但这不适用于非普通多边形。
用你的圆圈示例粘贴(双关语),如果你锁定圆圈的位置怎么办?
let circle1 = center circle
let circle2 = movable circle
知道两个圆的宽度,您可以在更新函数中放置该位置应该恰好是以下距离:
((circle1.frame.width / 2) + (circle2.frame.width / 2))
如果您愿意,可以使用以下代码来帮助您。
override func update(currentTime: CFTimeInterval) {
{
let distance = hypotf(Float(circle1.position.x - circle2.position.x), Float(circle1.position.y - circle2.position.y))
//calculate circle distances from each other
let radius = ((circle1.frame.width / 2) + (circle2.frame.width / 2))
//distance of circle positions
if distance != radius
{
//if distance is less or more than radius
let pointA = circle1.position
let pointB = circle2.position
let pointC = CGPointMake(pointB.x + 2, pointB.y)
let angle_ab = atan2(pointA.y - pointB.y, pointA.x - pointB.x)
let angle_cb = atan2(pointC.y - pointB.y, pointC.x - pointB.x)
let angle_abc = angle_ab - angle_cb
//get angle of circles from each other using atan2
let vectorx = cos(angle_abc)
let vectory = sin(angle_abc)
//convert angle into vectors
let x = circle1.position.x + radius * vectorx
let y = circle1.position.y + radius * vectory
//get new coordinates from vector, radius and center circle position
circle2.position = CGPointMake(x, y)
//set new position
}
}
你需要编写代码以确保可移动的圆圈可以很好地移动。 但是,应该工作。
我还没有测试过这个,但我还没有学过几何学,更不用说学校里的三角形了。
答案 1 :(得分:0)
如果我按照您的意图阅读您的问题,您仍然可以使用关节 - 只需创建具有反向运动学约束的动作,这些约束允许围绕接触圆的关节进行旋转和平移。