Cocos 2D Chipmunk - 碰撞动画时忽略碰撞

时间:2014-08-21 14:00:21

标签: ios objective-c cocos2d-iphone chipmunk

最近我的sidescroller游戏在碰撞时开始出现奇怪的行为。

在使主题更清晰的主题中:

  • 我有我的英雄,这是一个CCNode,有一个物理身体。她还有一个CCSpriteNode来表示它的形状,还有另一个CCNode来处理她和地面之间的碰撞。
  • 我有一个具有类似结构的敌人,除了另一个节点代表其近战武器。当敌人攻击时,其武器由关键帧序列激活,并且物理身体被添加到其中。两个物理机构的代码是:

Hero.m

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

}

Enemy.m

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

1 个答案:

答案 0 :(得分:0)

我发现了什么问题。

动画的物理体必须是运动学类型,即使两个速度均为0,也要对其进行碰撞处理。

self.attackNode.physicsBody.type = CCPhysicsBodyTypeKinematic;
相关问题