如何附加碰撞的精灵?

时间:2015-06-05 03:13:19

标签: ios swift sprite-kit game-engine game-physics

我基本上想要" sprites"当他们粘在一起时发生碰撞但是,我不想要"联合"要僵硬;我基本上希望精灵能够在彼此接触时移动。想象一下连接两个圆圈,只要它保持接触,你就可以围绕另一个圆圈移动一圈。

我发现了这个问题:How to make one body stick to another moving object in SpriteKit和许多其他资源解释了如何让精灵在碰撞时坚持下去,但他们都使用SKJoints,它们都是僵硬的并不是非常灵活。

我想另一种说法的方式就是说我想让精灵坚持下去,但我希望他们能够“滑动”#34;在彼此身上。

2 个答案:

答案 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)

如果我按照您的意图阅读您的问题,您仍然可以使用关节 - 只需创建具有反向运动学约束的动作,这些约束允许围绕接触圆的关节进行旋转和平移。

https://developer.apple.com/library/prerelease/ios/documentation/SpriteKit/Reference/SKAction_Ref/index.html#//apple_ref/doc/uid/TP40013017-CH1-SW72