ios - 是否可以在 spriteKit 中禁用物理体中的碰撞?

标签 ios sprite-kit

我正在考虑用我的英雄在我的 spriteKit 游戏中为 iOs 收集元素的最佳方法,在尝试了几种方法之后,我的结论是最好的方法是让一个元素带有可以检测碰撞但不与我的英雄碰撞的物理体。有可能做到吗?停用物理体的碰撞而不停用其检测碰撞的能力??我知道这听起来有点矛盾……因为,另一种方法是只创建一个没有物理 body 的 SKSpriteNode,这样就不会发生碰撞,但是“检测”碰撞的方法将是手工制作的,而且更难,因为我需要在我的英雄中设置坐标系检测,当他处于那些特定坐标(在项目上方)时,我会让项目消失。知道如何更轻松地执行这两种方法中的任何一种吗?

最佳答案

查看 collisionBitMask , categoryBitMask , 和 contactTestBitMaskSKPhysicsBody 类中。

本质上,具有相同 collisionBitMask 值的物理体将相互“传递”。

  • 更正:如果类别和冲突位匹配,它们将相互作用。如果它们不匹配,那两者将互动。如果碰撞位和类别位,那么该项目当然不会与任何事物交互.

然后,您设置 categoryBitMaskcontactTestBitMask 值以在接触时创建一个 SKPhysicsContact 对象。最后,您的类应采用 SKPhysicsContactDelegate 协议(protocol)。使用 - didBeginContact: 方法检测和处理 SKPhysicsContact 对象。

static const uint8_t heroCategory = 1;
static const uint8_t foodCategory = 2;
--
food.physicsBody.categoryBitMask = foodCategory;
food.physicsBody.contactTestBitMask = heroCategory;
food.physicsBody.collisionBitMask = 0;
--
hero.physicsBody.categoryBitMask = heroCategory;
hero.physicsBody.contactTestBitMask = foodCategory;
hero.physicsBody.collisionBitMask = 0;
--
-(void)didBeginContact:(SKPhysicsContact *)contact {
    SKPhysicsBody *firstBody = contact.bodyA;
    SKPhysicsBody *secondBody = contact.bodyB;
}

关于ios - 是否可以在 spriteKit 中禁用物理体中的碰撞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21267600/

相关文章:

iphone - 在 4.3.3 设备上从 xcode 构建/运行 IOS 5.0

javascript - 是否可以使用 HTML/Javascript 按名称启动应用程序?

swift - 如何使物理体粘附在节点 anchor 上

swift - 我怎样才能制作像数字 8 这样的路径(SpriteKit,Swift)

ios - 如何将 SKScene 添加到 SCNNode 平面?

ios - 嵌套的 performBlock : on NSManagedObjectContext

ios - 如何仅更改字典键?没有 swift 改变值(value)

添加其他本地化时,IOS 字符串本地化停止工作

ios - 在没有 SKAction.Sequence 的情况下按顺序运行两个 SKActions(确保一个完成,等待然后运行另一个)

swift - 从 SKScene 呈现 UIViewController 显示黑屏