更改图像的命中框

Posted

技术标签:

【中文标题】更改图像的命中框【英文标题】:Changing the hitbox of an image 【发布时间】:2015-09-27 21:09:28 【问题描述】:

我一直在寻找解决方案很长一段时间,但我忍不住找到了一个。情况如下:我创建了一个带有图像的SKSpriteNode,通过touchesBegan的方法我想与它进行交互,就像如果一个人触摸图像,一些东西应该改变。问题是该图像周围的碰撞框是方形的,并且没有根据图像的形状进行调整。有没有人知道我该如何解决这个问题?我尝试通过像这样更改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 形状而是实际形状,我已尽力解释它,如果让您感到困惑,请见谅。

提前致谢!

朱利安

【问题讨论】:

阅读这篇文章***.com/questions/31900267/…。如果仍有问题,请告诉我。 【参考方案1】:

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

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

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

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

如果没有,短期的妥协可能是使用 init(circleOfRadius:) 初始化您的 SKPhysicsBody 并使用圆形作为看起来不像盒子那么笨重的身体类型。你也许可以玩弄圆半径来感受最自然的碰撞半径。

【讨论】:

非常感谢您的回复,虽然不是很完美但是已经足够好了! :) PS:CGPath 不是空的,我只是认为没有必要写下点和线:P

以上是关于更改图像的命中框的主要内容,如果未能解决你的问题,请参考以下文章

将图片框图像保存为 PDF 文件

将复选框检查图像更改为自定义图像

SwiftUI 无边框图像按钮

使用固定的SKPhysicsJoint将平台检测命中框作为子项附加到玩家精灵更改玩家的碰撞和检测位掩码

快速更改按钮图像在旧图像上附加新图像

如何在不提取的情况下从 zip 设置图片框图像位置?