【问题标题】:Cocos 2D Chipmunk - Collision ignored when collision is animatedCocos 2D Chipmunk - 碰撞动画时忽略碰撞
【发布时间】:2014-08-21 14:00:20
【问题描述】:

最近,我的横向卷轴游戏在碰撞时开始出现奇怪的行为。

在主题中使其更清晰:

  • 我有我的英雄,即 CCNode,有一个物理体。她还有一个 CCSpriteNode 来表示其形状,另一个 CCNode 来处理她与地面之间的碰撞。
  • 我有一个结构相似的敌人,除了另一个节点来代表它的近战武器。当敌人攻击时,它的武器会被一个关键帧序列动画化,并添加一个实体。两个物理体的代码是:

英雄.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;

}

敌人.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;

【问题讨论】:

  • 您应该将您的解决方案作为答案发布,而不是编辑问题

标签: ios objective-c cocos2d-iphone chipmunk


【解决方案1】:

我发现出了什么问题。

动画的物理实体必须是运动学类型才能处理其碰撞,即使两个速度均为 0。

self.attackNode.physicsBody.type = CCPhysicsBodyTypeKinematic;

【讨论】:

    猜你喜欢
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 2014-04-16
    • 2011-10-15
    相关资源
    最近更新 更多