swift - 检测 SKSpriteNode 上带有奇怪形状图像运行动画的触摸

标签 swift sprite-kit skspritenode skcropnode

将 SpriteKit 用于 iOS 9.0 应用/游戏(并且没有物理体)。

我的场景中有一些 SpriteNode。 SpriteNode 具有奇怪形状的图像,并通过多个帧运行动画。

检测 SpriteNode 图像内容上的触摸而不是整个图像矩形的透明区域上的触摸的最佳方法是什么。

我看到很多关于使用 SKCropNode/MaskImage 的帖子。在我的场景中,动画的每个 SpriteNode 有多个图像/帧。

请就一种方法提出建议或为我指出正确的方向。谢谢。

最佳答案

基于上述评论的附加信息:

由于 16 帧中只有 16 个形状,更有效的方法之一是在每一帧绘制大致近似角色轮廓的原始形状,并将它们转换为 CGPaths 。然后,可以在每个帧中将它们换入和换出,或者(更好)在触摸时根据触摸时当前显示的帧适本地拔出进行测试。

CGPaths是非常轻量级的结构,因此这两种方法都不应该出现任何性能问题。

CGPathContainsPoint 是此测试的旧名称,现在是 Swift 3 及更高版本的现代化 API:

Troubles using CGPathContainsPoint SWIFT

有一个名为PaintCode的应用程序,大约 100 美元,它可以将矢量转换为 CGPaths 等,因此您可以使用它来导入形状。我建议您将矢量复制/粘贴到其中,因为您可能想在友好的绘图程序中进行绘制。 PaintCode 没有世界上最好的绘图体验。


此外,这里还有一个免费的在线工具,用于从纹理创建多边形路径。可能比使用绘图应用程序和 PaintCode 更痛苦,但它是FREE!

替代方案:来自纹理的物理体,以及与触摸的接触

您可以从纹理自动创建物理 body 形状,就像 this page 上的文档一样。 :

let texturedSpaceShip = SKSpriteNode(texture: spaceShipTexture)
texturedSpaceShip.physicsBody = SKPhysicsBody(texture: spaceShipTexture,
                                              size: CGSize(width: circularSpaceShip.size.width,
                                                           height: circularSpaceShip.size.height))

有报告称确定一个点是否在给定的物理体内会出现问题,因此最好创建一个小的物理对象,将其放置在触摸位置,然后确定它是否与物理体接触适合当前游戏实体当前帧的 body 形状。

警告: 对于这些自动创建的物理形状,我们无法得知(据我所知,也无法控制)最终的 CGPath 有多复杂。

关于swift - 检测 SKSpriteNode 上带有奇怪形状图像运行动画的触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40166264/

相关文章:

ios - swift3中针对不同目标设计通用决策文件

ios - 如何使 UILabel 可点击?

objective-c - 如何快速访问 objective-c 定义的宏?

ios - 如何将 swift 文件与 SKscene 连接?

objective-c - 如何将此方法从 Objective-C 转换为 Swift

ios - 打开应用程序或更改场景时背景音乐继续播放

swift - 多次检测到碰撞

ios - 快速点击一个 SKSprite 节点

ios - 我可以将 SKAction runBlock 与 SKNode - runAction :completion:? 函数结合起来吗?

swift - 为什么 SKSpriteNode 不能与 SKAction 一起使用?