0
votes

i have a ball which is a box2d body and moves around the screen... i want to create multiple balls of similar type and they should also collide among them self..

the code i am using now is

ballcount = [[levelData objectForKey:@"ballcount"]intValue] ;

ballarray = [[NSMutableArray arrayWithCapacity:ballcount]init] ;

for (int j=0; j<ballcount; j++) {
ball = [CCSprite spriteWithFile:@"ball.png"];
[ballarray insertObject:ball atIndex:j];
[self createBallBoundingBox:(CCSprite *)[ballarray objectAtIndex:j]];
[[ballarray objectAtIndex:j]setPosition:ccp(arc4random() % 480 , arc4random() % 320)];  

[self addChild:[ballarray objectAtIndex:j]];
}

There is only one sprite appearing on the screen when i run it ? any suggestions what am i doing wrong ... it works perfectly when only one ball is there

Thanks

ok i have got the above code to work but now i am having a problem with the movement in the tick method .. the box2d shapes are moving but the CCSprite shapes are not getting attached to the box2d bodies here is my code

world->Step(dt, 10, 10);
    for(b2Body *b = world->GetBodyList(); b; b=b->GetNext()) {

        if (b->GetUserData() != NULL) {

            CCSprite *sprite = (CCSprite *)b->GetUserData();


            if ([sprite isKindOfClass:[Ball class]]) 
            {

                b2Vec2 Vel = b->GetLinearVelocity();
                float32 angle =  atan2(Vel.y, Vel.x);
                angle += -M_PI/2;

                b->SetTransform(b->GetPosition(),angle);

                sprite.position = ccp(b->GetPosition().x * PTM_RATIO,
                                      b->GetPosition().y * PTM_RATIO);

                sprite.rotation  = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());

            }   

Ok guys here is my createBoundingBox definition

-(void)createBallBoundingBox:(Ball *)ballSprite{
b2BodyDef BallBodyDef;
ballBodyDef.type = b2_dynamicBody;
ballBodyDef.position.Set(ballSprite.position.x/PTM_RATIO, ballSprite.position.y/PTM_RATIO);
ballBodyDef.userData = ballSprite;
ballBody = world->CreateBody(&ballBodyDef);


/// test circle shape on ballbody

b2CircleShape BallCircleShape;

BallCircleShape.m_radius = 10/PTM_RATIO;

// Create shape
/*
b2PolygonShape ballShape;
int num = 7;
b2Vec2 verts[] = {
    b2Vec2(0.0f / PTM_RATIO, 19.2f / PTM_RATIO),
    b2Vec2(-10.7f / PTM_RATIO, 15.2f / PTM_RATIO),
    b2Vec2(-6.7f / PTM_RATIO, -3.2f / PTM_RATIO),
    b2Vec2(-1.7f / PTM_RATIO, -18.0f / PTM_RATIO),
    b2Vec2(7.7f / PTM_RATIO, 0.5f / PTM_RATIO),
    b2Vec2(10.5f / PTM_RATIO, 14.7f / PTM_RATIO),
    b2Vec2(0.2f / PTM_RATIO, 19.0f / PTM_RATIO)     
};

ballShape.Set(verts,num);
 */
// Create shape definition and add to body

b2FixtureDef ballFixtureDef;
ballFixtureDef.shape = &ballCircleShape;
ballFixtureDef.density = 1.0f;  
ballFixtureDef.friction = 0.0f;
ballFixtureDef.restitution = 1.0f;
ballFixture = ballBody->CreateFixture(&ballFixtureDef);

b2Vec2 direction(5,2);
direction.Normalize();
float force = 1.0f;

b2Vec2 position  = ballBody->GetPosition();

//Apply linear velocity 

ballBody->ApplyLinearImpulse(force*direction,ballBody->GetPosition());

b2Vec2 Vel = ballBody->GetLinearVelocity();
float32 angle =  atan2(Vel.y, Vel.x);
angle += -M_PI/2;

ballBody->SetTransform(ballBody->GetPosition(),angle);

}

any ideas ? Let me know

Thanks a lot guys

1
i didn't found an error yet, but try using "ball" instead of "[ballarray objectAtIndex:j]" three times.JeanLuc
Ok , i have managed to get array of CCSprite displaying .. my next problem is how to simulate in tick: method ?Gaurav_soni
how did you solve the "one ball"-problem? you need to share this with us, such that this is helpful for a future reader ...JeanLuc
create a temp ccsprite Mice *tempmice = [CCSprite spriteWithFile:@"Ball.png"]; Then, add the ball at random position [tempmice setPosition:ccp(arc4random() % 460 , arc4random() % 300)]; Then add it to the layer [self addChild:tempmice]; Then i my function to create a box2d body [self createMiceBoundingBox:tempmice]; Then i add it to the array [miceArray addObject:tempmice];Gaurav_soni

1 Answers

0
votes

inside your method

[self createBallBoundingBox:(CCSprite *)[ballarray objectAtIndex:j]];
//OR NOW
[self createMiceBoundingBox:tempmice];

did you forgot to attach the Ball as UserData to your b2Body

- (void) createMiceBoundingBox: (Ball*) ball
{
    //...
    b2Body body = ...
    body.SetUserData(ball);
    //..
}

if not show us the code of the method

EDIT: if you use Mice instead of Ball make sure you update tick method to

if ([sprite isKindOfClass:[Mice class]])