【问题标题】:Simple pin joint in SpriteKit doesn't work as expectedSpriteKit 中的简单销接头无法按预期工作
【发布时间】:2017-07-24 02:07:51
【问题描述】:

我想做一个钟摆。从 SKScene 开始,一切都默认,我执行以下操作...

- (void)createSceneContents {
    self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.view.bounds];

    // object 1 is the fulcrum
    SKSpriteNode *object1 = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(5, 5)];
    [self addChild:object1];
    object1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:object1.frame.size];
    object1.physicsBody.dynamic = NO;
    object1.position = self.view.center;

    // object2 is like a broomstick, which I will pin to the fulcrum
    SKSpriteNode *object2 = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(90, 2)];
    [self addChild:object2];
    object2.anchorPoint = CGPointMake(0.0, 0.5);
    object2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:object2.frame.size];
    object2.position = self.view.center;

    // pin the physics bodies
    SKPhysicsJointPin *pinJoint = [SKPhysicsJointPin jointWithBodyA:object1.physicsBody bodyB:object2.physicsBody anchor:object1.position];
    [self.physicsWorld addJoint:pinJoint];
}

如果我不添加 pin 逻辑,支点会像预期的那样停留在场景的中间,并且扫帚柄会掉到地板上,所以我知道扫帚柄会受到重力的影响。添加引脚后,我得到了这个:

没有动作。为什么?这也不会导致任何运动......

[object2.physicsBody applyForce:CGVectorMake(0, -5)];

我预计扫帚柄会摆动和摆动,因为它固定在支点上。我已经看过关于在关节之前先定位节点的文章,但我已经做到了。我期望扫帚摆动我错了吗?我怎样才能让它这样做?

【问题讨论】:

    标签: ios objective-c sprite-kit skphysicsjoint


    【解决方案1】:

    节点 2 有错误定义的锚点,这里上传一个示例:

    Full code of example

    图片:

    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: 30, y: 0)
        node2.physicsBody = SKPhysicsBody(rectangleOf: node2Size)
        node2.physicsBody?.mass = 1.0
        self.addChild(node2)
    
    
        let a = SKPhysicsJointPin.joint(withBodyA: node.physicsBody! , bodyB: node2.physicsBody!, anchor: CGPoint(x: 0.0, y: 0.0))
        self.physicsWorld.add(a)
    

    目标-C:

    SKSpriteNode *object1 = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(5, 5)];
    [self addChild:object1];
    object1.position = self.view.center;
    object1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:object1.frame.size];
    object1.physicsBody.dynamic = NO;
    
    SKSpriteNode *object2 = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(90, 2)];
    [self addChild:object2];
    object2.position = CGPointMake(self.view.center.x+45, self.view.center.y);
    
    object2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:object2.frame.size];
    
    SKPhysicsJointPin *pinJoint = [SKPhysicsJointPin jointWithBodyA:object1.physicsBody bodyB:object2.physicsBody anchor:self.view.center];
    [self.physicsWorld addJoint:pinJoint];
    

    【讨论】:

    • 非常感谢。我发布了目标 C 翻译。 (不确定如何在不定位节点的情况下使其工作)。
    • 默认情况下,节点设置在 0,0,node2 设置在另一个位置 :)
    • 再次感谢您。它让我遇到了一个新问题,我在这里询问stackoverflow.com/questions/45259118/… 肯定会感谢任何想法。
    【解决方案2】:

    感谢@Maetschl,我能够使其在 Objective-c 中按如下方式工作(移除锚点并将摆动节点定位到一个边缘)...

    SKSpriteNode *object1 = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(5, 5)];
    [self addChild:object1];
    object1.position = self.view.center;
    object1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:object1.frame.size];
    object1.physicsBody.dynamic = NO;
    
    SKSpriteNode *object2 = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(90, 2)];
    [self addChild:object2];
    object2.position = CGPointMake(self.view.center.x+45, self.view.center.y);
    
    object2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:object2.frame.size];
    
    SKPhysicsJointPin *pinJoint = [SKPhysicsJointPin jointWithBodyA:object1.physicsBody bodyB:object2.physicsBody anchor:self.view.center];
    [self.physicsWorld addJoint:pinJoint];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      相关资源
      最近更新 更多