其实就是这三类PhysicsWorld类,PhysicsBody类,PhysicsShape类。
1.PhysicsWorld类
PhysicsWorld对象代表Cocos2d-x中的物理世界,这个世界能够用来模拟碰撞和其他物理性质。不要直接创建PhysicsWorld对象,建议从一个场景对象中获取PhysicsWorld对象,scene->getPhysicsWorld()。
2.PhysicsBody类
PhysicsBody对象代表物理世界中的刚体,一个刚体可以被附加一个或多个形状。如果通过createXXX()函数创建刚体对象,将会根据密度自动计算质量和力矩。
3.PhysicsShape类
PhysicsShape对象代表一个刚体的形状和一些其他的属性,可以设置刚体的一些密度,质量,弹性等等。
给一个精灵对象设置刚体的步骤:
1.创建一个精灵对象ball
2.创建一个刚体body
3.用PhysicsShape指针对象调整这个刚体的属性
PhysicsShape *ps=body->getShape(0);
ps->setMass(0.2f);
...
4.设置这个精灵对象的刚体属性
ball->setPhysicsBody(body);
5.把这个精灵对象添加到层
this->addchild(ball);
在某个对象类的init函数中写
getPhysicsBody()->setDynamic(false);
表示创建出来的实例对象是静态的刚体,不受重力的影响。相反,如果不写这一句,那创建出来的刚体就受重力的影响,是动态刚体。
同时表示创建出来的实例对象是不会被其他的物体挡住不动的,会一直朝着自己的轨迹运动。如果想要两个刚体之间发生碰撞事件,就是触发碰撞监听器的函数,有碰撞检测,则两者之间必须至少有一个是动态刚体。
在某个对象类的init函数中写
getPhysicsBody()->setRotationEnable(false);
表示创建出来的实例对象是不会被其他的物体碰撞而发生一点点旋转。
在某个对象类的init函数中写
getPhysicsBody()->setContactTestBitmask(1); //例1
myCreep->getPhysicsBody()->setContactTestBitmask(GameScene::ContactMaskBit::HERO_CONTACTMASKBIT); //例2
表示创建出来的实例对象是参与碰撞检测的,如果在HelloWorld的init函数中加一个刚体的碰撞事件监听器,当设置了这个属性的实例对象彼此之间发生碰撞的时候就会调用这个事件监听器中的函数,不写这个的话是不参与碰撞检测的。
在某个对象类的init函数中写
getPhysicsBody()->getShape(0)->setFriction(0);
表示创建出来的实例对象的刚体表面的摩擦力为0
在某个对象类的init函数中写
getPhysicsBody()->getShape(0)->setRestitution(0);表示创建出来的实例对象的刚体的弹性为0
在某个对象类的init函数中写
getPhysicsBody()->setCollisionBitmask(0x0);
默认情况下参数里面是非0的,那样子的话“与”起来就不会为0。
表示不进行碰撞模拟,就是不产生碰撞的效果,直接穿透而过,我的理解是这样的,但是只设置这个的话还是会碰撞检测。这个不会影响子节点的碰撞效果和检测。
在某个对象类的init函数中写
getPhysicsBody()->setGravityEnable(false);
表示这个刚体不受重力,这句话经常和setDynamic(true)搭配,这样子既可以产生碰撞事件,进行碰撞检测,又可以自定义一些刚体的普通动作。
在某个对象类的init函数中写
setPhysicsBody(PhysicsBody::createBox(this->getContentSize()));
表示用这个实例化对象的ContentSize为大小,创建一个刚体,如果已经有刚体的时候,用这个方法是无效的,刚体的大小为第一次使用这个方法创建的时候的大小,就算想this->getPhysicsBody()->setPhysicsBody(PhysicsBody::createBox(this->getContentSize()));也不行,getPhysicsBody()后也并没有setPhysicsBody()方法。
在某个对象类的init函数中写
getPhysicsBody()->setEnabled(false);
表示用这个实例化对象的刚体变得不可见,无效果,相应绑定的精灵也不会发生碰撞,红色调试框没了。当变成true的时候,又可以看见红色调试框,又可以参加碰撞,又有效果。
在某个对象类的init函数中写
getPhysicsBody()->removeFromWorld();
表示把这个实例化对象的刚体彻底从物理世界中删除,且不能再用setPhysicsBody()创建刚体,写setPhysicsBody()也是无效。一般是不用这个相应刚体所绑定节点后才使用这个方法。
在GameScene.cpp的中写
((Scene*)this->getParent())->getPhysicsWorld()->setAutoStep(true);
获取物理世界并且进行一些操作,进行一些物理世界属性的设置。
第十三章的书上代码的物理世界测试那一部分中,我感觉很可能作者是想在手机上用重力感应来控制物体或者说实现重力,所以就写了设备加速度计方法和加速度计监听器。