void Box2DTestLayer::addNewSpriteAtPosition(CCPoint p) { CCLOG("Add sprite %0.2f x %02.f",p.x,p.y); CCNode* parent = getChildByTag(kTagParentNode); //We have a 64x64 sprite sheet with 4 different 32x32 images. The following code is //just randomly picking one of the images int idx = (CCRANDOM_0_1() > .5 ? 0:1); int idy = (CCRANDOM_0_1() > .5 ? 0:1); PhysicsSprite *sprite = new PhysicsSprite(); sprite->initWithTexture(m_pSpriteTexture, CCRectMake(32 * idx,32 * idy,32,32)); sprite->autorelease(); parent->addChild(sprite); sprite->setPosition( CCPointMake( p.x, p.y) ); // Define the dynamic body. //Set up a 1m squared box in the physics world b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO); b2Body *body = world->CreateBody(&bodyDef); // Define another box shape for our dynamic body. b2PolygonShape dynamicBox; dynamicBox.SetAsBox(.5f, .5f);//These are mid points for our 1m box // Define the dynamic body fixture. b2FixtureDef fixtureDef; fixtureDef.shape = &dynamicBox; fixtureDef.density = 1.0f; fixtureDef.friction = 0.3f; body->CreateFixture(&fixtureDef); sprite->setPhysicsBody(body); }
void HelloWorld::addNewSpriteAtPosition(CCPoint p) { CCLOG("Add sprite %0.2f x %02.f",p.x,p.y); CCNode* parent = getChildByTag(kTagParentNode); //We have a 64x64 sprite sheet with 4 different 32x32 images. The following code is //just randomly picking one of the images int idx = (CCRANDOM_0_1() > .5 ? 0:1); int idy = (CCRANDOM_0_1() > .5 ? 0:1); PhysicsSprite *sprite = new PhysicsSprite(); sprite->initWithTexture(m_pSpriteTexture, CCRectMake(32 * idx,32 * idy,32,32)); sprite->autorelease(); parent->addChild(sprite); sprite->setPosition( CCPointMake( p.x, p.y) ); sprite->setOpacity(32); // Define the dynamic body. //Set up a 1m squared box in the physics world b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO); b2Body *body = world->CreateBody(&bodyDef); // Define another box shape for our dynamic body. b2PolygonShape dynamicBox; dynamicBox.SetAsBox(.5f, .5f);//These are mid points for our 1m box // Define the dynamic body fixture. b2FixtureDef fixtureDef; fixtureDef.shape = &dynamicBox; fixtureDef.density = 1.0f; fixtureDef.friction = 0.3f; body->CreateFixture(&fixtureDef); sprite->setPhysicsBody(body); // Create a rope joint so that the // block will "swing" from the top of the // scene. // Calculate the local position of the // top of screen in the local space // of the ground box. CCSize scrSize = CCDirector::sharedDirector()->getWinSize(); b2Vec2 groundWorldPos = b2Vec2((scrSize.width/2)/PTM_RATIO,(scrSize.height)/PTM_RATIO); b2Vec2 groundLocalPos = m_pGround->GetLocalPoint(groundWorldPos); // Now create the main swinging joint. b2RopeJointDef jointDef; jointDef.bodyA = m_pGround; jointDef.bodyB = body; jointDef.localAnchorA = groundLocalPos; jointDef.localAnchorB = b2Vec2(0.0f,0.0f); jointDef.maxLength = (groundWorldPos-body->GetWorldCenter()).Length(); jointDef.collideConnected = true; world->CreateJoint(&jointDef); // Now create a second/third rope to "constrain" the swing. // These one will be attached to the side of the screen. b2Vec2 groundWorldPos2 = b2Vec2(0,body->GetWorldCenter().y); b2Vec2 groundLocalPos2 = m_pGround->GetLocalPoint(groundWorldPos2); jointDef.localAnchorA = groundLocalPos2; // Setting the length of the side rope... // What we want to do here is use the distance from the center as // the length of the rope. Then add length to it so that the box // can have at least one full swing which ever side it is on (left or // right half of the scene). float32 distToCenter = (fabs(scrSize.width/2 - (body->GetWorldCenter().x)*PTM_RATIO))/PTM_RATIO; jointDef.maxLength = distToCenter + (scrSize.width/2)/PTM_RATIO; world->CreateJoint(&jointDef); // Now for the last rope, other side of the scene. // Now create a second/third rope to "constrain" the swing. // These one will be attached to the side of the screen. b2Vec2 groundWorldPos3 = b2Vec2((scrSize.width)/PTM_RATIO,body->GetWorldCenter().y); b2Vec2 groundLocalPos3 = m_pGround->GetLocalPoint(groundWorldPos3); jointDef.localAnchorA = groundLocalPos3; world->CreateJoint(&jointDef); }