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

时间:2014-01-21 19:44:28

标签: ios sprite-kit

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

4 个答案:

答案 0 :(得分:21)

查看SKPhysicsBody课程中的collisionBitMaskcategoryBitMaskcontactTestBitMask

基本上,具有相同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;
}

答案 1 :(得分:8)

简短回答:

yourHero.physicsBody.collisionBitMask = 0;

collisionBitMask的默认值是0xFFFFFFFF(设置了所有位),这就是节点与其他节点冲突的原因

答案 2 :(得分:3)

你可以通过设置播放器的categoryBitMask和contactBitMasks以及项目对象来做到这一点,但要确保你没有设置collisionBitMask来互相交互(见下文)

static const int playerCategory = 1;
static const int worldCategory = 2;
static const int objectCategory = 4;    

....

SKSpriteNode *player, *item;

....

player.physicsBody.categoryBitMask = playerCategory;
player.physicsBody.collisionBitMask = worldCategory;
player.physicsBody.contactTestBitMask = worldCategory;

....

item.physicsBody.categoryBitMask = objectCategory;
item.physicsBody.contactTestBitMask = playerCategory | worldCategory;
item.physicsBody.collisionBitMask = worldCategory;
通过这种方式,物理体将拾取玩家与世界物体,物品和世界物体之间的碰撞,但不会捕捉玩家与物品之间的碰撞。它将触发对didBeginContact的调用,您可以在其中删除项目节点,添加运行状况等。

希望这有帮助!

答案 3 :(得分:3)

contactTestBitMask用于触发didBeginContactcollisionBitMask用于激活节点上的物理。

// add a physics body
ship.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:ship.size.width/2];

// set the category for ship
ship.physicsBody.categoryBitMask = shipCategory;

// detect collisions with asteroids and edges
ship.physicsBody.contactTestBitMask = asteroidCategory | edgeCategory;

// physically collide with asteroids
ship.physicsBody.collisionBitMask = asteroidCategory;