我正在考虑用我的英雄在我的 spriteKit 游戏中为 iOs 收集元素的最佳方法,在尝试了几种方法之后,我的结论是最好的方法是让一个元素带有可以检测碰撞但不与我的英雄碰撞的物理体。有可能做到吗?停用物理体的碰撞而不停用其检测碰撞的能力??我知道这听起来有点矛盾……因为,另一种方法是只创建一个没有物理 body 的 SKSpriteNode,这样就不会发生碰撞,但是“检测”碰撞的方法将是手工制作的,而且更难,因为我需要在我的英雄中设置坐标系检测,当他处于那些特定坐标(在项目上方)时,我会让项目消失。知道如何更轻松地执行这两种方法中的任何一种吗?
最佳答案
查看 collisionBitMask , categoryBitMask , 和 contactTestBitMask在 SKPhysicsBody
类中。
本质上,具有相同 collisionBitMask
值的物理体将相互“传递”。
- 更正:如果类别和冲突位匹配,它们将相互作用。如果它们不匹配,那两者将不互动。如果碰撞位和类别位都零,那么该项目当然不会与任何事物交互.
然后,您设置 categoryBitMask
和 contactTestBitMask
值以在接触时创建一个 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/