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-我添加了代码以创建一个以上形状的物理实体。请记住,如果两个实体之间有间隙,例如子弹穿过间隙,则不会触发碰撞。