论 setCollisionBitMask 与 setContactBitMask 区别

之前完全抄书, 结果碰撞监听一直没有响应, 后来在晚上找到,  又犯了不仔细看的错误, 原来一个是 collision 一个是 contact, 接触 和 碰撞, 看似相似, 但用法上截然不同, collision 直接影响物体碰撞表现, 而contact 则是接触监听, 前者影响物体运动, 而后者对外给出碰撞结果,两者互不影响。

 论 setCollisionBitMask 与 setContactBitMask 区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现这个效果,可以使用cocos2d-x自带的物理引擎来实现。具体步骤如下: 1. 创建一个物理世界,并设置重力加速度为向下的9.8米/秒。 2. 创建一个刚体节点,并设置其重力缩放因子为0,这样可以让节点不受重力影响。 3. 在节点上添加一个向上的冲量,使其向上抛物。 4. 在物理世界中添加一个触发器,当节点进入触发器范围内时,执行下落动画。 5. 在下落动画中,逐帧修改节点的位置,使其做匀减速运动。 下面是代码实现的示例: ```c++ // 创建物理世界 auto physicsWorld = PhysicsWorld::construct(Vec2(0, -980)); this->addChild(physicsWorld); // 创建刚体节点 auto node = Node::create(); auto body = PhysicsBody::createCircle(50); body->setGravityEnable(false); node->setPhysicsBody(body); this->addChild(node); // 添加向上的冲量 body->applyImpulse(Vec2(0, 1000)); // 添加触发器 auto trigger = PhysicsTrigger::createBox(Size(100, 100)); trigger->setPosition(Vec2(0, 0)); trigger->setTag(1); trigger->setCollisionBitmask(0xFF); trigger->setContactTestBitmask(0xFF); trigger->setDynamic(false); physicsWorld->addTrigger(trigger); // 下落动画 auto startPos = node->getPosition(); auto endPos = Vec2(0, 0); float t = 0; float totalTime = 5; this->schedule([=](float dt){ t += dt; if(t > totalTime) { node->setPosition(startPos); node->getPhysicsBody()->setVelocity(Vec2::ZERO); return; } float s = (totalTime - t) / totalTime; float y = startPos.y + (endPos.y - startPos.y) * (1 - s * s); float x = startPos.x + (endPos.x - startPos.x) * (1 - s); node->setPosition(Vec2(x, y)); }, 0, "falling"); ``` 在上面的代码中,我们创建了一个物理世界,并设置了重力加速度为-980(相当于9.8米/秒的平方)。然后我们创建了一个刚体节点,并设置其重力缩放因子为0,这样可以让节点不受重力影响。接着我们给节点添加了一个向上的冲量,使其向上抛物。然后我们创建了一个触发器,当节点进入触发器范围内时,执行下落动画。在下落动画中,我们逐帧修改节点的位置,使其做匀减速运动。 注意,这只是一个简单的示例,实际应用中可能需要根据具体需求进行适当修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值