首页 文章

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

提问于
浏览
11

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

4 回答

  • 8

    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;
    
  • 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

    简短回答:

    yourHero.physicsBody.collisionBitMask = 0;
    

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

  • 20

    查看 SKPhysicsBody 类中的collisionBitMaskcategoryBitMaskcontactTestBitMask .

    基本上,具有相同 collisionBitMask 值的物理实体将彼此相互配合 .

    • Correction: 如果类别和碰撞位 match ,它们将相互作用 . 如果他们做了 not match ,那两个人将会互动 . 如果碰撞位和类别位是 both zero ,当然该项目将为 interact with nothing whatsoever .

    然后,设置 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;
    }
    

相关问题