My scene has a bunch of rectangles with physics bodies that are the same size as the rectangle. I like to anchor all of my objects to CGPointZero, however I've noticed when I do that the physicsbody remains anchored in the middle. In other words, the position of my physics body is like 100 pixels lower and to the left of the visual representation.
Here is a simple snippet of code:
SKSpriteNode* square = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size:CGSizeMake(width, height)];
square.anchorPoint = CGPointZero; //position based on bottom-left corner
square.position = CGPointMake(x, y);
square.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(width, height)];
Any ideas or advice to solving this problem would be appreciated. For example, if I could visualize the physics bodies, that might help, but I'm not sure how to.
UPDATE: So I've solved the problem by simply not setting the anchor point and repositioning my rectangles. So the problem still exists, but I have a work around in place and the work around is working well.
Swift 4.1
let centerPoint = CGPoint(x: house1.size.width / 2 - (house1.size.width * house1.anchorPoint.x), y: house1.size.height / 2 - (house1.size.height * house1.anchorPoint.y))
house1.physicsBody = SKPhysicsBody(rectangleOf: house1.size, center: centerPoint)
You can use
should transform the bounding box according to the anchorPoint of the parents node
I wrote this to fix Apple's lack thereof:
use
pathForRectangleOfSize:withAnchorPoint:
to replace your call tobodyWithRectangleOfSize:
whose brief documentation tells us the problem: "Creates a rectangular physics body centered on the owning node’s origin."Edit: There is a new API in 7.1 to provide for this oversight.
I have run in to this myself when using SpriteKit. Unfortunately there appears to be issues based on the timing of creating a physics body and actually adding the node to the scene. If you swap the order from your code and ensure you don't do ANY physics changes until the node is actually in the render tree, that should resolve the 'weirdness' and everything will be all gravy.
You need the anchorPoint only when you set your spriteNode's position. I don't quite understand why would you need to move physicsBody (which is the same size of node, I presume) to a corner... But you might find useful this class method [SKPhysicsBody bodyWithPolygonFromPath:path].
Here is a nice generator for that: http://dazchong.com/spritekit/
I am using Swift but the
SKPhysicsBody
was kind of half width and height wrong. I am using anchor point(0,0). Then I used the method withrectangleOfSize
,center
:I hope it works for you too guys...thanks !