我只想创建两个具有相同轴的圆,并使一个圆由触摸事件控制。 在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)
}
答案 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中没有弹簧关节的“静止长度”,所以让一个球比你想要旋转的身体重得多是至关重要的,否则,平衡点将不是最后的触摸位置。