cocos2d-physics学习笔记(一)

前端之家收集整理的这篇文章主要介绍了cocos2d-physics学习笔记(一)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1.开启物理引擎

Android

projects/pojectName/proj.android/jni/Application.mk@H_301_9@ DCC_ENABLE_CHIPMUNK_INTEGRATION=1@H_301_9@ DCC_ENABLE_Box2D_INTEGRATION=1

ios@H_301_9@ CC_ENABLE_CHIPMUNK_INTEGRATION=1@H_301_9@ CC_ENABLE_Box2D_INTEGRATION=1

代码

createWithPhysics 创建scene时候开启,必须在 Layer:onEnter 后才能调用 scene->getPhysicsWorld()

@H_301_9@

2.物理世界

1.世界:PhysicsWorld和2dx的scene关联,控制整个世界里的物体。@H_301_9@ 关联两个物体 addJoint@H_301_9@ 设重力 setGravity@H_301_9@ 得到世界里所有刚体 getAllBodies@H_301_9@ 通过tag确定刚体 getBody(1)@H_301_9@ 检测射线运动 rayCast@H_301_9@ 是否显示刚体 setDebugDrawMask@H_301_9@ 判断是否触摸到刚体 getShapes@H_301_9@ 振频率 setUpdateRate@H_301_9@

@H_301_9@

3.刚体

基础

offset: 重心点@H_301_9@ velocity: 速度@H_301_9@ dadamping: 阻尼@H_301_9@ rerestitution:弹力@H_301_9@ material: 材质(密度,摩擦力,恢复力)@H_301_9@ mass: 质量@H_301_9@ moment: 力矩,当他碰到另一个刚体时候 ,会产生一股扭转力,做旋转运动@H_301_9@ body: 刚体,表示物理世界中的抽象实体,附带有物理属性@H_301_9@ shape: 刚体的形状,同一个body可以附加多个shape 该shape们不会发生碰撞@H_301_9@ joint: 关节,可以连接>=2个刚体@H_301_9@

刚体

PhysicsBody和2dx的node及其子类关联,通过形状确定刚体的大小以及碰撞的范围@H_301_9@

刚体的类型大概有三种:静态刚体(static body)、棱柱刚体(Prismatic body)、动态刚体(Dynamic Body)。@H_301_9@ 其中棱柱刚体没有质量,但是可以有速度,引擎会根据熟读计算并更新它的位置。@H_301_9@

创建刚体时指定形状

实体矩形 PhysicsBody::createBox@H_301_9@ 空体 Box PhysicsBody::createEdgeBox EdgeBox默认不受重力影像(静态刚体)@H_301_9@ 空体矩形 PhysicsBody::createEdgeSegment@H_301_9@ 圆 PhysicsBody::createCircle@H_301_9@ 多边形 PhysicsBody::createPolygon@H_301_9@ 。。。@H_301_9@ @H_301_9@ PhysicsBody::create() 可以放多个刚体形状@H_301_9@ addShape 绘制刚体形状

刚体方法

静态刚体 setDynamic(false)@H_301_9@ 不受重力影响 setGravityEnable(false)@H_301_9@ 质量 setMass@H_301_9@ 等等 setMoment@H_301_9@ 加速度 setVelocity@H_301_9@ 角速度 setAngularVelocity@H_301_9@ 唯一标示 setTag@H_301_9@ @H_301_9@ setCategoryBitmask(0x01) 设置掩码@H_301_9@ setCollisionBitmask@H_301_9@ setContactTestBitmask@H_301_9@ local2World 坐标转换@H_301_9@ getVelocityAtWorldPoint@H_301_9@ setPositionOffset 位置@H_301_9@ setRotationOffset 角度

@H_301_9@

4.刚体碰撞

set / get方法来设置和获取@H_301_9@ CategoryBitmask: 碰撞掩码category (0xFFFFFFFF)@H_301_9@ ContactTestBitmask: 触发碰撞事件掩码contact (0x00000000)@H_301_9@ CollisionBitmask: 是否发生碰撞掩码collision (0xFFFFFFFF)

body1 和 body2

触发碰撞事件(默认不触发)@H_301_9@ (category1 & contact2)!=0 并且 (category2 & contact1)!=0@H_301_9@ 发生碰撞(默认)@H_301_9@ (category1 & collision2)!=0 并且 (category2 & collision1)!=0

碰撞事件@H_301_9@ EventListenerPhysicsContact 多个刚体碰撞@H_301_9@ EventListenerPhysicsContactWithBodies 两个刚体碰撞@H_301_9@ EventListenerPhysicsContactWithShapes@H_301_9@ EventListenerPhysicsContactWithGroup@H_301_9@ @H_301_9@ onContactBegin 在接触开始时被调用,仅调用一次,通过放回true或者false来决定两个物体是否有碰撞。同时可以使用PhysicsContact::setData()来设置接触操作的用户数据。当返回false时,onContactPreSolve和onContactPostSolve将不会被调用,但是onContactSeperate将被调用一次。@H_301_9@ onContactPreSlove 会在每一次被调用,通过放回true或者false来决定两个物体是否有碰撞,同样可以用ignore()来跳过后续的onContactPreSolve和onContactPostSolve回调函数。(默认返回true)@H_301_9@ onContactPostSolve 在两个物体碰撞反应中的每个步骤中被处理调用。可以在里面做一些后续的接触操作。如销毁body@H_301_9@ onContactSeperate 在两个物体分开时被调用,在每次接触时只调用一次,和onContactBegin配对使用。

两个body碰撞

  1. autocontactListener=EventListenerPhysicsContactWithBodies::create(body1,body2);
  2. contactListener->onContactBegin=CC_CALLBACK_1(PhysicsDemoOneWayPlatform::onContactBegin,this);
  3. _eventDispatcher->addEventListenerWithSceneGraPHPriority(contactListener,153); background-color:inherit; font-weight:bold">this);
  4. boolPhysicsDemoOneWayPlatform::onContactBegin(PhysicsContact&contact)//获得刚体的一些信息contact
  5. {
  6. returncontact.getContactData()->normal.y<0;
  7. }

多个body碰撞@H_301_9@
copy
    autocontactListener=EventListenerPhysicsContact::create();
  1. contactListener->onContactBegin=CC_CALLBACK_1(PhysicsContactTest::onContactBegin,87); background-color:inherit; font-weight:bold">boolPhysicsContactTest::onContactBegin(PhysicsContact&contact)
  2. PhysicsBody*a=contact.getShapeA()->getBody();
  3. PhysicsBody*b=contact.getShapeB()->getBody();
  4. PhysicsBody*body=(a->getCategoryBitmask()==0x04||a->getCategoryBitmask()==0x08)?a:b;
  5. CC_UNUSED_PARAM(body);
  6. CC_ASSERT(body->getCategoryBitmask()==0x04||body->getCategoryBitmask()==0x08);
  7. returntrue;
  8. }

@H_301_9@

工具:@H_301_9@ PhysicsEditor:比较麻烦@H_301_9@ VertexHelper:代码形式工具@H_301_9@ 不规则图像碰撞检测,先用工具描刚体边,确定绘制多边形刚体的坐标点,之后在代码里绘制此刚体@H_301_9@

@H_301_9@

总结:

世界关联的

刚体

刚体关联的

形状

碰撞

关节

猜你在找的Cocos2d-x相关文章