【问题标题】:Sprite Kit pin joints appear to have an incorrect anchorSprite Kit 销接头的锚点似乎不正确
【发布时间】:2013-10-13 06:08:22
【问题描述】:

我正在使用 Sprite Kit 测试销接头,我发现发生了一些不寻常的事情。

我想要的设置是这样的:一个宽的扁平盒子和两个圆圈;圆圈通过 SKPhysicsPinJoints 连接到盒子,因此它们可以充当轮子。

这是我的代码。我试图让它尽可能简洁:

- (SKNode*) createWheelWithRadius:(float)wheelRadius {
    CGRect wheelRect = CGRectMake(-wheelRadius, -wheelRadius, wheelRadius*2, wheelRadius*2);

    SKShapeNode* wheelNode = [[SKShapeNode alloc] init];
    wheelNode.path = [UIBezierPath bezierPathWithOvalInRect:wheelRect].CGPath;

    wheelNode.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:wheelRadius];

    return wheelNode;
}


- (void) createCar {

    // Create the car
    SKSpriteNode* carNode = [SKSpriteNode spriteNodeWithColor:[SKColor yellowColor] size:CGSizeMake(150, 50)];
    carNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:carNode.size];
    carNode.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    [self addChild:carNode];

    // Create the left wheel
    SKNode* leftWheelNode = [self createWheelWithRadius:30];
    leftWheelNode.position = CGPointMake(carNode.position.x-80, carNode.position.y);
    [self addChild:leftWheelNode];

    // Create the right wheel
    SKNode* rightWheelNode = [self createWheelWithRadius:30];
    rightWheelNode.position = CGPointMake(carNode.position.x+80, carNode.position.y);
    [self addChild:rightWheelNode];

    // Attach the wheels to the body
    CGPoint leftWheelPosition = leftWheelNode.position;
    CGPoint rightWheelPosition = rightWheelNode.position;

    SKPhysicsJointPin* leftPinJoint = [SKPhysicsJointPin jointWithBodyA:carNode.physicsBody bodyB:leftWheelNode.physicsBody anchor:leftWheelPosition];
    SKPhysicsJointPin* rightPinJoint = [SKPhysicsJointPin jointWithBodyA:carNode.physicsBody bodyB:rightWheelNode.physicsBody anchor:rightWheelPosition];

    [self.physicsWorld addJoint:leftPinJoint];
    [self.physicsWorld addJoint:rightPinJoint];
}

我期望的是销接头固定在它们的中心点;但是,当我对此进行测试时,关节的锚点似乎很远。

我是否遗漏了一些非常明显的东西?

【问题讨论】:

    标签: ios objective-c sprite-kit


    【解决方案1】:

    我也有这个问题,原因是在设置精灵位置之前设置物理体。

    carNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:carNode.size];
    carNode.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    

    把上面改成

    carNode.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    carNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:carNode.size];
    

    它应该工作。谢谢斯米克。

    SpriteKit: How to create Basic Physics Joints

    【讨论】:

    • 不错的小例子,在您的 TVC 中,您可以注释掉 numberOfSectionsInTableView,而对于 numberOfRowsInSection,只需使用 [_dataSourceArray count]。这是一个很好的例子,你应该添加 [head.physicsBody applyTorque:0.2];到销连接才能真正显示出它与固定连接的区别。干得好 - 感谢分享。
    • 谢谢 Smick.. 我更新了示例。但是,TVC 是这样编码的,因为它有两个部分。我无法将您的汽车示例添加为联合类型。 :) 该示例被放入不同的部分。
    • 我现在看不到示例中的汽车,仍然只有关节列表。我会将我所有的测试代码放入 TVC - 好主意!
    • @Bavan:我已经使用您的代码连接到 SpriteNodes。但它改变了我的 spritenode 的位置。你能帮帮我吗?
    【解决方案2】:

    试试这段代码,我用了你的,遇到了奇怪的问题,所以从头开始。

    - (SKShapeNode*) makeWheel
    {
        SKShapeNode *wheel = [[SKShapeNode alloc] init];
        CGMutablePathRef myPath = CGPathCreateMutable();
        CGPathAddArc(myPath, NULL, 0,0, 16, 0, M_PI*2, YES);
        wheel.path = myPath;
        return wheel;
    }
    
    
    - (void) createCar 
    {
    
        self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(0, 0, self.size.width, self.size.height)];
    
        // 1. car body
        SKSpriteNode *carBody = [SKSpriteNode spriteNodeWithColor:[UIColor whiteColor] size:CGSizeMake(120, 8)];
        carBody.position = CGPointMake(200, 200);
        carBody.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:carBody.size];
        [self addChild:carBody];
    
        // 2. wheels
        SKShapeNode *leftWheel = [self makeWheel];
        leftWheel.position = CGPointMake(carBody.position.x - carBody.size.width / 2, carBody.position.y);
        leftWheel.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:16];
        [self addChild:leftWheel];
    
        SKShapeNode *rightWheel = [self makeWheel];
        rightWheel.position = CGPointMake(carBody.position.x + carBody.size.width / 2, carBody.position.y);
        rightWheel.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:16];
        [self addChild:rightWheel];
    
        // 3. Join wheels to car
        [self.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:carBody.physicsBody bodyB:leftWheel.physicsBody anchor:leftWheel.position]];
        [self.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:carBody.physicsBody bodyB:rightWheel.physicsBody anchor:rightWheel.position]];
    
        // 4. drive car
        [carBody.physicsBody applyForce:CGVectorMake(10, 0)];
    }
    

    【讨论】:

    • 非常感谢!我将 Bavan 的答案标记为正确,因为它更简洁,更容易让未来的读者理解,但您首先提供了正确的解决方案。
    • @DogCoffee:我已经使用您的代码连接到 SpriteNodes。但它改变了我的 spritenode 的位置。你能帮帮我吗?
    • @Nirav 我建议你发布一个新问题。我有一段时间没有使用精灵套件了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2016-09-18
    相关资源
    最近更新 更多