2012-05-14 75 views
0

我需要一些帮助(duh)。我想在cocos2d中为我的游戏生成一个随机的Y位置。为精灵生成随机Y

所以情况如下: 游戏每0.2秒产生一个平台。 iPhone/iPad处于横向模式。平台显示在屏幕的右侧(x大于宽度,以便平台显示在屏幕外部),并使用CCMoveTo开始向屏幕左端移动。 我为每个平台选择一个随机Y.问题是我不想在另一个平台上产生一个平台。这意味着我需要制作一个不“已经拍摄”的randY。 到目前为止,我已经试过的代码是这样的:

//this is a part of code from my addPlatform function. This part in particular cares for the generation of my Y coordinate. 
int randY = arc4random() % (int)(3 * (winSize.height/4)); //This prevents to spawn a Y larger than 3/4 of the screen 

//here I would like to loop long enough to find a good Y 
while (![self isGoodPlatformY:randY]) 
{ 
    randY = arc4random() % (int)(3 * (winSize.height/4)); 
} 

接下来的部分是我的isGoodPlatformY功能通过所有比我大的平台标签中体

- (bool)isGoodPlatformY:(int)platY 
{ 
    CGSize winSize = [[CCDirector sharedDirector] winSize]; 
    int padding = 100; 
    bool ok = true; 
    for (CCSprite *body in [self children]) 
    { 
     if (body.tag > platformBody) 
     { 
      if (body.position.x < (winSize.width - padding)) 
      { 
       if (abs(body.position.y - platY) < 20) 
       { 
        ok = false; 
       } 
      } 
     } 
    } 
return ok; 
} 

我循环。我使用标签分开了不同类型的平台。如果身体是一个平台,我首先检查X坐标。如果平台足够(填充),我可以在这个确切点产生一个新的,所以我检查下一个。如果没有,我想检查该平台的Y.如果在这种情况下Y坐标小于20像素,我必须找到一个新的Y,这就是为什么将bool设置为false并在for循环之后返回它。 我知道没有必要使用那些花括号,但我正在测试一些其他的东西,那就是为什么我把它们放在那里。

这似乎不起作用。希望我明确自己想要达到的目标。任何来自你方的帮助将不胜感激。希望我没有错过太新手风格:)

我标记了其他语言的问题,因为这个问题可能发生“无处不在”。

+0

如果可能会出现“无处不在的问题“(它可以),你应该使用伪代码而不是问某人,例如,流利的C#来解析objective-c。 –

+1

只是一个旁注,那些花括号恰好就是这样。除了懒惰的打字以外(通常在稍后的打字中),通常不需要“优化”它们。 – Till

+0

'(body.position.x <(winSize。宽度 - 填充))'它可以在另一行(其他Y),不是吗?或者我没有得到这种情况?我看起来对我来说,来自其他线路的平台可以阻止你的新产生? – DanSkeel

回答

0

现在我发现我可以回答我自己的问题:)(愚蠢的我)。所以,是的,这个问题是固定在很久以前,但任何人谁可能会读这篇文章,解决办法是改线:

if (body.position.x < (winSize.width - padding)) 

要:

if (body.position.x > (winSize.width - padding)) 
0

假设所有衍生的平台都具有与您所提到的相同的标记,即您正在使用标记来分隔不同类型的平台。

以前所有的平台,不会为这条线

if (body.tag > platformBody) 

返回true,因为它们都具有相同的标签,你会比较(1> 1),这是假的。

因此,您的方法将始终返回YES(这是您的默认值),并且不会检查平台是否相互碰撞。

我建议单步执行该方法以查看是否属于这种情况。

+0

没有platformBody的值为100.其他平台开始赢101等。 – Majster

+0

是的,但是如果你创建的每个平台的值都是100,他们将永远不会被测试。如果您使标签增加,那么您的platformBody标签永远不会比其他平台少。 –

+0

是的,我知道。我的定义看起来像这样'#define platformBody 100 #define defaultPlatform 101 #define bouncePlatform 102 #define invisiblePlatform 103'。这不是问题。平台获得标签101和更多。 – Majster