是否可以在spriteKit中停用物理实体中的碰撞?

Alf*_*fro 12 ios sprite-kit

我正在寻找在我的spriteKit游戏中为我的英雄收集物品的最好方法,并且在尝试了几种方法之后,我的结论是最好的方法是有物理身体的物品可以检测到碰撞,但不会与我的英雄发生碰撞.有可能吗?停用物理机构的碰撞而不停用其检测碰撞的能力?听起来有点矛盾我知道......因为,另一种方法是只创建一个没有物理体的SKSpriteNode,然后就不会发生碰撞,但是"检测"碰撞的方式将是手工制作的,而且要困难得多,因为我需要在我的英雄中设置坐标系检测,当他将在那些细节坐标(在项目上)时,我将使项目消失.如何更轻松地了解如何做到这两种方式中的任何一种?

Cor*_*rey 21

退房collisionBitMask,categoryBitMaskcontactTestBitMaskSKPhysicsBody类.

从本质上讲,具有相同collisionBitMask价值的物理机构将相互"传递".

  • 更正:如果类别和碰撞位匹配,它们将相互作用.如果它们不匹配,那两个将不会相互作用.如果碰撞位和类别位 为零,那么该项目当然不会与任何内容交互.

然后,设置categoryBitMaskcontactTestBitMask值以SKPhysicsContact在联系人上创建对象.最后,您的班级应该采用该SKPhysicsContactDelegate协议.使用该- 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;
}
Run Code Online (Sandbox Code Playgroud)


And*_*eev 8

简短回答:

yourHero.physicsBody.collisionBitMask = 0;
Run Code Online (Sandbox Code Playgroud)

默认值为collisionBitMask0xFFFFFFFF(所有位都设置),这就是节点与其他节点冲突的原因