精灵套件的精确碰撞错误

precise collision error with sprite kit

我创建了一个英雄节点和敌人节点,当它们碰撞时,游戏 over.But我有精确碰撞的问题。有时,当一个节点未到达另一节点的帧时,会发生 overlap.Sometimes 冲突。有人可以给我一些建议吗?感谢您的帮助~

我的英雄受重力影响,点击时会改变重力方向。

以下是我的部分代码:

-(void)addRectHero {
rectHero = [SKSpriteNode spriteNodeWithImageNamed:@“hero.png”];

rectHero.scale = 0.2;
rectHero.position = CGPointMake(self.size.width/2, self.size.height*0.3);
rectHero.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:rectHero.size];
rectHero.physicsBody.restitution = 0.0;
rectHero.physicsBody.allowsRotation = NO;

rectHero.physicsBody.dynamic = YES;
rectHero.physicsBody.affectedByGravity=NO;

rectHero.physicsBody.categoryBitMask = heroCategory;
rectHero.physicsBody.contactTestBitMask = enemyCategory;
rectHero.zPosition = 100;
rectHero.physicsBody.collisionBitMask = enemyCategory;
rectHero.physicsBody.usesPreciseCollisionDetection = YES;

[self addChild:rectHero];

}

-(void)createEnemy{


randomStartPoint =(float)((random()%(int)(self.size.height/3))+self.size.height/3);
startPoint = CGPointMake(self.size.width + 50, randomStartPoint);  



enemyNode = [SKSpriteNode spriteNodeWithImageNamed:@"enemy_4.png"];

enemyNode.scale =0.5;


enemyNode.position = startPoint;
enemyNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:enemyNode.size];
enemyNode.physicsBody.dynamic = NO;
enemyNode.physicsBody.categoryBitMask = enemyCategory;
enemyNode.physicsBody.contactTestBitMask = heroCategory;
enemyNode.physicsBody.collisionBitMask = heroCategory;
enemyNode.physicsBody.usesPreciseCollisionDetection = YES;
enemyNode.physicsBody.allowsRotation = NO;
enemyNode.physicsBody.restitution = 0.0;

enemyNode.name = @"enemy";


[self addChild:enemyNode];

}


-(void)didBeginContact:(SKPhysicsContact *)contact{
if (!_gameIsOn) {
    return;
}

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




if (firstBody.categoryBitMask == heroCategory && secondBody.categoryBitMask == enemyCategory) {

   [self runAction:sound_play completion:^{
        [self gameOver];

    }];

    [self stopTimer];


    }
}

我在update方法中创建了很多敌人:(我也试过self repeatActionForever方法创建敌人但是问题依然存在)

-(void)update:(CFTimeInterval)currentTime {


if (_lastTime)
{
    _dt = currentTime - _lastTime;
}
else
{
    _dt = 0;
}
_lastTime = currentTime;


if( currentTime - _lastEnemyAdded > 1 && _gameIsOn)
{
    _lastEnemyAdded = currentTime + 1;
    [self createEnemy];
    }

}

在您的 ViewController 中确保您再次 skView.showsPhysics = YES; 运行 您的游戏并查看您的物理体是否符合您的预期。听起来你正在创造一个比你想要的更大的物理 body。

如果问题最终变得比预期的物理量大 body,请尝试创建一个物理量 body,如下所示:

// to create a circular physics body
self.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:10 center:CGPointMake(0, 0)];

// to create a rect physics body
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(20, 20) center:CGPointMake(0, 0)];

使用中心坐标将body正确居中。

要创建由多个形状组成的物理 body,您可以这样做:

SKPhysicsBody *firstBody = [SKPhysicsBody bodyWithCircleOfRadius:20 center:CGPointMake(0, 0)];
SKPhysicsBody *secondBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(20, 20) center:CGPointMake(0, 20)];
self.physicsBody = [SKPhysicsBody bodyWithBodies:@[firstBody, secondBody]];