当前位置: 首页 > 知识库问答 >
问题:

多个碰撞的精灵套件碰撞

鲜于德业
2023-03-14

我已经寻找并找到了单个碰撞的答案,但我正在寻找一种检测多种类型的碰撞的方法。我正在制作一个游戏,其中有3个我想要的碰撞。用户飞机与敌方子弹相撞,用户子弹与敌机相撞(我已经工作过),敌方子弹与用户子弹相撞。我已经设置并更正了所有类别BitMask和contactTestBitMask。这是我的委托方法。

 - (void) didBeginContact:(SKPhysicsContact *)contact {

SKPhysicsBody *firstBody, *secondBody;


if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
    firstBody = contact.bodyA;
    secondBody = contact.bodyB;
}
else
{
    firstBody = contact.bodyB;
    secondBody = contact.bodyA;
}

// if user plane hits enemy bullet
if ((firstBody.categoryBitMask == playerShipCategory) &&
    (secondBody.categoryBitMask == enemyBulletCategory)) {

    [self takeDamageByAmount:POINT_INCREMENTER];
    [_enemyBullet removeFromParent];
    SKAction *bounce = [SKAction sequence:@[
                                            [SKAction fadeAlphaTo:.5 duration:.2],
                                            [SKAction fadeAlphaTo:1.0 duration:.2],
                                            [SKAction fadeAlphaTo:.5 duration:.2],
                                            [SKAction fadeAlphaTo:1.0 duration:.2]
                                            ]];
    [_playerPlane runAction:bounce];
}

// if the user bullet hits the enemy bullet
else if ((firstBody.categoryBitMask == bulletCategory) &&
   (secondBody.categoryBitMask == enemyBulletCategory)) {
    [_enemyBullet removeFromParent];
    [_bullet removeFromParent];
}

// if bullet hits enemy ship - THIS ONE WORKS, but none of the others work for some reason
else if ((firstBody.categoryBitMask == bulletCategory) &&
    (secondBody.categoryBitMask == enemyShipCategory)) {

    [self gainPointsByAmoint:POINT_INCREMENTER];
    [self projectile:(SKSpriteNode *)firstBody.node didCollideWithMonster:(SKSpriteNode *)secondBody.node];
}
}

共有1个答案

韩自怡
2023-03-14

这应该可以工作,已经测试过了,可以工作

//Define the collider Category

  typedef NS_ENUM(uint32_t, CollisionType) {
    enemyShipCategory        = 0x1 << 0,
    enemyBulletCategory      = 0x1 << 1,
    playerShipCategory       = 0x1 << 2,
    bulletCategory           = 0x1 << 3,
  };


// Set the category that this physics body belongs to 
// and specify which categories of bodies cause intersection 
// notifications with this physics body

  ship.physicsBody.categoryBitMask = playerShipCategory;       
  ship.physicsBody.contactTestBitMask = enemyBulletCategory;

  shipBullet.physicsBody.categoryBitMask = bulletCategory;
  shipBullet.physicsBody.contactTestBitMask = enemyShipCategory | enemyBulletCategory;

  enemy.physicsBody.categoryBitMask = enemyShipCategory;
  enemy.physicsBody.contactTestBitMask = bulletCategory;

  enemyBullet.PhysicsBody.categoryBitMask = enemyBulletCategory;
  enemyBullet.physicsBody.contactTestBitMask = bulletCategory;

// And handle Collisions

- (void)didBeginContact:(SKPhysicsContact *)contact {
  uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);

  if (collision == (playerShipCategory | enemyBulletCategory)) {
    SKNode *Ship, *bullet;

    if (contact.bodyA.categoryBitMask == playerShipCategory) {
      Ship = contact.bodyA.node;
      bullet = contact.bodyB.node;
    } else {
      Ship = contact.bodyB.node;
      bullet = contact.bodyA.node;
    }

    [self takeDamageByAmount:POINT_INCREMENTER];
    [bullet removeFromParent];

    SKAction *bounce = [SKAction sequence:@[
      [SKAction fadeAlphaTo:.5 duration:.2],
      [SKAction fadeAlphaTo:1.0 duration:.2],
      [SKAction fadeAlphaTo:.5 duration:.2],
      [SKAction fadeAlphaTo:1.0 duration:.2]
    ]];

    [Ship runAction:bounce];
  }

  else if (collision == (bulletCategory | enemyBulletCategory)) {
    [contact.bodyA.node removeFromParent];
    [contact.bodyB.node removeFromParent];
  }

  else if (collision == (bulletCategory | enemyShipCategory)) {
    SKNode *shipBullet, *enemyShip;

    if (contact.bodyA.categoryBitMask == shipBullet) {
      shipBullet = contact.bodyA.node;
      enemyShip = contact.bodyB.node;
    } else {
      shipBullet = contact.bodyB.node;
      enemyShip = contact.bodyA.node;
    }

    [self gainPointsByAmoint:POINT_INCREMENTER];
    [self projectile:shipBullet didCollideWithMonster:enemyShip];
  }
}

祝你好运!!

 类似资料:
  • 我是IOS开发的新手,目前在didBeginContact方法中遇到一些sprite工具包冲突问题。 如果一个碰撞的物理物体被移走了,我如何摆脱或者停止didBeginContact的运行?例:一颗子弹与两个重叠的敌人相撞。因为子弹击中第一个敌人并被摧毁,所以在第二个敌人上运行的碰撞检查抛出异常,因为子弹不再存在。 我试过检查nil和NSNULL值,但运气不好。我收到的错误代码是“线程1:EXC_

  • 这就是正在发生的事情,游戏不断停止,因为两个圆圈相互碰撞,我正在尝试通过确保ID是正方形ID来防止这种情况,我试图让圆圈碰撞在一起,而忽略碰撞,但它没有这样做,我不知道如何确切地阻止它相互碰撞,只允许它与正方形碰撞。 基本上我想阻止这个圆与另一个圆碰撞,并允许它与正方形碰撞。 任何帮助都会很好谢谢 游戏引擎引擎类 这是我在扩展game.engine.engine包的game类中检查冲突的地方。 游

  • 我正在使用Sprite Kit中的碰撞检测。它在起作用,防止我的精灵穿越路径。然而,我在didBeginContact中没有收到通知:而且我似乎无法控制物理引擎在发生碰撞时的响应。 我让各种汽车(SKSpriteNodes)使用SKAction followPath沿着以下路径行驶:as offset:oriento path:duration: 以前,如果两辆车相交,它们都会像往常一样继续行驶,

  • 在get_hit=pyGame.sprite的第82行,我检查sprite碰撞的移动时,它会给出错误提示:“:File”c:\Users\pc\VS_PYTHON_PY\pyGame.PY“。”。spritecollide(Player,敌方,True)文件“C:\python py\lib\site packages\pygame\sprite.py”,第1682行,位于spritecrolli

  • 我在PyGame中创建了两个简单的精灵,其中一个是雨伞,另一个是雨滴。雨滴被添加到一个名为< code>all_sprites的sprite组中。伞精灵有自己的组,名为< code>Umbrella_sprite 雨滴从屏幕顶部“落下”,如果其中一个碰到雨伞/与雨伞碰撞..雨滴应该被删除了。但是除了特定雨滴之外,所有其他雨滴都受此影响。

  • 我一直在学习一些pygame教程,并且基于这些教程开发了自己的代码。具体如下: 所以我想出了如何让我的家伙跳跃,但是我已经在天空中放置了一个块并试图这样做: 试图让角色停止跳跃。有没有一个内置的函数来测试这一点,或者有没有一个适合我的方法。顺便说一下,这是行不通的,我似乎也不知道该怎么做。非常感谢任何帮助:)