精灵套件精确碰撞错误

时间:2015-08-27 12:42:36

标签: sprite-kit collision skphysicsbody

我创造了一个英雄节点和敌人节点,当它们发生碰撞时,游戏结束。但是我遇到了精确碰撞的问题。有时会出现重叠。有时候当一个节点没有到达另一个节点时会发生冲突。任何人都可以给我一些建议吗?感谢你的帮助〜

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

以下是我的一些代码:

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


    }
}

我在更新方法中创建了很多敌人:(我也试过自己的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];
    }

}

1 个答案:

答案 0 :(得分:0)

在你的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]];