我正在寻找在我的spriteKit游戏中为我的英雄收集项目的最好方法,并且在尝试了几种方法之后,我的结论是最好的办法是让一个项目有一个可以检测碰撞但不与我的英雄碰撞的物理身体。有可能吗?停用物理机构的碰撞而不停用其检测碰撞的能力?听起来有点矛盾我知道......因为,另一种方法是只创建一个没有物理体的SKSpriteNode,然后就不会发生碰撞,但是“检测”碰撞的方法将是手工制作的,而且更加困难,因为我需要在我的英雄中设置坐标系检测,当他将在那些细节坐标(在项目上)时,我将使项目消失。如何更轻松地了解如何做到这两种方式中的任何一种?
答案 0 :(得分:21)
查看SKPhysicsBody
课程中的collisionBitMask,categoryBitMask和contactTestBitMask。
基本上,具有相同collisionBitMask
值的物理主体将"传递"彼此。
然后,您设置categoryBitMask
和contactTestBitMask
值以在联系时创建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
用于触发didBeginContact
。 collisionBitMask
用于激活节点上的物理。
// 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;