Tista81
Tista81

Reputation: 136

arc4random sign

Why this code don't work?

-(void)tick:(ccTime)dt
   {
    ......

    float impulse =  - (arc4random() % 2500) ;

    cpBody *body = cpShapeGetBody(player.shape);

    cpBodyApplyImpulse(body, cpv( 0 , impulse), cpv(0,0));

    .....

    }

and this code work??

 -(void)tick:(ccTime)dt
    {
    ......

    float impulse =  arc4random() % 2500 ;

    cpBody *body = cpShapeGetBody(player.shape);

    cpBodyApplyImpulse(body, cpv( 0 ,(- impulse)), cpv(0,0));

    .....

    }

I dont really understand why if I change sign of "impulse" in different place, the code work or don't work correctly. Is a problem related to arc4random function??

there are "impulse" values in first code....

2013-04-09 18:28:31.697 ProvaCocos2D[7086:907] impulse 4294967296.000000
2013-04-09 18:28:31.864 ProvaCocos2D[7086:907] impulse 4294966016.000000
2013-04-09 18:28:32.197 ProvaCocos2D[7086:907] impulse 4294966016.000000
2013-04-09 18:28:33.197 ProvaCocos2D[7086:907] impulse 4294966272.000000
2013-04-09 18:28:33.864 ProvaCocos2D[7086:907] impulse 4294964992.000000
2013-04-09 18:28:34.197 ProvaCocos2D[7086:907] impulse 4294967296.000000
2013-04-09 18:28:35.197 ProvaCocos2D[7086:907] impulse 4294967040.000000
2013-04-09 18:28:35.531 ProvaCocos2D[7086:907] impulse 4294966528.000000

in the second, that work:

2013-04-09 19:05:38.492 ProvaCocos2D[7158:907] impulse 1712.000000
2013-04-09 19:05:38.994 ProvaCocos2D[7158:907] impulse 2365.000000
2013-04-09 19:05:39.320 ProvaCocos2D[7158:907] impulse 630.000000
2013-04-09 19:05:39.486 ProvaCocos2D[7158:907] impulse 331.000000
2013-04-09 19:05:40.153 ProvaCocos2D[7158:907] impulse 2268.000000
2013-04-09 19:05:40.486 ProvaCocos2D[7158:907] impulse 2166.000000

Can anyone explain me? I use XCode 4.6 and cocos2d 2.0

Thanks

Upvotes: 1

Views: 135

Answers (1)

Martin R
Martin R

Reputation: 539735

arc4random() returns an uint32_t (aka unsigned int), therefore

- (arc4random() % 2500)

is computed as unsigned integer, giving some large number in the range

2^32 - 2500 ... 2^32 - 1

which is then converted to a float. If you change your code to

float impulse =  - (int)(arc4random() % 2500) ;

then you get the expected results.

Upvotes: 2

Related Questions