使精灵变形直到纹理不再连续 - 如何保持接触检测?

Posted

技术标签:

【中文标题】使精灵变形直到纹理不再连续 - 如何保持接触检测?【英文标题】:Deforming a sprite until texture no longer contiguous - how to maintain contact -detection? 【发布时间】:2016-09-19 12:05:23 【问题描述】:

仍在制作我的太空入侵者克隆,我想在屏幕底部添加可破坏的基地:

我已经想出了如何通过让炸弹和盾牌相互接触来修改盾牌的外观,然后在 didBegincontact 中,从炸弹爆炸的掩码和盾牌的当前纹理创建一个 SKCropNode 和然后使用视图的texture(from: node) 方法获取渲染纹理,并从新纹理更新盾牌的纹理和物理体。

但是 - 当盾牌的中心有一个洞,使得盾牌的纹理不再是连续的(例如图片中最左边的盾牌),生成的physicsBody 只覆盖左边的部分纹理。因此,不会检测到任何击中盾牌右侧的炸弹。

我怎样才能让我的盾牌分裂成多块并保持接触检测工作?

可能的解决方案:

不知何故扫描新纹理并创建多个physicsBoies 使用分配给单个 SKSpriteNode SKPhysicsbody(bodies: [SKPhysicsBody])。如果,正如它所显示的那样, SKPhysicsBody 从纹理的左上角生成,然后 可能将纹理旋转 90 度 4 次以生成 4 物理体?

使用某种 alpha 掩码(以便 shiled 是明确的)并保持屏蔽的物理主体在 原始形状,当调用 dBC 时,检查像素的颜色 在接触点/炸弹下方 - 如果他们“清楚”,则采取 不采取任何行动,让炸弹畅通无阻地落下,直到 调用 didEndContact 表示炸弹已清除 盾牌。

在炸弹和盾牌之间使用一个简单的intersectsRect 然后检查炸弹下的像素颜色 - 如果清楚,不要做 任何东西。

================================================ ====

更新:请参阅下文,了解未拆分时精灵纹理损坏的工作情况。棕色底座是显示第一次损坏的原始底座(physicsBody 显示原始底座,纹理显示 dame)。绿色基地已经重新计算了它的物理体:

更新:纹理分割时的物理体见下文。棕色是原始盾牌,小凹痕是“新”伤害。 physicsBody 只映射到图像的左侧部分。

【问题讨论】:

你应该只是使用 SKPhysicsBody(texture),每次你的盾牌纹理发生变化时,给它一个新的身体,如果它没有形成正确的身体,那么将新的纹理放入一个临时精灵节点,这样你就可以看到正在生成什么,我几乎肯定我之前创建了中间有洞的身体。 @Knight0fDragon - 不起作用????除非我做错了什么。查看我的更新。 当我有时间看我想出什么 @Knight0fDragon - 谢谢。我添加了一个屏幕截图来显示炸弹损坏/cropnode 技巧的工作原理。如果你想要一份副本,我有一个 Xcode Playground 来测试它。 刚玩了一下,好像做不到 【参考方案1】:

所以我放弃了对底座的 SKTexture 进行变形,而是将底座实现为大约 30 个小块,每个小块都有自己的物理体,一旦被击中,每个块都会被完全移除。

我担心性能,但这些是静态块,到目前为止,性能仍然不错。整体图形效果还可以:

我可能会更改方块纹理以赋予它们粗糙的边缘,并尝试将每个方块的纹理替换为第一次被击中时更小、更损坏的纹理,以获得更易碎的外观。

【讨论】:

很高兴知道。你测试过的最低设备是什么? 目前只有我的 6s。 卫生署!这是有史以来第二快的手机。仅被 7 击败。低分辨率和 CPU/GPU 组合,流畅度惊人。也许 iPhone SE 的速度要快一些。如果你能找到一部二手且便宜的,iPhone 6 Plus 就是新的 iPhone 4。它很难。 @Confused - 好点。我刚刚用 ios 9.3 启动了我的旧 iPhone 5(不是“s”),它在上面运行得非常完美,丝毫没有减速的迹象。 成就解锁!那个抽屉里还有什么?我怀疑是 Palm Trio,但没有黑莓 ;)

以上是关于使精灵变形直到纹理不再连续 - 如何保持接触检测?的主要内容,如果未能解决你的问题,请参考以下文章

如何使精灵适合多个设备的整个屏幕

在 cocos2d 精灵中访问纹理的矩形

如何避免 SpriteKit 中的平滑效果?

在 SpriteKit 项目中使用精灵图集、纹理图集或资产目录

使用精灵套件游戏覆盖功能

如何使用纹理包调整精灵的位置