Cocos 2D Chipmunk — столкновение игнорируется, когда столкновение анимировано.

недавно моя игра с боковой прокруткой начала вести себя странно, когда дело доходит до столкновений.

В темах, чтобы было понятнее:

  • У меня есть герой, то есть 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;
}

}

ПРОБЛЕМА

Это столкновение просто происходит, когда оба тела двигаются, если герой остановлен, а оружие приближается к нему, столкновение просто игнорируется, и метод делегата для его обработки не вызывается, очевидно.

Иногда это происходит не один раз, после первого столкновения это видно на следующем видео:

http://youtu.be/r1WTRjj_gQU

РЕШЕНО

Анимируемое физическое тело должно быть кинематического типа, чтобы его столкновение обрабатывалось, даже если обе скорости равны 0.

self.attackNode.physicsBody.type = CCPhysicsBodyTypeKinematic;

person Felipe Jun    schedule 21.08.2014    source источник
comment
вы должны опубликовать свое решение как ответ, а не редактировать вопрос   -  person LearnCocos2D    schedule 21.08.2014


Ответы (1)


Я узнал, что было не так.

Анимируемое физическое тело должно быть кинематического типа, чтобы его столкновение обрабатывалось, даже если обе скорости равны 0.

self.attackNode.physicsBody.type = CCPhysicsBodyTypeKinematic;
person Felipe Jun    schedule 21.08.2014