我们继续来实现切割效果。
我们现在有了切割线和多边形,可以利用Box2d的射线投射(RayCast)来检测切割线和多边形的交点(入射点)。在Box2d中通过定义b2RayCastCallback的子类来获取射线投射的结果,关于Box2d中的射线投射的使用,可以参考Box2Dv2.3.0 用户指南(第十章)。
我们创建b2RayCastCallback的子类MyRayCastCallback,声明如下:
#import"Box2D.h"
classMyRayCastCallback : public b2RayCastCallback {
public:
NSMutableArray* results;
NSMutableArray* endResults;
BOOL resultFlag;
MyRayCastCallback();
float32 ReportFixture(b2Fixture *fixture, const b2Vec2 &point, const b2Vec2&normal, float32 fraction);
void ClearResults();
void ResetFlag();
};
成员中定义了两个数组成员,results和endResults,原因是Box2d中射线投射得到的是线段射入多边形的第一个入射点,而实际上我们需要两个切点,因此我们的思路是做两次射线投射,第一次从lineStartSave到lineEndSave,第二次相反。从而得到两组入射点,分别记录在results和endResults两个数组中。
resultFlag用来区分两次投射。方法ResetFlag用于反置resultFlag。ClearResults方法用来清空投射结果。ReportFixture方法用来记录投射结果。
接着我们定义