1.开启物理引擎
AndroID
projects/pojectname/proj.androID/jni/Application.mk
DCC_ENABLE_CHIPMUNK_INTEGRATION=1
DCC_ENABLE_Box2D_INTEGRATION=1
ios
CC_ENABLE_CHIPMUNK_INTEGRATION=1
CC_ENABLE_Box2D_INTEGRATION=1
代码
createWithPhysics 创建scene时候开启,必须在 Layer:onEnter 后才能调用 scene->getPhysicsWorld()
2.物理世界
1.世界:PhysicsWorld和2dx的scene关联,控制整个世界里的物体。
关联两个物体 addJoint
设重力 setGravity
得到世界里所有刚体 getAllBodIEs
通过tag确定刚体 getbody(1)
检测射线运动 rayCast
是否显示刚体 setDeBUGDrawMask
判断是否触摸到刚体 getShapes
振频率 setUpdaterate
3.刚体
基础
offset: 重心点
veLocity: 速度
dadamPing: 阻尼
rerestitution:d力
material: 材质(密度,摩擦力,恢复力)
mass: 质量
moment: 力矩,当他碰到另一个刚体时候 ,会产生一股扭转力,做旋转运动
body: 刚体,表示物理世界中的抽象实体,附带有物理属性
shape: 刚体的形状,同一个body可以附加多个shape 该shape们不会发生碰撞
joint: 关节,可以连接>=2个刚体
刚体
PhysicsBody和2dx的node及其子类关联,通过形状确定刚体的大小以及碰撞的范围
刚体的类型大概有三种:静态刚体(static body)、棱柱刚体(prismatic body)、动态刚体(Dynamic Body)。
其中棱柱刚体没有质量,但是可以有速度,引擎会根据熟读计算并更新它的位置。
创建刚体时指定形状
实体矩形 PhysicsBody::createBox
空体 Box PhysicsBody::createEdgeBox EdgeBox默认不受重力影像(静态刚体)
空体矩形 PhysicsBody::createEdgeSegment
圆 PhysicsBody::createCircle
多边形 PhysicsBody::createpolygon
。。。
PhysicsBody::create() 可以放多个刚体形状
addShape 绘制刚体形状
静态刚体 setDynamic(false)
不受重力影响 setGravityEnable(false)
质量 setMass
等等 setMoment
加速度 setVeLocity
角速度 setAngularVeLocity
唯一标示 setTag
setcategoryBitmask(0x01) 设置掩码
setCollisionBitmask
setContactTestBitmask
local2World 坐标转换
getVeLocityAtWorldPoint
setpositionOffset 位置
setRotationOffset 角度
4.刚体碰撞
set / get方法来设置和获取
categoryBitmask: 碰撞掩码category (0xFFFFFFFF)
ContactTestBitmask: 触发碰撞事件掩码contact (0x00000000)
CollisionBitmask: 是否发生碰撞掩码collision (0xFFFFFFFF)
body1 和 body2
触发碰撞事件(默认不触发)
(category1 & contact2)!=0 并且 (category2 & contact1)!=0
发生碰撞(默认)
(category1 & collision2)!=0 并且 (category2 & collision1)!=0
碰撞事件
EventListenerPhysicsContact 多个刚体碰撞
EventListenerPhysicsContactWithBodIEs 两个刚体碰撞
EventListenerPhysicsContactWithShapes
EventListenerPhysicsContactWithGroup
onContactBegin 在接触开始时被调用,仅调用一次,通过放回true或者false来决定两个物体是否有碰撞。同时可以使用PhysicsContact::setData()来设置接触 *** 作的用户数据。当返回false时,onContactPreSolve和onContactpostsolve将不会被调用,但是onContactSeperate将被调用一次。
onContactPreSlove 会在每一次被调用,通过放回true或者false来决定两个物体是否有碰撞,同样可以用ignore()来跳过后续的onContactPreSolve和onContactpostsolve回调函数。(默认返回true)
onContactpostsolve 在两个物体碰撞反应中的每个步骤中被处理调用。可以在里面做一些后续的接触 *** 作。如销毁body
onContactSeperate 在两个物体分开时被调用,在每次接触时只调用一次,和onContactBegin配对使用。
两个body碰撞
[cpp] view plain copy autocontactListener=EventListenerPhysicsContactWithBodIEs::create(body1,body2); contactListener->onContactBegin=CC_CALLBACK_1(PhysicsDemoOneWayPlatform::onContactBegin,this); _eventdispatcher->addEventListenerWithSceneGraPHPriority(contactListener,153); background-color:inherit; Font-weight:bold">this); boolPhysicsDemoOneWayPlatform::onContactBegin(PhysicsContact&contact)//获得刚体的一些信息contact { returncontact.getContactData()->normal.y<0; }
多个body碰撞
copy autocontactListener=EventListenerPhysicsContact::create(); contactListener->onContactBegin=CC_CALLBACK_1(PhysicsContactTest::onContactBegin,87); background-color:inherit; Font-weight:bold">boolPhysicsContactTest::onContactBegin(PhysicsContact&contact) PhysicsBody*a=contact.getShapeA()->getbody(); PhysicsBody*b=contact.getShapeB()->getbody(); PhysicsBody*body=(a->getcategoryBitmask()==0x04||a->getcategoryBitmask()==0x08)?a:b; CC_UNUSED_ParaM(body); CC_ASSERT(body->getcategoryBitmask()==0x04||body->getcategoryBitmask()==0x08); returntrue; }
工具:
PhysicsEditor:比较麻烦
VertexHelper:代码形式工具
不规则图像碰撞检测,先用工具描刚体边,确定绘制多边形刚体的坐标点,之后在代码里绘制此刚体
总结:
世界关联的
刚体
刚体关联的
形状
碰撞
关节
总结以上是内存溢出为你收集整理的cocos2d-physics学习笔记(一)全部内容,希望文章能够帮你解决cocos2d-physics学习笔记(一)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)