在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;
}
```
