Box2D中RevoluteJoint的(快速)SpriteKit等价物是什么

时间:2015-04-15 12:41:47

标签: ios swift sprite-kit box2d

我只想创建两个具有相同轴的圆,并使一个圆由触摸事件控制。 在java中,我只需创建两个实体和一个RevoluteJoint即可。 我是iOS开发的新手(所以我只学习了Swift),我想用SpriteKit做同样的事情

我写了这个,但似乎我需要自己管理触摸事件。是不是有一个'可抓取的身体'选项,所以我不必自己做所有的计算,使轮子跟随用户的手指,但只是旋转。

override func didMoveToView(view: SKView) {

    /* Setup your scene here */
    inner=SKSpriteNode(imageNamed:"inner")
    outer=SKSpriteNode(imageNamed:"outer")

    inner.physicsBody=SKPhysicsBody(circleOfRadius: inner.frame.size.width/2)
    inner.physicsBody!.dynamic=true
    inner.physicsBody!.allowsRotation=true

    outer.physicsBody=SKPhysicsBody(circleOfRadius: outer.frame.size.width/2)

    physicsWorld.gravity=CGVectorMake(0, 0)

    addChild(inner)
    addChild(outer)

    var joint1=SKPhysicsJointPin.jointWithBodyA(inner.physicsBody, bodyB: outer.physicsBody, anchor: CGPoint(x: 0, y: 0))

    physicsWorld.addJoint(joint1)
}

1 个答案:

答案 0 :(得分:0)

我最终创建了一个伪MouseJoint,如下所示:

didMoveToView 中,我初始化了一个非,它不会与任何其他身体互动

    target=SKShapeNode(circleOfRadius: 10.0);
    target.fillColor=UIColor.clearColor();
    target.strokeColor=UIColor.clearColor();
    target.name="target";

    target.physicsBody=SKPhysicsBody(circleOfRadius: 10.0);
    target.physicsBody!.dynamic=true;
    target.physicsBody!.collisionBitMask=0;
    target.physicsBody!.contactTestBitMask=0;
    target.physicsBody!.density=20000.0;

然后我按如下方式听鼠标事件

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    let touch=touches.first as! UITouch
    let location=touch.locationInNode(self)
    let prev_location=touch.previousLocationInNode(self)
    let node=self.nodeAtPoint(location);

    addChild(target);

    target.position=location;
    target.zPosition=node.zPosition+1;

    mouseJoint=SKPhysicsJointSpring.jointWithBodyA(target.physicsBody!, bodyB: node.physicsBody!, anchorA: location, anchorB: prev_location)


    physicsWorld.addJoint(mouseJoint);
}

override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {


    let touch=touches.first as! UITouch
    let location=touch.locationInNode(self)

    target.position.x=location.x;
    target.position.y=location.y;



    }

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {

    mouseJoint.bodyB.velocity=CGVector(dx:0, dy:0);
    mouseJoint.bodyB.angularVelocity=0;
    physicsWorld.removeJoint(mouseJoint);
        target.removeFromParent();

}

由于我的其他身体被固定,旋转是唯一可能的动作。

由于SpriteKit中没有弹簧关节的“静止长度”,所以让一个球比你想要旋转的身体重得多是至关重要的,否则,平衡点将不是最后的触摸位置。