好久没写博文了,过去那些天比较忙,一直在做点别的东西,不过作为小菜的我也不忘记学习,现在跟大家分享下我的小知识吧!
首先建立个带有box2d物理引擎的项目,在头文件中加入
public: // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone virtual bool init(); // there's no 'id' in cpp, so we recommand to return the exactly class pointer static cocos2d::CCScene* scene(); // a selector callback void menuCloseCallback(CCObject* pSender); // implement the "static node()" method manually CREATE_FUNC(HelloWorld); virtual void update(float dt); // 启动重力感应后,重力方向改变会回调didAccelerate void didAccelerate(cocos2d::CCAcceleration* pAccelerationValue); b2World *m_world; cocos2d::CCSprite *m_ball;
// window size
CCSize size = CCDirector::sharedDirector()->getWinSize();
// add a sprite
m_ball = CCSprite::create("ball.png");
this->addChild(m_ball);
m_ball->setPosition(ccp(100, 100));
b2Vec2 gravity = b2Vec2(0.0f, -30.0f); // 重力系数
m_world = new b2World(gravity); // 创建一个有重力的世界
// create edge ground
b2BodyDef groundBodyDef; // 边缘刚体定义
b2Body *groundBody = m_world->CreateBody(&groundBodyDef); // 创建边缘刚体
b2PolygonShape groundBox;
//个人理解是第一个参数表示他的半宽,第二个表示半高,第三个参数表示向量的指向,如底部及得指向底部,顶部就指向顶部,最后一个是角度有待研究,建议边界还是用b2EdgeShape比较好,第一个向量是起点,第二个向量是终点,即可 // bottom groundBox.SetAsBox(size.width / PTM_RATIO, 0, b2Vec2(0, 0), 0); groundBody->CreateFixture(&groundBox, 0); // up groundBox.SetAsBox(size.width / PTM_RATIO, 0, b2Vec2(0,size.height/PTM_RATIO), 0); groundBody->CreateFixture(&groundBox, 0); // left groundBox.SetAsBox(0, size.height / PTM_RATIO, b2Vec2(0,0), 0); groundBody->CreateFixture(&groundBox, 0); // right groundBox.SetAsBox(0, size.height / PTM_RATIO, b2Vec2(size.width/PTM_RATIO,0), 0); groundBody->CreateFixture(&groundBox, 0); // create ball body an shape b2BodyDef ballBodyDef; ballBodyDef.type = b2_dynamicBody; // 刚体类型:动态 ballBodyDef.position.Set(100 / PTM_RATIO, 100 / PTM_RATIO); // 设置位置 ballBodyDef.userData = m_ball; // 绑定数据:精灵 b2Body *body = m_world->CreateBody(&ballBodyDef); // 创建刚体 b2CircleShape circle; // 圆形定义 circle.m_radius = 26.0 / PTM_RATIO; // 半径 b2FixtureDef ballFixtureDef; // 定制器 ballFixtureDef.shape = &circle; // 绑定圆形 ballFixtureDef.density = 1.0f; // 密度 ballFixtureDef.friction = 0.2f; // 摩擦系数 ballFixtureDef.restitution = 0.8f; // 恢复:用于弹力的 body->CreateFixture(&ballFixtureDef); this->setAccelerometerEnabled(true); // 在层里启用重力感应 this->scheduleUpdate(); //在边界那里,这种写法个人觉得比较难理解一下有种比较容易理解的 b2EdgeShape groundBox; CCSize s=CCSize(bg->getContentSize().width,bg->getContentSize().height*ratio); // bottom groundBox.Set(b2Vec2(0,slingshot2->getPositionY()/PTM_RATIO/2.1), b2Vec2(s.width/PTM_RATIO,slingshot2->getPositionY()/PTM_RATIO/2.1)); groundBody->CreateFixture(&groundBox,0); // top groundBox.Set(b2Vec2(0,s.height/PTM_RATIO), b2Vec2(s.width/PTM_RATIO,s.height/PTM_RATIO)); groundBody->CreateFixture(&groundBox,0); // left groundBox.Set(b2Vec2(0,s.height/PTM_RATIO), b2Vec2(0,0)); groundBody->CreateFixture(&groundBox,0); // right groundBox.Set(b2Vec2(s.width/PTM_RATIO,s.height/PTM_RATIO), b2Vec2(s.width/PTM_RATIO,0)); groundBody->CreateFixture(&groundBox,0); //在update函数中写 int velocityIterations = 8; int positionIterations = 1; m_world->Step(dt, velocityIterations, positionIterations); for (b2Body *b = m_world->GetBodyList(); b; b = b->GetNext()) { if (b->GetUserData() != NULL) { CCSprite *ballData = (CCSprite*) b->GetUserData(); ballData->setPosition(ccp(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO)); ballData->setRotation(CC_RADIANS_TO_DEGREES(b->GetAngle())); } } //在didAccelerate函数中加入 b2Vec2 gravity(pAccelerationValue->x * 15, pAccelerationValue->y * 15);//重力感应方向的改变,表示向量力的变化 m_world->SetGravity(gravity);//这两句表示判断重力的感应方向的转变
上面可能要更正一下groundBox.SetAsBox(hx,hy,vector(x,y),angle);
第一个数是半长,第二个数的半高,第三个是向量,第四个数是角度
groundBodyDef.position.Set着几个数都与定义的刚体的位置有关,如果默认及位置在中心点,所以第一跟第二个数是为了获取到边界的长度,向量是位移到所要在的位置上,如刚体默认设置位置在中心点设置右边边界,及得groundBox.SetAsBox(0, winside.height/2/PTM_RATIO, b2Vec2(winside.width/2/PTM_RATIO, 0), 0);,这样就能使得上边位置拉伸到低端(第一跟第二个参数的设置),使得中心点的边拉到右侧(及第三个参数的设置),第四个参数是设置边的倾斜度。
cocos2dx 【小菜】物理引擎点击发力代码下载http://download.csdn.net/detail/five50/5663743