我有一个非常简单的项目,使用SpriteKit,一个怪物被丢弃并穿过一个平台。在iPhone上,当怪物击中平台时,didBeginContact会被调用一次。然而,在iPad上,当怪物滑过平台时,该方法每秒被调用几次。为什么iPhone上没有问题但是iPad上的马车?我已经在模拟器和实际的iPad上进行了测试。
这是我设置类别的地方
static const uint32_t playerCategory = 0x1 << 0;
static const uint32_t bulletCategory = 0x1 << 1;
static const uint32_t monsterCategory = 0x1 << 2;
static const uint32_t platformCategory = 0x1 << 3;
static const uint32_t worldCategory = 0x1 << 4;
以下是怪物的设置
enemy.physicsBody.dynamic = YES;
enemy.physicsBody.affectedByGravity = YES;
enemy.physicsBody.allowsRotation = NO;
enemy.physicsBody.categoryBitMask = monsterCategory;
enemy.physicsBody.contactTestBitMask = worldCategory & platformCategory & bulletCategory;
enemy.physicsBody.collisionBitMask = platformCategory;
怪物如何被移动
enemy.physicsBody.velocity = CGVectorMake(100, 0);
以下是我知道不断调用didBeginContact的方法。我每秒都会得到一次日志,说怪物击中平台。我需要在以后实施新事物时解决此问题。
if (firstBody.categoryBitMask == monsterCategory && secondBody.categoryBitMask == platformCategory) { NSLog(@"Monster Hit Platform"); }
答案 0 :(得分:2)
enemy.physicsBody.restitution = 0;
platform.physicsBody.restitution = 0;
这是“bounciness”财产。这样,当敌人和平台发生碰撞时,不会有很少的弹跳触发多个接触事件。
我还看到建议使用applyImpulse而不是手动设置速度。