cocos2d-x初探学习笔记(19)--物理引擎box2d(1)
小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 在游戏中我们经常要加入物理碰撞等和物理有关的内容,在游戏中加入物理引擎可以使我们的游戏更加真实,为玩家展示一个更真实的世界,cocos2d-x支持两个物理引擎Box2d和Chipmunk,本文介绍box2d。 Box2D是用可移植的C++来写成的。引擎中定义的大部分类型都有b2前缀,可以把它和我们游戏中的其他元素区分开来。 Box2d中有很多概念。 1.刚体 即是物理学中的质点,只有位置,没有大小,它又可以区分为以下几类 静态刚体:静态刚体没有质量,没有速度,只可以手动来改变他的位置 棱柱刚体:棱柱刚体没有质量,但是可以有速度,可以自己更新位置 动态刚体:动态刚体有质量也有速度 物理引擎需要首先定义一个描述类,然后再根据描述类通过世界创建某个对象。创建刚体时需要有两个步骤,一是生成一个刚体定义,二是根据刚体定义生成刚体。在刚体创建时定义中的信息会被复制,也就是说创建完成后刚体只要没被释放掉,就还可以重复使用。 //定义刚体 b2BodyDefgroundBodyDef; groundBodyDef.position.Set(screenSize.width/2/PTM_RATIO,screenSize.height/2/PTM_RATIO); //生成刚体 b2Body*groundBody=world->CreateBody(&groundBodyDef); 2.形状 通过关联添加到刚体上,碰撞可以根据形状来判定,具有摩擦和恢复等材料特性。 b2PolygonShapegroundBox; //bottom groundBox.SetAsBox(screenSize.width/2/PTM_RATIO,b2Vec2(0,-screenSize.height/2/PTM_RATIO),0); 3.关联 关联是一种附加在刚体上的属性,一个刚体可以有多个关联,创建关联时,需要定义关联的信息,然后通过刚体创建关联,当关联被创建时关联定义中的信息也会被保留,也可以重用 //定义并创建关联 b2FixtureDeffixtureDef; fixtureDef.shape=&dynamicBox; fixtureDef.density=1.0f; fixtureDef.friction=0.3f; body->CreateFixture(&fixtureDef); 4.链接 链接可以联系多个缸体,使得刚体之间相互影响,同样的,也需要首先定义信息,之后通过世界创建链接,同样的,信息也可以被保留,从而重用 另外链接还支持限制和马达,限制就是限制物体运动的角度,马达就是依照关节中的限制来约束物体 链接有旋转,棱柱和距离等 b2RevoluteJointDefrjd; rjd.Initialize(m_attachment,m_platform,b2Vec2(0.0f,5.0f)); rjd.maxMotorTorque=50.0f; rjd.enableMotor=true; m_world->CreateJoint(&rjd); 5.约束 一个约束就是消除物体自由度的物理连接。在2D中,一个物体有3个自由度。如果我 们把一个物体钉在墙上(像摆锤那样),那我们就把它约束到了墙上。这样,此物体就只能绕着这个钉子旋转,所以这个约束消除了它2个自由度。 还有一种不须你创建的接触约束,一个防止刚体穿透,以及用于模拟摩擦和恢复的特殊约束。 6.世界 世界是遵循物理的空间,以上的所有都存在于世界中,可以创建多个世界,但很少这样用 创建世界需要两个步骤,一是生成重力向量,二是根据重力生成世界对象 //生成重力向量 b2Vec2gravity; gravity.Set(0.0f,-10.0f); //生成世界对象 booldoSleep=true; world=newb2World(gravity); world->SetAllowSleeping(doSleep); world->SetContinuousPhysics(true); 刚开始研究此引擎,如有错误之处,希望大家多多指正 下一篇继续深入box2d (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |