Objective c 发生冲突时,self无法运行正确的方法

Objective c 发生冲突时,self无法运行正确的方法,objective-c,sprite-kit,nsmutablearray,collision,Objective C,Sprite Kit,Nsmutablearray,Collision,我创建了一个NSMutableArray,它有3个节点,当hero与它们发生冲突时,self运行3种不同的方法Sobj_1->method_1,obj_2->method_2…我的问题是当hero与obj_1发生冲突时,self有时运行method_2,但有时运行得很好…这3种方法似乎是自相矛盾的。我不知道我的代码哪一部分出错了 -(void)randomLetter{ obj_array = [[NSMutableArray alloc]initWithCapacity:3]; obj_

我创建了一个NSMutableArray,它有3个节点,当hero与它们发生冲突时,self运行3种不同的方法Sobj_1->method_1,obj_2->method_2…我的问题是当hero与obj_1发生冲突时,self有时运行method_2,但有时运行得很好…这3种方法似乎是自相矛盾的。我不知道我的代码哪一部分出错了

-(void)randomLetter{


obj_array = [[NSMutableArray alloc]initWithCapacity:3];

obj_1 = [SKSpriteNode spriteNodeWithImageNamed:@“1.png"];
obj_1.name = @“1”;

obj_2 = [SKSpriteNode spriteNodeWithImageNamed:@“2.png"];
obj_2.name = @“2”;

obj_3 = [SKSpriteNode spriteNodeWithImageNamed:@“3.png"];
obj_3.name = @“3”;



[obj_array addObject: obj_1];
[obj_array addObject: obj_2];
[obj_array addObject: obj_3];



NSUInteger random_obj = arc4random()%obj_array.count;

obj_x = [obj_array objectAtIndex:random_obj];
[obj_array removeObjectAtIndex:random_obj];


obj_x.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius: obj_x.size.width/2];
obj_x.physicsBody.dynamic = NO;
obj_x.physicsBody.categoryBitMask = objCategory;
obj_x.physicsBody.contactTestBitMask = heroCategory;

obj_x.position = CGPointMake(self.size.width*1.1, self.size.height*0.5);
SKAction *obj_action= [SKAction moveToX:-self.size.width*1.1 duration:5];


[obj_x runAction:obj_action];
[self addChild: obj_x];
}


-(void)didBeginContact:(SKPhysicsContact *)contact{

SKPhysicsBody *firstBody, *secondBody;
if (contact.bodyA.categoryBitMask<contact.bodyB.categoryBitMask) {
    firstBody = contact.bodyA;
    secondBody = contact.bodyB;
}
else
{
    firstBody=contact.bodyB;
    secondBody=contact.bodyA;
}


    if ((firstBody.categoryBitMask & heroCategory ) !=0 && (secondBody.categoryBitMask & objCategory)!=0) {

        [self enumerateChildNodesWithName:@“1” usingBlock:^(SKNode *node, BOOL *stop) {

            _timeIsUp = NO;

            [obj_x removeFromParent];

           [self method_1];


        }];


        [self enumerateChildNodesWithName:@“2” usingBlock:^(SKNode *node, BOOL *stop) {

            _timeIsUp = NO;

            [obj_x removeFromParent];

            [self method_2];

        }];


        [self enumerateChildNodesWithName:@“3” usingBlock:^(SKNode *node, BOOL *stop) {

            _timeIsUp = YES;

            [obj_x removeFromParent];

            [self method_3];                
        }];

      }
}
如果您打算在英雄与obj_n=1,2,3冲突时调用方法n,我认为下面的方法更清楚。试试看,如果你有什么问题就告诉我

if ((firstBody.categoryBitMask & heroCategory) !=0 && (secondBody.categoryBitMask & objCategory)!=0) {
    if ([secondBody.node.name isEqual:@"1"]) {
        _timeIsUp = NO;
        [secondBody.node removeFromParent];
        [self method_1];
    } else if ([secondBody.node.name isEqual:@"2"]) {
        _timeIsUp = NO;
        [secondBody.node removeFromParent];
        [self method_2];
    } else if ([secondBody.node.name isEqual:@"3"]) {
        _timeIsUp = NO;
        [secondBody.node removeFromParent];
        [self method_3];
    }   
} 

你什么时候打电话给我?至于我自己的问题,我想我知道为什么。当obj_2出现在场景中时,obj_1尚未从父对象中移除。我在obj_2出现之前移除了obj_1,它运行得很好…@WangYudong我在计时器中调用randomLetter,时间间隔为5次,现在看来你知道原因了,你的问题解决了吗?或者我的解决方案有效吗?@WangYudong我在更新方法中检查了对象_1的x位置,较早地将其删除,它就有效了。但我认为您的解决方案更好,我已经尝试过了,而且它在简洁的代码中也能很好地工作。您不应该从其父级中删除secondBody.node而不是OBJx吗?非常感谢!!我是spritekit的新手,我应该向你学习更多@王玉东应该==变为等质量:?