Sprite kit 与sprite套件的精确碰撞错误

Sprite kit 与sprite套件的精确碰撞错误,sprite-kit,collision,skphysicsbody,Sprite Kit,Collision,Skphysicsbody,我已经创建了一个英雄节点和敌人节点,当它们碰撞时,游戏结束。但我在精确碰撞方面有问题。有时会有重叠,有时当一个节点没有到达另一个节点的帧时会发生碰撞。谁能给我一些建议吗?谢谢你的帮助~ 我的英雄受到地心引力的影响,当点击时,它会改变地心引力的方向 以下是我的一些代码: -(void)addRectHero { rectHero = [SKSpriteNode spriteNodeWithImageNamed:@“hero.png”]; rectHero.scale = 0.2; rectHer

我已经创建了一个英雄节点和敌人节点,当它们碰撞时,游戏结束。但我在精确碰撞方面有问题。有时会有重叠,有时当一个节点没有到达另一个节点的帧时会发生碰撞。谁能给我一些建议吗?谢谢你的帮助~

我的英雄受到地心引力的影响,当点击时,它会改变地心引力的方向

以下是我的一些代码:

-(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];


    }
}

在ViewController中,确保有
skView.showsPhysics=YES
如果问题最终是一个大于预期的物理实体,请尝试创建如下物理实体:

// 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)];
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]];
使用中心坐标使主体正确居中

要创建由多个形状组成的物理实体,可以执行以下操作:

// 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)];
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]];

在ViewController中,确保有
skView.showsPhysics=YES
如果问题最终是一个大于预期的物理实体,请尝试创建如下物理实体:

// 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)];
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]];
使用中心坐标使主体正确居中

要创建由多个形状组成的物理实体,可以执行以下操作:

// 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)];
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]];

如果您创建并添加了一个与现有节点重叠的节点,您将不会得到一个联系人标志。@sangony我的意思是节点的某些部分重叠,而不是通过。碰撞发生了,但不是那么精确。我不明白你在说什么。碰撞要么发生,要么不发生。“不那么准确”是什么意思?@sangony很抱歉解释得不好。。。。。。在我的理解中,sprite_1应该到达sprite_2的边缘(每个图像都有特定的形状),然后它们发生碰撞。但是我的游戏的碰撞发生在两个节点看起来像是它们之间的间隙时…它们应该更靠近碰撞…我在想我是否对physicsbody设置了错误的方法…@sangony我希望它们在sprite_1的图像边缘到达sprite_2的图像边缘时发生碰撞。如果创建并添加一个与现有节点,您将无法获得联系人标志。@sangony我的意思是节点的某些部分重叠,而不是通过。碰撞发生了,但不是那么精确。我不明白你在说什么。碰撞要么发生,要么不发生。“不那么准确”是什么意思?@sangony很抱歉解释得不好。。。。。。在我的理解中,sprite_1应该到达sprite_2的边缘(每个图像都有特定的形状),然后它们发生碰撞。但是我的游戏的碰撞发生在两个节点看起来像是它们之间的间隙时…它们应该靠近碰撞…我在想我是否设置了错误的物理体方法…@sangony我希望它们在精灵1的图像边缘到达精灵2的图像边缘时发生碰撞。但是如何设置不规则的物理体呢形状,就像它的顶部是一个圆形,底部是一个圆形rect@karenkey-我添加了代码以创建一个以上形状的物理实体。请记住,如果两个实体之间有间隙,例如子弹穿过间隙,则不会触发碰撞。但是如何设置形状不规则的物理实体,例如顶部为圆形,底部为圆形rect@karenkey-我添加了代码以创建一个以上形状的物理实体。请记住,如果两个实体之间有间隙,例如子弹穿过间隙,则不会触发碰撞。