物理引擎碰撞检测bug

在CCPhysicsContact.cpp中
void EventListenerPhysicsContact::onEvent(EventCustom* event)函数里面对PreSolve的处理,源代码如下

    case PhysicsContact::EventCode::PRESOLVE:
    {
      bool ret = true;
 
      if (onContactPreSolve != nullptr
        && hitTest(contact.getShapeA(), contact.getShapeB()))
      {
        PhysicsContactPreSolve solve(contact._begin ? nullptr : contact._contactData, contact._contactInfo);
        contact._begin = false;
        contact.generateContactData();
 
        ret = onContactPreSolve(event, contact, solve);
      }
      contact.setResult(ret);
 
      break;
    }



```

当检测一个物体与多个同类型障碍物的碰撞结果时,该函数会被多次调用,而如果该物体与某障碍物相离很远时,hitTest返回为false,导致ret为true,系统认为发生了碰撞。
实际上针对这种情况应该不做任何处理,因此代码应该为下面(将contact.setResult(ret)放到判断语句的大括号里面):




    case PhysicsContact::EventCode::PRESOLVE:
    {
      bool ret = true;
 
      if (onContactPreSolve != nullptr
        && hitTest(contact.getShapeA(), contact.getShapeB()))
      {
        PhysicsContactPreSolve solve(contact._begin ? nullptr : contact._contactData, contact._contactInfo);
        contact._begin = false;
        contact.generateContactData();
 
        ret = onContactPreSolve(event, contact, solve);
        contact.setResult(ret);
      }
 
      break;
    }



```

顶楼主 :2::2::2: