Box2d: 2-Add to world

来源:互联网 发布:安卓 卸载 知乎 编辑:程序博客网 时间:2024/05/16 10:27

Adding Boxes to the Box2D World 

Listing 12–4.Adding a New Dynamic Body with a Sprite

-(void) addNewSpriteAt:(CGPoint)pos

{
CCSpriteBatchNode* batch = 
(CCSpriteBatchNode*) [self getChildByTag:kTagBatchNode];

int idx = CCRANDOM_0_1() * TILESET_COLUMNS;
int idy = CCRANDOM_0_1() * TILESET_ROWS;
CGRect tileRect = CGRectMake(TILESIZE * idx, TILESIZE * idy, TILESIZE, TILESIZE);

CCSprite* sprite = [CCSpritespriteWithBatchNode:batch rect:tileRect];sprite.position = pos;
[batch addChild:sprite];

// Create a body definition and set it to be a dynamic body

b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position = [self toMeters:pos];

bodyDef.userData = sprite;

b2Body* body = world->CreateBody(&bodyDef);

// Define a box shape and assign it to the body fixture

b2PolygonShape dynamicBox;
float tileInMeters = TILESIZE / PTM_RATIO;

dynamicBox.SetAsBox(tileInMeters * 0.5f, tileInMeters * 0.5f);

b2FixtureDef fixtureDef;

fixtureDef.shape = &dynamicBox;

fixtureDef.density = 0.3f;

fixtureDef.friction = 0.5f;

fixtureDef.restitution =0.6f;

body->CreateFixture(&fixtureDef);



Connecting Sprites with Bodies 

Listing 12–5. Updating Each Body’s Sprite Position and Rotation

-(void) update:(ccTime)delta{

// Advance the physics world by one step, using fixed time steps

float timeStep = 0.03f;
int32 velocityIterations = 8;
int32 positionIterations = 1;

world->Step(timeStep, velocityIterations, positionIterations);

for (b2Body* body = world->GetBodyList(); body != nil; body = body->GetNext()) {

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

if (sprite!= NULL) {

sprite.position = [self toPixels:body->GetPosition()];float angle = body->GetAngle();
sprite.rotation = CC_RADIANS_TO_DEGREES(angle) *-1;

}

}


Collision Detection 

Box2D has a b2ContactListener class, which you are supposed to subclass if you wantto receive collision callbacks. 

Listing 12–6. The ContactListener Class’s Interface#import "Box2D.h"

class ContactListener : public b2ContactListener{
private:

void BeginContact(b2Contact* contact);

void EndContact(b2Contact* contact);

}; 

Listing 12–7. Checking for the Beginning and Ending of Collisions#import "ContactListener.h"

#import "cocos2d.h"

void ContactListener::BeginContact(b2Contact* contact){

b2Body* bodyA = contact->GetFixtureA()->GetBody();

b2Body* bodyB = contact->GetFixtureB()->GetBody();

CCSprite* spriteA = (CCSprite*)bodyA->GetUserData();

CCSprite* spriteB = (CCSprite*)bodyB->GetUserData();

if (spriteA != NULL && spriteB != NULL){

spriteA.color = ccMAGENTA;

spriteB.color = ccMAGENTA;

}

}

void ContactListener::EndContact(b2Contact* contact) { ... }

Set  the contact listener for the world:

contactListener = new ContactListener();

world->SetContactListener(contactListener); 



















0 0
原创粉丝点击