недавно моя игра с боковой прокруткой начала вести себя странно, когда дело доходит до столкновений.
В темах, чтобы было понятнее:
- У меня есть герой, то есть CCNode, имеющий физическое тело. У нее также есть CCSpriteNode для представления ее формы и еще один CCNode для обработки столкновений между ней и землей.
- У меня есть враг с похожей структурой, за исключением еще одного узла, представляющего его оружие ближнего боя. Когда противник атакует, его оружие анимируется последовательностью ключевых кадров, и к нему добавляется физическое тело. Коды для обоих физических тел:
Герой.м
-(void)didLoadFromCCB{
self.physicsBody.collisionType = @"sophy";
self.physicsBody.collisionCategories = @[@"sophy"];
self.physicsBody.collisionMask = @[@"ground",@"rockWall",@"pit", @"orb",@"enemyAttack"];
self.summoningPillar = NO;
self.footNode = [self getChildByName:@"footsensor" recursively:NO];
self.footPosition = self.footNode.position;
self.foot = self.footNode.physicsBody;
self.foot.sensor = YES;
self.foot.collisionType = @"foot";
self.foot.collisionCategories = @[@"foot"];
self.foot.collisionMask = @[@"ground"];
CCPhysicsJoint* ankle = [CCPhysicsJoint connectedPivotJointWithBodyA:self.physicsBody bodyB:self.foot anchorA:self.footNode.position];
ankle.collideBodies = NO;
self.animationManager.delegate = self;
}
Враг.м
-(void)setAttacking:(BOOL)attacking{
if (self.attacking == YES && attacking==YES) return;
_attacking = attacking;
if (attacking){
self.attackNode.name = @"sickle";
self.attackNode.physicsBody = [CCPhysicsBody bodyWithCircleOfRadius:30 andCenter:ccp(-10,0)];
self.attackNode.physicsBody.affectedByGravity = NO;
self.attackNode.physicsBody.allowsRotation = NO;
self.attackNode.physicsBody.type = CCPhysicsBodyTypeStatic;
self.attackNode.physicsBody.sensor = YES;
self.attackNode.physicsBody.collisionCategories = nil;
self.attackNode.physicsBody.collisionType = @"enemyAttack";
self.attackNode.physicsBody.collisionCategories = @[@"enemyAttack"];
self.attackNode.physicsBody.collisionMask = @[@"sophy"];
}
else{
self.attackNode.physicsBody = nil;
}
}
ПРОБЛЕМА
Это столкновение просто происходит, когда оба тела двигаются, если герой остановлен, а оружие приближается к нему, столкновение просто игнорируется, и метод делегата для его обработки не вызывается, очевидно.
Иногда это происходит не один раз, после первого столкновения это видно на следующем видео:
РЕШЕНО
Анимируемое физическое тело должно быть кинематического типа, чтобы его столкновение обрабатывалось, даже если обе скорости равны 0.
self.attackNode.physicsBody.type = CCPhysicsBodyTypeKinematic;