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