2014-02-12 66 views
0

我是一名初学者开发人员,我正在制作一款游戏,其中有两个彩球落下。你必须得到蓝色的,避免红色的。现在,球出现在屏幕顶部的一个随机点上,但有时候一些球会出现在其他球的顶部,我想知道是否有办法检测并在代码中避免它,因为我不知道如何实现它。谢谢!如果您需要更多信息,请随时向我提问。避免Sprite Kit节点彼此堆叠

+0

你如何创造球?在for循环还是在行动? –

+0

通过创建节点(球)的方法创建球......该方法在游戏开始时首先被调用,并不断创建球。 –

回答

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]]; 

..... 
} 
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]; 
} 

这样你就可以穿过所有的球并获得位置,所以它不会与所有球碰撞。

+0

这段代码可以写的更好,但它会做你需要的工作;) – BSevo