我为我的一个物理体编写了以下代码:
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”。 有谁发现我的代码有什么问题或者知道为什么这不起作用? 如果您需要我指定任何内容,请尽管询问,我会很乐意这样做。
最佳答案
我的代码出现以下错误:
断言失败:(区域 > 1.19209290e-7F),函数 ComputeCentroid,文件/SourceCache/PhysicsKit/PhysicsKit-6.5.4/PhysicsKit/Box2D/Collision/Shapes/b2PolygonShape.cpp,第 122 行。
下面的小代码片段将在你的 Sprite 上绘制轮廓:
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 点(或您的最大值)。
这有一个很大的优点,一旦你编码了,你就可以完全忘记为图形定义多边形轮廓,它们只是在几毫秒内动态计算。
关于sprite-kit - spritekit 中不规则形状的物理体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22416180/