SpriteKit中的removefromparent导致其他节点失去"性能

时间:2014-06-10 19:51:41

标签: objective-c ios7 sprite-kit

我正在使用SpriteKit进行游戏。

我的主要精灵节点定义如下:

  ball = [SKSpriteNode spriteNodeWithImageNamed:@"green"];
  ball.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:ball.frame.size];
  ballcoordinates = CGPointMake(x, y);
  ball.position = ballcoordinates;
  ball.name = @"green";
  [self addChild:ball];

我有其他球精灵.name字符串"蓝色,红色,黄色......"。它们被多次添加&安排在2d网格中。

基本上我的代码是:

  1. 使用touchesBegan选择一个球Sprite:

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    touchedNode = (SKSpriteNode *)[self nodeAtPoint:[touch locationInNode:self]];
    }
    
  2. 使用nodeAtPoint从周围(上,下,左,右)节点的坐标中选择周围节点。因此,对于右侧的节点,它看起来像:

    CGPoint right= CGPointMake(touchedNode.position.x + 63, touchedNode.position.y);
    SKNode *rightNode = [ball.parent nodeAtPoint:right];
    
  3. 如果触摸的字符串名称等于任何周围节点的字符串名称,则所有具有相同名称的节点都是A.)添加到数组B.)在检查所有周围节点后删除

  4. NSMutableArray* ballArray;
    [ballArray addObject:rightNode];
    //Repeated for up,down,left
    
    for (id ball in ballArray) {
    [ball removeFromParent];
    }
    

    75%的时间它完美无瑕。另外25%,它一直有效,直到从父节点中删除节点。之后,如果我点击网格的另一个区域,我的.name字符串将返回已点击节点的正确名称,但对于周围节点则返回null。因此,我从nodeAtPoint选择节点的方式是错误的,或者removeFromParent正在删除属性。

    我花了很多时间在这上面,但仍然感到难过。有什么建议?

1 个答案:

答案 0 :(得分:1)

您是否认为在removeFromParent之后节点已经消失(取消分配)? ballArray本身不会保留直到3.中的方法结束,特别是它不会保留任何节点开始,因为假设上面的代码片段是你所有的,ballArray只是nil - 你没有分配一个实例的NSMutableArray。

将其更改为:

NSMutableArray* ballArray = [NSMutableArray array];

并且可能也会将声明移动到@interface,这样数组就变成了一个ivar,而不是在方法结束时释放的局部变量。