0
\$\begingroup\$

I've started trying a few things with Sprite Kit for Game Development. I was creating a brick breaking game. So I've run into a issue on how to randomize the initial starting direction of the ball.

I set the following properties for my ball which launches from the paddle.

ball.physicsBody.friction = 0;
ball.physicsBody.linearDamping = 0;
ball.physicsBody.restitution = 1 ; //energy lost on impact or bounciness

To start at different direction during the gameplay, I've randomized the selection of the 4 vectors because I'm using the applyImpulse method to direct the ball in a particular direction and I need to make sure the ball does not go slow if the vector values are low.

int initialDirection = arc4random()%10;
CGVector myVector;

if(initialDirection < 2)
{
    myVector = CGVectorMake(4, 7);
}
else if(initialDirection >3 && initialDirection <= 6)
{
    myVector = CGVectorMake(-7, -5);
}
else if(initialDirection >6 && initialDirection <= 8)
{
     myVector = CGVectorMake(-5, -8);
}
else
{
     myVector = CGVectorMake(8, 5);
}
//apply the vector
[ball.physicsBody applyImpulse:myVector];

Is there any way I can randomize the direction and still maintain a speed for my ball ?

\$\endgroup\$

1 Answer 1

2
\$\begingroup\$

You could instead get a random angle (within some range) and then use that for the initial direction of the ball. Something like:

// min angle: 10, max angle: 170
int min_angle = 10;
int max_angle = 170;
int degrees = arc4random_uniform(max_angle - min_angle) + min_angle;
float radians = degrees * M_PI/180.0f;
myVector = CGVectorMake(cos(radians), sin(radians));

This will be a unit direction vector though, so, you would want to multiply this by whatever amount of force you want in this direction.

\$\endgroup\$
1
  • 2
    \$\begingroup\$ Shouldn't that be arc4random_uniform(max_angle -min_angle) +min_angle? This way if arc4random gives 170 (the maximum), you'd add 10 to it and get 180, which is > max_angle. \$\endgroup\$
    – uliwitness
    Commented Nov 14, 2014 at 1:01

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .