Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sprite kit 为什么在碰撞检查中有时会多次调用方法?_Sprite Kit_Collision Detection - Fatal编程技术网

Sprite kit 为什么在碰撞检查中有时会多次调用方法?

Sprite kit 为什么在碰撞检查中有时会多次调用方法?,sprite-kit,collision-detection,Sprite Kit,Collision Detection,像SpriteKit中的许多游戏程序员一样,我使用特定对象之间的碰撞检测来调用方法或设置属性。然而,有时我的行为会在碰撞中发生两次。下面是我的didBeginContact方法中的一个示例: uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask); if (collision == (WWPhysicsCategoryShip | WWPhysicsCategoryWeapon))

像SpriteKit中的许多游戏程序员一样,我使用特定对象之间的碰撞检测来调用方法或设置属性。然而,有时我的行为会在碰撞中发生两次。下面是我的didBeginContact方法中的一个示例:

uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);

if (collision == (WWPhysicsCategoryShip | WWPhysicsCategoryWeapon)) {
    SKNode *weapon = (contact.bodyA.categoryBitMask == WWPhysicsCategoryWeapon) ? contact.bodyA.node : contact.bodyB.node;
    [weapon removeFromParent];

    _localPlayerHP = _localPlayerHP - 5;
    NSLog(@"My Health is now at %i.", _localPlayerHP);
}
你会注意到我的船的生命值降低了5,并且与船接触的敌人武器被移除。但是在测试游戏时,我发现我的飞船的生命值通常会减少10,以5为增量(这表明我的“减少生命值”方法已经多次开火)。我觉得这很奇怪,因为武器在第一次接触时就被移除了。我如何确保每次接触只会使我的健康下降5次

也许你可以试试这个

if weapon.parent != nil {
     _localPlayerHP = _localPlayerHP - 5;
}
这个问题讨论了另一种方法,即在船只被击中后几秒钟内使其不受伤害


如何创建实体?如果将实体与多边形或纹理一起使用,则很可能形状在内部分解为凸面形状,并为每个形状生成碰撞事件,因此可以为单个实体获取多个事件