1

我有SKSpriteNode一架飞机。这是图像(300px x 83px):

一架飞机

p40@2x.png该图像在我的 Xcode 项目中命名。

现在我在飞机上添加一个物理体:

CGFloat offsetX = self.size.width * self.anchorPoint.x;
CGFloat offsetY = self.size.height * self.anchorPoint.y;

CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, NULL, 24 - offsetX, 124 - offsetY);
CGPathAddLineToPoint(path, NULL, 24 - offsetX, 47 - offsetY);
CGPathAddLineToPoint(path, NULL, 339 - offsetX, 1 - offsetY);
CGPathAddLineToPoint(path, NULL, 401 - offsetX, 3 - offsetY);
CGPathAddLineToPoint(path, NULL, 452 - offsetX, 52 - offsetY);
CGPathAddLineToPoint(path, NULL, 411 - offsetX, 78 - offsetY);
CGPathAddLineToPoint(path, NULL, 295 - offsetX, 78 - offsetY);
CGPathAddLineToPoint(path, NULL, 268 - offsetX, 93 - offsetY);
CGPathAddLineToPoint(path, NULL, 95 - offsetX, 78 - offsetY);
CGPathAddLineToPoint(path, NULL, 62 - offsetX, 124 - offsetY);

CGPathCloseSubpath(path);

self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];

CGPathSKPhysicsBody Path Generator 生成

为了调试飞机的物理体,我添加了一个SKShapeNodeCGPath物理体相同的:

SKShapeNode *shape = [[SKShapeNode alloc] init];
shape.path = path;
shape.strokeColor = [SKColor colorWithRed:1.0 green:0 blue:0 alpha:0.5];
[self addChild:shape];

结果如下:

结果

难道我做错了什么?

PS:注意到一件有趣的事情。如果我指定CGPath如下:

CGPathMoveToPoint(path, NULL, 24/3.0 - offsetX, 124/3.0 - offsetY);
CGPathAddLineToPoint(path, NULL, 24/3.0 - offsetX, 47/3.0 - offsetY);

形状很适合飞机!

4

3 回答 3

1

这可能不相关,但是,您定义的形状是concave. 文档说它必须是convex. 如果你用凸形重新创建你的路径,这有帮助吗?

在此处输入图像描述

示例:凸多边形和凹多边形

于 2013-12-31T16:20:46.010 回答
0

您必须使用原始尺寸 (320 x 480) 或 iPhone5+ (320 x 568)。@2x/@4x 图像仅用于为视网膜设备提供更高分辨率的图像。但是出于向后兼容的原因,所有设备仍然共享相同的坐标系。

所以你的路径应该是这样的:

SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"jPfsF.png"];

CGFloat offsetX = sprite.frame.size.width * sprite.anchorPoint.x;
CGFloat offsetY = sprite.frame.size.height * sprite.anchorPoint.y;

CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, NULL, 18 - offsetX, 41 - offsetY);
CGPathAddLineToPoint(path, NULL, 31 - offsetX, 25 - offsetY);
CGPathAddLineToPoint(path, NULL, 91 - offsetX, 31 - offsetY);
CGPathAddLineToPoint(path, NULL, 95 - offsetX, 24 - offsetY);
CGPathAddLineToPoint(path, NULL, 136 - offsetX, 26 - offsetY);
CGPathAddLineToPoint(path, NULL, 148 - offsetX, 18 - offsetY);
CGPathAddLineToPoint(path, NULL, 133 - offsetX, 2 - offsetY);
CGPathAddLineToPoint(path, NULL, 75 - offsetX, 1 - offsetY);
CGPathAddLineToPoint(path, NULL, 9 - offsetX, 16 - offsetY);
CGPathAddLineToPoint(path, NULL, 11 - offsetX, 40 - offsetY);

CGPathCloseSubpath(path);

sprite.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
于 2014-06-09T20:07:39.683 回答
0

我猜你需要计算点,而不是像素。如果您有一个@1x 图像,那么它将具有相同的点和像素大小。对于@2x,您将拥有相同数量的点,但对于@3x,像素数会增加一倍,依此类推...

于 2014-11-27T23:11:12.637 回答