2

我为我的一个物理体制作了以下代码:

    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”。有没有人看到我的代码有什么问题或者知道为什么这不起作用?如果您需要我指定任何内容,请询问,我会很高兴。

4

1 回答 1

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(或您的最大值)。

这具有很大的优势,一旦您对其进行编码,您就可以完全忘记为您的图形定义多边形轮廓,它们只是在几毫秒内即时计算出来的。

于 2014-03-15T11:09:43.473 回答