Burrito411
Burrito411

Reputation: 431

Is there a way to make a SKSpriteNode's rotation parallel to another SKSpriteNode's physics body?

Just what it says in the title, is there any way to do this kind of thing:

SKSpriteNode parallel

Is there any way to do this? If so, how would I correspond the SKAction rotateToAngle to the side facing the circle?

Thanks!

Upvotes: 1

Views: 411

Answers (2)

CodeSmile
CodeSmile

Reputation: 64477

Very easy: add the rectangle sprite (it should not have a physics body of its own, though you could try to see if it works with a static body) as child node to the circle sprite with the physics body. Change the rectangle sprite's position to be offset from the center of its parent node, ie {100, 0} to put the circle node 100 points away from the center.

As the circle sprite & body rotate, the rectangle sprite will move and rotate along with it.

Upvotes: 0

jscs
jscs

Reputation: 64002

The tangent of a circle at any given point is perpendicular to a radius drawn to that point. Consider the two nodes as being in a polar coordinate system, with the origin at the center of the circle. You can convert the square's cartesian coordinates (at its center) to polar and find the angle of the proper radius:

void cartopol(CGFloat x, CGFloat y, CGFloat *radius, CGFloat *theta)
{
    *radius = sqrt(x*x, y*y);
    *theta = atan2(y, x);
}

(This could instead return a CGPoint if you prefer that to using out parameters, as I'll do below for the complementary function; the arithmetic is the important point.)

theta will be in radians; add or subtract π/4 to rotate it by 90˚.

To move the square around the circle, pick the angle and radius you want and convert from polar to cartesian:

CGPoint poltocar(CGFloat radius, CGFloat theta)
{
    return (CGPoint){radius * cos(theta), radius * sin(theta)};
}

Upvotes: 1

Related Questions