我为我的一个物理机构制作了以下代码:
CGFloat offsetX = ship.frame.size.width * ship.anchorPoint.x;
CGFloat offsetY = ship.frame.size.height * ship.anchorPoint.y;
CGMutablePathRef path2 = CGPathCreateMutable();
CGPathMoveToPoint(path2, NULL, 10 - offsetX, 1 - offsetY);
CGPathAddLineToPoint(path2, NULL, 8 - offsetX, 12 - offsetY);
CGPathAddLineToPoint(path2, NULL, 10 - offsetX, 14 - offsetY);
CGPathAddLineToPoint(path2, NULL, 10 - offsetX, 37 - offsetY);
CGPathAddLineToPoint(path2, NULL, 5 - offsetX, 44 - offsetY);
CGPathAddLineToPoint(path2, NULL, 0 - offsetX, 36 - offsetY);
CGPathAddLineToPoint(path2, NULL, 0 - offsetX, 16 - offsetY);
CGPathAddLineToPoint(path2, NULL, 2 - offsetX, 11 - offsetY);
CGPathAddLineToPoint(path2, NULL, 0 - offsetX, 1 - offsetY);
CGPathAddLineToPoint(path2, NULL, 0 - offsetX, 0 - offsetY);
CGPathAddLineToPoint(path2, NULL, 10 - offsetX, 0 - offsetY);
CGPathCloseSubpath(path2);
ship.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path2];
对我来说似乎很好,但每当我运行它时,我会收到一条错误消息:“线程1:信号SIGABRT”。 有没有人看到我的代码有什么问题,或者知道为什么这不起作用? 如果你需要我指明任何问题,我会很高兴。
答案 0 :(得分:2)
我的代码出现以下错误:
断言失败:(区域> 1.19209290e-7F),函数ComputeCentroid,文件/SourceCache/PhysicsKit/PhysicsKit-6.5.4/PhysicsKit/Box2D/Collision/Shapes/b2PolygonShape.cpp,第122行。
以下小代码片段将在您的精灵上绘制轮廓:
SKShapeNode *outline = [SKShapeNode node];
outline.name = @"outline";
outline.path = path2;
[outline setLineWidth:0.5];
[outline setStrokeColor:[UIColor cyanColor]];
[self addChild:outline];
错误很明显:你的多边形轮廓不是凸面的,它进入&在导弹形状的尾部出来。
如果您不知道,快速谷歌会解释凸起意味着什么: http://www.mathopenref.com/polygonconvex.html
我在自己的应用程序中采用的一种更有趣的方法是从图像位图自动生成物理轮廓。
这太复杂了,不能在此详细介绍,但算法的工作原理如下:
沿着位图的轮廓生成点(我这样做是通过追踪从外部到中心的光线来找到任何给定方向上的最远点)。
枚举点并删除距其两个相邻点定义的线段最小距离以下的任何点。
删除任何非凸点(即:如果段向右弯曲,使用点积)
增加容差并迭代,直到我们少于12分(或无论你的最大值是多少)。
这有一个很大的好处,一旦你编码它,你就可以完全忘记为你的图形定义多边形轮廓,它们只是在几毫秒内即时计算。