Ios NSArray removeObject删除阵列中的所有对象
我的项目创建了一个炸弹,一个爆炸,然后检查爆炸中的碰撞,最后删除在碰撞中没有被击中的炸弹。这将得到更详细的解释。下面的代码就是这样做的Ios NSArray removeObject删除阵列中的所有对象,ios,objective-c,cocos2d-iphone,nsmutablearray,nsarray,Ios,Objective C,Cocos2d Iphone,Nsmutablearray,Nsarray,我的项目创建了一个炸弹,一个爆炸,然后检查爆炸中的碰撞,最后删除在碰撞中没有被击中的炸弹。这将得到更详细的解释。下面的代码就是这样做的 -(void)placeBomb { NSLog(@"Bomb placed"); _circle = [[CCSprite alloc]initWithFile:@"Circle.png"]; CGPoint circle0position = ccp(_cat.position.x , _cat
-(void)placeBomb
{
NSLog(@"Bomb placed");
_circle = [[CCSprite alloc]initWithFile:@"Circle.png"];
CGPoint circle0position = ccp(_cat.position.x , _cat.position.y);
CGPoint c0TileCoordt = [self tileCoordForPosition:circle0position];
CGPoint c0TileCoord = [self positionForTileCoord:c0TileCoordt];
_circle.position = c0TileCoord;
[self addChild:_circle];
id fade = [CCScaleTo actionWithDuration:3.5 scale:0];
[_circle runAction:fade];
double delayInSeconds = 3.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self explosionFromPoint:c0TileCoordt withSprite:_circle];
});
}
- (BOOL)isLocationBombable:(CGPoint)tileCoord;
{
if ([self isValidTileCoord:tileCoord] && ![self isWallAtTileCoord:tileCoord])
{
return YES;
}
else
{
return NO;
}
}
-(void)explosionFromPoint:(CGPoint)explosionPoint withSprite:(CCSprite*)sprite;
{
//int
explosionLenght += 1;
if (explosionLenght >= 7) //Just for testing purposes, don't have a way to increase it naturally.
{
explosionLenght = 1;
}
BOOL topB = YES;
BOOL leftB = YES;
BOOL bottomB = YES;
BOOL rightB = YES;
int bombX = (explosionPoint.x + 1);
int bombY = (explosionPoint.y + 1);
int bombNegX = (explosionPoint.x - 1);
int bombNegY = (explosionPoint.y - 1);
CGPoint top = ccp(explosionPoint.x, bombY);
CGPoint left = ccp(bombNegX, explosionPoint.y);
CGPoint bottom = ccp(explosionPoint.x, bombNegY);
CGPoint right = ccp(bombX, explosionPoint.y);
if (![self isLocationBombable:top])
{topB = NO;}
if (![self isLocationBombable:left])
{leftB = NO;}
if (![self isLocationBombable:bottom])
{bottomB = NO;}
if (![self isLocationBombable:right])
{rightB = NO;}
for (int i = 0; i <= explosionLenght; i++) {
int bombX = (explosionPoint.x + i);
int bombY = (explosionPoint.y + i);
int bombNegX = (explosionPoint.x - i);
int bombNegY = (explosionPoint.y - i);
CGPoint top = ccp(explosionPoint.x, bombY);
CGPoint left = ccp(bombNegX, explosionPoint.y);
CGPoint bottom = ccp(explosionPoint.x, bombNegY);
CGPoint right = ccp(bombX, explosionPoint.y);
CCSprite *circleTop = [[CCSprite alloc]initWithFile:@"Circle.png"];
CCSprite *circleLeft = [[CCSprite alloc]initWithFile:@"Circle.png"];
CCSprite *circleBottom = [[CCSprite alloc]initWithFile:@"Circle.png"];
CCSprite *circleRight = [[CCSprite alloc]initWithFile:@"Circle.png"];
int scaleTime = 5;
if ([self isLocationBombable:top] && topB == YES)
{
circleTop.position = [self positionForTileCoord:top];
[self addChild:circleTop];
id fadeTop = [CCSequence actionOne:[CCMoveTo actionWithDuration:1 position:circleTop.position] two:[CCScaleTo actionWithDuration:scaleTime scale:0]];
[circleTop runAction:fadeTop];
}
if ([self isLocationBombable:left] && leftB == YES)
{
circleLeft.position = [self positionForTileCoord:left];
[self addChild:circleLeft];
id fadeLeft = [CCSequence actionOne:[CCMoveTo actionWithDuration:1 position:circleLeft.position] two:[CCScaleTo actionWithDuration:scaleTime scale:0]];
[circleLeft runAction:fadeLeft];
}
if ([self isLocationBombable:bottom] && bottomB == YES)
{
circleBottom.position = [self positionForTileCoord:bottom];
[self addChild:circleBottom];
id fadeBottom = [CCSequence actionOne:[CCMoveTo actionWithDuration:1 position:circleBottom.position] two:[CCScaleTo actionWithDuration:scaleTime scale:0]];
[circleBottom runAction:fadeBottom];
}
if ([self isLocationBombable:right] && rightB == YES)
{
circleRight.position = [self positionForTileCoord:right];
[self addChild:circleRight];
id fadeRight = [CCSequence actionOne:[CCMoveTo actionWithDuration:1 position:circleRight.position] two:[CCScaleTo actionWithDuration:scaleTime scale:0]];
[circleRight runAction:fadeRight];
}
}
[currentBombs addObject:sprite];
int a = [currentBombs count];
NSLog(@"cBCount: %i",a);
NSLog(@"Explosion done, call checkdamage");
[self schedule:@selector(checkDamageForBomb)];
[self performSelector:@selector(removeSprite:) withObject:sprite afterDelay:5];
}
-(void)removeSprite:(CCSprite *)sprite{
int aa = [currentBombs count];
NSLog(@"removeSprite startcall cbc: %i",aa);
if([currentBombs containsObject:sprite])
{
NSLog(@"Found sprite in array, deleted!");
[currentBombs removeObject:sprite];
int a = [currentBombs count];
NSLog(@"containObject cbc: %i",a);
}
else {
NSLog(@"Didn't find the object in array, didn't delete!");
int a = [currentBombs count];
NSLog(@"elseCO cbc: %i",a);
}
if (currentBombs.count == 0)
{
[self stopCheckDamage];
}
}
-(void)stopCheckDamage{
NSLog(@"StopCheckDamage");
[self unschedule:@selector(checkDamageForBomb)];
}
-(void)checkDamageForBomb{
for (CCSprite* bomb in currentBombs)
{
CGPoint bombPos = [self tileCoordForPosition:bomb.position];
for (int i = 0; i <= explosionLenght; i++) {
CGPoint playerPos = [self tileCoordForPosition:_cat.position];
int bombX = (bombPos.x + i);
int bombY = (bombPos.y + i);
int bombNegX = (bombPos.x - i);
int bombNegY = (bombPos.y - i);
CGPoint centre = bombPos;
CGPoint top = ccp(centre.x, bombY);
CGPoint left = ccp(bombNegX, centre.y);
CGPoint bottom = ccp(centre.x, bombNegY);
CGPoint right = ccp(bombX, centre.y);
//pastebin.com/biuQBfnv
if (CGPointEqualToPoint(top, playerPos) || CGPointEqualToPoint(left, playerPos) || CGPointEqualToPoint(bottom, playerPos) || CGPointEqualToPoint(right, playerPos))
{
playerHits += 1;
NSLog(@"Player hit %i",playerHits);
[currentBombs removeObject:bomb];
break;
}
}
}
}
如果您查看上面代码中的日志位置,您将看到它删除了两个,而不是我想要的那个。我怎样才能防止这种行为,或者将其定制为只杀死合适的精灵
编辑:澄清
我想,当我在-(void)explosionFromPoint:(CGPoint)explosionPoint中使用
精灵时,我使用了sprite:(CCSprite*)精灵这将以某种方式为对象提供一个唯一的ID,并知道我所说的是哪一个。我对编码还不熟悉。你在数组中有两次相同的精灵。这两个条目都将被删除。如果要使用removeObject
,则需要创建多个精灵对象。否则,您需要使用removeObjectAtIndex
如果阵列中有两个相同的精灵。这两个条目都将被删除。如果要使用removeObject
,则需要创建多个精灵对象。否则,您需要使用removeObjectAtIndex
代码中出现了一些错误。从数组中删除对象时,请尝试检查类似的内容。请执行以下操作:
if([currentBombs count]>1 )
[currentBombs removeObjectAtIndex:1];
如果你的代码运行良好。这只是从阵列中删除的一个对象。然后我建议您检查removeSprite
method printsprite
对象以检查出了什么问题
我认为,如果使用相同的sprite对象,可以使用标记值。代码中存在一些错误。从数组中删除对象时,请尝试检查类似的内容。请执行以下操作:
if([currentBombs count]>1 )
[currentBombs removeObjectAtIndex:1];
如果你的代码运行良好。这只是从阵列中删除的一个对象。然后我建议您检查removeSprite
method printsprite
对象以检查出了什么问题
如果使用相同的sprite对象,我认为可以使用标记值。提到的@HotLicks的问题是在数组中推送相同的实例。
您应该使用本地CCSprite
实例,以便您的预定调用将使用不同的实例。添加同一实例两次的原因是,placeBomb
在任何事情发生之前被调用两次,在第二次调用中,您将覆盖您创建的第一个实例。由于\u circle
在调用这两个计划任务时是一个指针\u circle
将指向这两个任务中的相同的实例
因此,改变:
_circle = [[CCSprite alloc]initWithFile:@"Circle.png"];
致:
并使用circle
更新方法的其余部分,而不是\u circle
正如@HotLicks所提到的问题是在数组中推送相同的实例。
您应该使用本地CCSprite
实例,以便您的预定调用将使用不同的实例。添加同一实例两次的原因是,placeBomb
在任何事情发生之前被调用两次,在第二次调用中,您将覆盖您创建的第一个实例。由于\u circle
在调用这两个计划任务时是一个指针\u circle
将指向这两个任务中的相同的实例
因此,改变:
_circle = [[CCSprite alloc]initWithFile:@"Circle.png"];
致:
然后用circle
更新方法的其余部分,而不是\u circle
您可能添加了两次相同的(单个)精灵
您可以记录对象本身,而不是记录具有计数的变量。它将打印其描述的值。这将根据默认值打印出所有NSObject
子类的类和地址。实际上,NSMutableArray
(以及类似的NS…类)打印得非常好
NSLog ("%@",myObj);
这样你可能会更清楚地看到真正发生的事情 您可能添加了两次相同的(单个)精灵
您可以记录对象本身,而不是记录具有计数的变量。它将打印其描述的值。这将根据默认值打印出所有NSObject
子类的类和地址。实际上,NSMutableArray
(以及类似的NS…类)打印得非常好
NSLog ("%@",myObj);
这样你可能会更清楚地看到真正发生的事情 创建炸弹时不要使用类变量,请尝试
CCSprite * _circle = [[CCSprite alloc]initWithFile:@"Circle.png"];
创建炸弹时不要使用类变量,请尝试
CCSprite * _circle = [[CCSprite alloc]initWithFile:@"Circle.png"];
@Divyu显然有什么不对的地方-这就是为什么我这么问的原因!每次运行都会出现这种结果吗?你在哪里创建了精灵对象?在删除之前,请尝试在数组中打印其值。可能会一直添加一个相同的对象。@giorashc是的,每当阵列中有2个或更多“炸弹”时。@Durgaprasad这不是一个单独的对象,我希望(CCSprite*)精灵会以某种方式神奇地将它们变成单独的对象。@Divyu显然有什么问题-这就是为什么我这么问的原因!每次运行都会出现这种结果吗?你在哪里创建了精灵对象?在删除之前,请尝试在数组中打印其值。可能会一直添加一个相同的对象。@giorashc是的,每当阵列中有2个或更多“炸弹”时。@Durgaprasad这不是一个单独的对象,我希望(CCSprite*)精灵会以某种方式神奇地将它们变成单独的对象。这样做的问题是它们可以在“checkForDamage”中删除除了不断添加新炸弹之外。这样做的问题是,除了不断添加新炸弹之外,它们还可以在“checkForDamage”中删除。啊,我明白了!我真蠢,以为他们会以某种神奇的方式知道我在说什么。看来这已经解决了,非常感谢!也要感谢其他人的帮助。啊,我明白了!我真蠢,以为他们会以某种神奇的方式知道我在说什么。看来这已经解决了,非常感谢!也谢谢