【发布时间】: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;
}
}
问题是
这种碰撞只发生在两个物体都在移动时,如果英雄停止,并且武器朝它靠近,碰撞就会被忽略,并且显然不会调用处理它的委托方法。
有时会发生不止一次,在第一次碰撞后,可以在以下视频中看到:
已解决
动画的物理实体必须是运动学类型才能处理其碰撞,即使两个速度均为 0。
self.attackNode.physicsBody.type = CCPhysicsBodyTypeKinematic;
【问题讨论】:
-
您应该将您的解决方案作为答案发布,而不是编辑问题
标签: ios objective-c cocos2d-iphone chipmunk