关于物理引擎的使用,及其重力感应的小test
好久没写博文了,过去那些天比较忙,一直在做点别的东西,不过作为小菜的我也不忘记学习,现在跟大家分享下我的小知识吧!
首先建立个带有box2d物理引擎的项目,在头文件中加入
public:// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphonevirtual bool init(); // there's no 'id' in cpp, so we recommand to return the exactly class pointerstatic cocos2d::CCScene* scene();// a selector callbackvoid menuCloseCallback(CCObject* pSender);// implement the "static node()" method manuallyCREATE_FUNC(HelloWorld);virtual void update(float dt); // 启动重力感应后,重力方向改变会回调didAccelerate void didAccelerate(cocos2d::CCAcceleration* pAccelerationValue); b2World *m_world; cocos2d::CCSprite *m_ball;
在源文件初始化init函数中添加
// 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);// bottomgroundBox.Set(b2Vec2(0,slingshot2->getPositionY()/PTM_RATIO/2.1), b2Vec2(s.width/PTM_RATIO,slingshot2->getPositionY()/PTM_RATIO/2.1));groundBody->CreateFixture(&groundBox,0);// topgroundBox.Set(b2Vec2(0,s.height/PTM_RATIO), b2Vec2(s.width/PTM_RATIO,s.height/PTM_RATIO));groundBody->CreateFixture(&groundBox,0);// leftgroundBox.Set(b2Vec2(0,s.height/PTM_RATIO), b2Vec2(0,0));groundBody->CreateFixture(&groundBox,0);// rightgroundBox.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
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
