避免Sprite Kit节点相互堆叠

时间:2014-02-12 16:20:42

标签: ios iphone sprite-kit

我是初学者,我正在制作一个有两个彩球落下的游戏。你必须得到蓝色的,避免红色的。现在,球出现在屏幕顶部的随机点,但有时一些球出现在其他球的顶部,我想知道是否有一种方法可以检测到并在代码上避免它,因为我不知道如何实现它。谢谢!如果您需要更多信息,请随时向我询问。

2 个答案:

答案 0 :(得分:1)

最好只有一个SKNode用于球,当添加新球时,只需通过该节点并检查球的位置。

//balls node variable in scene, SKNode *ballsNode,
//add this to init or other method:
//self.ballsNode = [SKNode node];
//[self addChild:self.ballsNode];
//
-(void)addRock
{
  SKSpriteNode *rock = [[SKSpriteNode alloc] initWithColor:[SKColor brownColor] size:CGSizeMake(8, 8)];
  CGFloat newRandomX;
  CGPoint ballPosition;
  BOOL positionIsOk = NO;
  while(!positionIsOk)
  {
    newRandomX = getRandomX();
    ballPosition = CGPointMake(newRandomX, yourYPos);
    for(SKSpriteNode *node in self.ballsNode.children)
    {
      if(!CGRectContainsPoint ( node.frame, ballPosition ))
      {
        positionIsOk = YES;
        break;
      }
      else
      {
        newRandomX = getRandomX();
        ballPosition = CGPointMake(newRandomX, yourYPos);
      }
    }
  }
  rock.position = ballPosition;
  [self.ballsNode addChild:rock];
}

通过这种方式,你将通过所有球并获得位置,这样它就不会与所有球碰撞。

答案 1 :(得分:0)

您可以创建一个静态全局变量来保存最后添加的球的前一个x位置,并检查新创建的球是否与最后一个球具有相同的值,然后您可以重新输入球的位置并再次检查。 例如:

// here is the global variable declaration 
static float _lastRandomX = 0;

//this method creates a rock (you can call it addBall)
- (void)addRock
{
    SKSpriteNode *rock = [[SKSpriteNode alloc] initWithColor:[SKColor brownColor] size:CGSizeMake(8, 8)];
    rock.name = @"rock";

     // the work goes here
    CGFloat newRandomX = 0;
    while(_lastRandomBall == newRandomX) {
        newRandomX = getRandomX();
    }
    rock.position = CGPointMake(newRandomX, yourYPos);
    _lastRandomX = newRandomX
    [self addChild:rock];
}

// now here is the action calling this method
- (void)runAction {
SKAction *makeRocks = [SKAction sequence:@[
                                               [SKAction performSelector:@selector(addRock) onTarget:self],
                                               [SKAction waitForDuration:0.10 withRange:0.15]]];
    [self runAction:[SKAction repeatActionForever:makeRocks]];

.....
}