我在Cocos2d制作游戏。到目前为止,一切都还可以。我使用Ray Wenderlich's教程来使碰撞检测正常工作。它可以工作,但每当一个'敌人'产生子弹被删除的地方(因为被删除的子弹击中目标,因此被删除),敌人也会被自动删除。我认为这是因为它没有删除为精灵声明的rect。注意,即使子弹被删除,它也可以通过多个敌人。任何帮助表示赞赏。谢谢!
编辑: 我发现了问题所在。我在计划中设置了拍摄方法:@selector方法,没有设置间隔。这意味着它可以快速发射子弹60fps。所以我只需点击一下即可获得两颗子弹。他们是如此接近,我花了一段时间才注意到它。我不会再犯那个错误!!!
答案 0 :(得分:1)
您使用以下代码吗? (来自How To Make A Simple iPhone Game with Cocos2D Tutorial)
- (void)update:(ccTime)dt {
NSMutableArray *projectilesToDelete = [[NSMutableArray alloc] init];
for (CCSprite *projectile in _projectiles) {
CGRect projectileRect = CGRectMake(
projectile.position.x - (projectile.contentSize.width/2),
projectile.position.y - (projectile.contentSize.height/2),
projectile.contentSize.width,
projectile.contentSize.height);
NSMutableArray *targetsToDelete = [[NSMutableArray alloc] init];
for (CCSprite *target in _targets) {
CGRect targetRect = CGRectMake(
target.position.x - (target.contentSize.width/2),
target.position.y - (target.contentSize.height/2),
target.contentSize.width,
target.contentSize.height);
if (CGRectIntersectsRect(projectileRect, targetRect)) {
[targetsToDelete addObject:target];
}
}
for (CCSprite *target in targetsToDelete) {
[_targets removeObject:target];
[self removeChild:target cleanup:YES];
}
if (targetsToDelete.count > 0) {
[projectilesToDelete addObject:projectile];
}
[targetsToDelete release];
}
for (CCSprite *projectile in projectilesToDelete) {
[_projectiles removeObject:projectile];
[self removeChild:projectile cleanup:YES];
}
[projectilesToDelete release];
}
每当“敌人”产生子弹被删除的地方时,敌人也会被自动删除。
听起来子弹已从图层中移除,但未从_projectiles数组中删除。
[_projectiles removeObject:projectile];
您确定此代码有效吗?
答案 1 :(得分:0)
Rect不是您子弹中的单独实体。 Rect是与项目符号关联的属性。一旦你的“子弹被删除”,矩形将不再有效。
您应该关注的是碰撞检查代码。
您可能希望用以下条件包围子弹碰撞检查代码:
if(bullet exists)
{
check for collision
}
由于您尚未发布代码,我只能在此处发布伪代码。也许如果您发布碰撞检查代码,我可以更详细地向您展示。