Can you help. Want to draw a polygon (beams at different angles) and apply box 2d body to it. Can you please let me know how to create a CCSprite with a polygon shape Any examples would help Cheers
3 Answers
2
votes
Create Polygon body.
-(void) createDynamicPoly { b2BodyDef bodyDefPoly; bodyDefPoly.type = b2_dynamicBody; bodyDefPoly.position.Set(3.0f, 10.0f); b2Body *polyBody = world->CreateBody(&bodyDefPoly); int count = 8; b2Vec2 vertices[8]; vertices[0].Set(0.0f / PTM_RATIO,0.0f / PTM_RATIO); vertices[1].Set(48.0f/PTM_RATIO,0.0f/PTM_RATIO); vertices[2].Set(48.0f/PTM_RATIO,30.0f/PTM_RATIO); vertices[3].Set(42.0f/PTM_RATIO,30.0f/PTM_RATIO); vertices[4].Set(30.0f/PTM_RATIO,18.0f/PTM_RATIO); vertices[5].Set(18.0f/PTM_RATIO,12.0f/PTM_RATIO); vertices[6].Set(6.0f/PTM_RATIO,18.0f/PTM_RATIO); vertices[7].Set(0.0f/PTM_RATIO,30.0f/PTM_RATIO); b2PolygonShape polygon; polygon.Set(vertices, count); b2FixtureDef fixtureDefPoly; fixtureDefPoly.shape = &polygon; fixtureDefPoly.density = 1.0f; fixtureDefPoly.friction = 0.3f; polyBody->CreateFixture(&fixtureDefPoly); }Create your sprite
Attach your sprite to the Polygon body via Fixture and UserData
fixtureDefPoly.SetUserData() = spriteObject; b2Fixture *fixture; fixture = circleBody->CreateFixture(&fixtureDefPoly); fixture->SetUserData(@"spriteObject");Then Iterate the sprite to the body in your update method.
0
votes
0
votes
CGPoint startPt = edge.start ;
CGPoint endpt = edge.end ;
//length of the stick body
float len = abs(ccpDistance(startPt, endpt))/PTM_RATIO;
//to calculate the angle and position of the body.
float dx = endpt.x-startPt.x;
float dy = endpt.y-startPt.y;
//position of the body
float xPos = startPt.x+dx/2.0f;
float yPos = startPt.y+dy/2.0f;
//width of the body.
float width = 1.0f/PTM_RATIO;
b2BodyDef bodyDef;
bodyDef.position.Set(xPos/PTM_RATIO, yPos/PTM_RATIO);
bodyDef.angle = atan(dy/dx);
NSLog([NSString stringWithFormat:@"Setting angle %f",bodyDef.angle]);
CCSprite *sp = [CCSprite spriteWithFile:@"material-wood.png" rect:CGRectMake(0, 0, 12, 12)];
//TODO: fix shape
[self addChild:sp z:1 ];
bodyDef.userData = sp;
bodyDef.type = b2_dynamicBody;
b2Body* body = world->CreateBody(&bodyDef);
b2PolygonShape shape;
b2Vec2 rectangle1_vertices[4];
rectangle1_vertices[0].Set(-len/2, -width/2);
rectangle1_vertices[1].Set(len/2, -width/2);
rectangle1_vertices[2].Set(len/2, width/2);
rectangle1_vertices[3].Set(-len/2, width/2);
shape.Set(rectangle1_vertices, 4);
b2FixtureDef fd;
fd.shape = &shape;
fd.density = 1.0f;
fd.friction = 0.300000f;
fd.restitution = 0.600000f;
body->CreateFixture(&fd);