SpriteKit: How to create Basic Physics Joints
Asked Answered
I

1

11

I am trying to create simple Joints between two SKPhysicsBodies. But, they are acting weirdly. I am well aware of the fact the anchor points should be on scene coordinate. Please have a look at the Source code attached.

For Example this is how a fixed Joint results after attaching a small square on a rectangle.

-(void)createFixedJointOnScene:(SKScene*)scene

{

//Adding Rectangle

    SKSpriteNode* backBone = [[SKSpriteNode alloc] initWithColor:[UIColor whiteColor] size:CGSizeMake(20, 200)];
backBone.position = CGPointMake(CGRectGetWidth(self.frame)/2.0, CGRectGetHeight(self.frame)/2.0);
backBone.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:backBone.size];
backBone.physicsBody.categoryBitMask = GFPhysicsCategoryRectangle;
backBone.physicsBody.collisionBitMask = GFPhysicsCategoryWorld;
[scene addChild:backBone];

//Adding Square
SKSpriteNode* head = [[SKSpriteNode alloc] initWithColor:[SKColor grayColor] size:CGSizeMake(40, 40)];
head.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:head.size];
head.position = CGPointMake(backBone.position.x, backBone.position.y-40);
head.physicsBody.categoryBitMask = GFPhysicsCategorySquare;
head.physicsBody.collisionBitMask = GFPhysicsCategoryWorld;
[scene addChild:head];

//Pinning Rectangle and Square
NSLog(@"Head position %@", NSStringFromCGPoint(head.position));
SKPhysicsJointFixed* pin =[SKPhysicsJointFixed jointWithBodyA:backBone.physicsBody bodyB:head.physicsBody anchor:head.position];
[self.physicsWorld addJoint:pin];

}

enter image description here

https://dl.dropboxusercontent.com/u/62559842/PhysicsTest.zip

Thank you.

Imbroglio answered 13/10, 2013 at 9:0 Comment(2)
check my example here #19342917Vicennial
@Bavan: I have used your code to joint to SpriteNodes. But it changes position of my spritenode. Can you please help me ?Nibelungenlied
I
13

Thank you Smick.. After Comparing Smick's code with mine I found out the order of these two lines are causing the issue.

head.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:head.size];
head.position = CGPointMake(backBone.position.x, backBone.position.y-40);

When I set the position of the Sprite before Setting its physics body, everything started to work correctly.

head.position = CGPointMake(backBone.position.x, backBone.position.y-40);
head.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:head.size];

Now I have attached Smick's code also to the full code and attached the link down here. Enjoy.

https://dl.dropboxusercontent.com/u/62559842/PhysicsTest_Final_Working.zip

Imbroglio answered 13/10, 2013 at 14:2 Comment(1)
This is a bug in iOS 7.0.x that was fixed in 7.1.Timid

© 2022 - 2024 — McMap. All rights reserved.