Ios 避免精灵套件节点相互堆叠

Ios 避免精灵套件节点相互堆叠,ios,iphone,sprite-kit,Ios,Iphone,Sprite Kit,我是一个初学者开发人员,我正在制作一个两个彩色球落下的游戏。你必须买蓝色的,避开红色的。现在,球出现在屏幕顶部的一个随机点上,但有时一些球出现在另一个球的顶部,我想知道是否有办法在代码中检测并避免它,因为我不知道如何实现它。谢谢如果您需要有关某些内容的更多信息,请随时向我询问。您可以创建一个静态全局变量,该变量保存上次添加的球的上一个x位置,并检查新创建的球是否与上次创建的球具有相同的值,然后您可以重新随机选择球的位置并再次检查。 例如: 最好只为球设置一个SKNode,当添加新球时,只需通过该

我是一个初学者开发人员,我正在制作一个两个彩色球落下的游戏。你必须买蓝色的,避开红色的。现在,球出现在屏幕顶部的一个随机点上,但有时一些球出现在另一个球的顶部,我想知道是否有办法在代码中检测并避免它,因为我不知道如何实现它。谢谢如果您需要有关某些内容的更多信息,请随时向我询问。

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


最好只为球设置一个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];
}

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

如何创建球?在for循环中还是在action中?球是通过创建节点(球)的方法创建的。。。该方法首先在游戏开始时调用,并不断创建球。此代码可以编写得更好,但它可以完成您需要的工作;)
//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];
}