Cocos2d-x初学指南(八): Box2D 简单实例(世界创建,边界创建,绑定精灵)

Cocos2d-x初学指南(8): Box2D 简单实例(世界创建,边界创建,绑定精灵)

世界创建

b2Vec2 gravity(0.0f,-10.0f); 
		world=new b2World(gravity);
		world->SetAllowSleeping(true);
		world->SetContinuousPhysics(true);


边界创建

//world box
		b2BodyDef groundBodyDef;
		groundBodyDef.position.SetZero();
		//create body
		b2Body *groundBody=world->CreateBody(&groundBodyDef);
		//create Edges
		b2EdgeShape groundBox;;
		groundBox.Set(b2Vec2(0,0),b2Vec2(winSize.width/PTM_RATIO,0));
		groundBody->CreateFixture(&groundBox,0);
		groundBox.Set(b2Vec2(0,0),b2Vec2(0,winSize.height/PTM_RATIO));
		groundBody->CreateFixture(&groundBox,0);
		groundBox.Set(b2Vec2(0,winSize.height/PTM_RATIO),b2Vec2(winSize.width/PTM_RATIO,winSize.height/PTM_RATIO));
		groundBody->CreateFixture(&groundBox,0);
		groundBox.Set(b2Vec2(winSize.width/PTM_RATIO,winSize.height/PTM_RATIO),b2Vec2(winSize.width/PTM_RATIO,0));
		groundBody->CreateFixture(&groundBox,0);
        


精灵创建

//create sprite
		batch=CCSpriteBatchNode::create("CloseNormal.png",100);
		this->addChild(batch);
		m_pSpriteTexture=batch->getTexture();
		setTouchEnabled(true);
		addNewSpriteAtPosition(ccp(100,100));
		scheduleUpdate();
void HelloWorld::addNewSpriteAtPosition(CCPoint point)
{
	CCSprite *sprite=CCSprite::create(m_pSpriteTexture,CCRectMake(0,0,m_pSpriteTexture->getContentSize().width,m_pSpriteTexture->getContentSize().height));
	batch->addChild(sprite);
	sprite->setPosition(point);
	sprite->autorelease();
	//CCLOG("a");
	b2BodyDef bodyDef;
	bodyDef.type=b2_dynamicBody;
	bodyDef.position.Set(point.x/PTM_RATIO,point.y/PTM_RATIO);
	bodyDef.userData=sprite;
	b2Body *body=world->CreateBody(&bodyDef);
	
	b2PolygonShape shapeBox;
	shapeBox.SetAsBox(.5f,.5f);

	b2FixtureDef fixtureDef;
	fixtureDef.shape=&shapeBox;
	fixtureDef.density=1.0f;
	fixtureDef.friction=0.3f;

	body->CreateFixture(&fixtureDef);
	
}


绑定精灵

void HelloWorld::update(float dt)
{
	world->Step(dt,8,1);
	//CCLOG("%d",world->GetBodyCount());
	for(b2Body *b=world->GetBodyList();b;b=b->GetNext())
	{
		if(b->GetUserData()!=NULL)
		{
			//CCLOG("ab");
			CCSprite *sprite=(CCSprite*)b->GetUserData();
			
			sprite->setPosition(ccp(b->GetPosition().x*PTM_RATIO,b->GetPosition().y*PTM_RATIO));
			sprite->setRotation((-1)*CC_RADIANS_TO_DEGREES(b->GetAngle()));
			//CCLOG("%f,%f",sprite->getPositionX(),sprite->getPositionY());
			
		}
	}}