缩放SKSpriteNodes制作的钟摆

我有一个摆锤的工作时钟,但摆动臂不能正确缩放。 这是缩放前的样子

在这里输入图像说明

然后,缩放后…

在这里输入图像说明

钟面缩小,摇臂(绿线)也缩小,但它看起来像围绕它的中心点缩放,而不是在脸部中心的支点。 我可以通过设置swing的anchorPoint来解决这个问题,所以它可以扩展到一端而不是中心。

 swing.anchorPoint = CGPointMake(0, 0.5); 

但这样做会导致摆锤不摆动。 (我认为是因为物理力量被应用到摆动的anchorPoint上,如果我把它移动到一端,就是在固定的锚点上)。

我怎样才能让arm向支点伸展,并仍能摆动?

这是代码…

 // in my SKScene ClockFace *face = [ClockFace face]; // just an SKNode subclass face.name = @"face"; face.position = CGPointMake(150, 150); [self addChild:face]; // add the pendulum SKSpriteNode *fulcrum = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(5, 5)]; [face addChild:fulcrum]; fulcrum.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:fulcrum.frame.size]; fulcrum.physicsBody.dynamic = NO; SKSpriteNode *swing = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(190, 2)]; [face addChild:swing]; swing.position = CGPointMake(95, 0); swing.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:swing.frame.size]; SKPhysicsJointPin *pinJoint = [SKPhysicsJointPin jointWithBodyA:fulcrum.physicsBody bodyB:swing.physicsBody anchor:face.position]; [self.physicsWorld addJoint:pinJoint]; 

缩放的原因是奇怪的原因是你如何做你的定位点。 想象一下带有图钉的橡皮筋。 锚点是图钉的位置。 现在要扩大规模。 只要抓住橡皮筋,拉。 当图钉处于中间位置时,您会发现双面均匀拉伸很容易(这是您在y轴上所做的操作)。 当你把它放在橡皮筋的左边时,你只能伸缩右边(这是你想要做的)

现在使用PhysicsBody,您需要根据精灵锚点调整主体锚点。 要做到这一点,你需要做一些math:

 let centerPoint = CGPointMake(sprite.size.width / 2 - (sprite.size.width * sprite.anchorPoint.x), sprite.size.height / 2 - (sprite.size.height * sprite.anchorPoint.y)) sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size, center: centerPoint) 

使用centerPoint可以让你移动身体的中心。

 // in my SKScene ClockFace *face = [ClockFace face]; // just an SKNode subclass face.name = @"face"; face.position = CGPointMake(150, 150); [self addChild:face]; // add the pendulum SKSpriteNode *fulcrum = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(5, 5)]; [face addChild:fulcrum]; fulcrum.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:fulcrum.frame.size]; fulcrum.physicsBody.dynamic = NO; SKSpriteNode *swing = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(190, 2)]; [face addChild:swing]; swing.anchorPoint = CGPointMake(0,0.5); CGPoint *centerPoint = CGPointMake(swing.size.width / 2 - (swing.size.width * swing.anchorPoint.x), swing.size.height / 2 - (swing.size.height * swing.anchorPoint.y)); swing.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:swing.frame.size center:centerPoint]; SKPhysicsJointPin *pinJoint = [SKPhysicsJointPin jointWithBodyA:fulcrum.physicsBody bodyB:swing.physicsBody anchor:face.position]; [self.physicsWorld addJoint:pinJoint]; 

在这个Swift 3的例子中:

在这里输入图像说明

  let nodeSize = CGSize(width: 10, height: 10) let node = SKSpriteNode(color: .red, size: nodeSize) node.physicsBody = SKPhysicsBody(rectangleOf: nodeSize) node.physicsBody?.isDynamic = false self.addChild(node) let node2Size = CGSize(width: 60, height: 8) let node2 = SKSpriteNode(color: .green, size: node2Size) node2.position = CGPoint(x: 5, y: 0) node2.anchorPoint = CGPoint(x: 0.0, y: 0.5) // <- New Line node2.physicsBody = SKPhysicsBody(rectangleOf: node2Size) node2.physicsBody?.mass = 1.0 self.addChild(node2) // Scale Line node2.run(SKAction.repeatForever(SKAction.sequence([ SKAction.scale(to: 0.2, duration: 1.0), SKAction.scale(to: 1.5, duration: 0.5), ]))) // Anchor Point let a = SKPhysicsJointPin.joint(withBodyA: node.physicsBody! , bodyB: node2.physicsBody!, anchor: CGPoint(x: 0.0, y: 0.0)) self.physicsWorld.add(a)