更改图像的碰撞箱

Changing the hitbox of an image

我一直在寻找解决方案很长一段时间,但我还是忍不住找到了。情况如下:我用图像创建了一个 SKSpriteNode,通过方法 touchesBegan 我想与之交互,就像如果有人触摸图像,某些东西应该改变。问题是这张图片周围的 hitbox 是方形的,没有根据图片的形状进行调整。有没有人知道我如何解决这个问题?我尝试通过像这样

更改 physicsBody 来做到这一点
CGFloat offsetX = node.frame.size.width * node.anchorPoint.x;
CGFloat offsetY = node.frame.size.height * node.anchorPoint.y;

CGMutablePathRef path = CGPathCreateMutable();
CGPathCloseSubpath(path);

node.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];

好像touchesBegan的方法不是用physicsBody的形状,而是用实际的形状,我已经尽力解释了,不好意思让你糊涂了。

提前致谢!

朱利安

在 Xcode 关卡编辑器中,在 SKSpriteNode 的物理定义下,将 body 类型更改为 alpha mask(见图)。这使得物理边界符合精灵的实际形状而不是矩形边界框。

遗憾的是,此解决方案仅适用于在 .sks 文件中管理精灵的情况,因为关卡编辑器似乎具有计算精灵轮廓并将其转换为用于初始化物理的路径的逻辑 body body 类型的 'alpha mask'。 (太糟糕了,目前 SKPhysicsBody 上没有 'bodyType' 属性,因为能够以编程方式设置它真的很方便,而不是只能在 .sks 文件中这样做。 .. 苹果?)

我认为您尝试使用 CGpath 创建和初始化 SKPhysicsBody 的方式是正确的... 但是因为它目前是一个空路径 (没有点或线)我猜它不会有任何影响。

有没有什么方法可以近似一些点和线来表示精灵的粗略轮廓路径?然后,您可以使用这些点来创建 CGPath,然后使用它来初始化 SKPhysicsBody。

如果不是,short-term 折衷方案可能是使用 init(circleOfRadius:) 初始化您的 SKPhysicsBody 并使用圆形作为 body 类型,这看起来不像盒子那么笨重。您也许可以尝试使用圆半径来感受最自然的碰撞半径。