Генерация случайного Y для спрайта

Мне нужна помощь (дух) Я хочу создать случайную позицию Y для моей игры в cocos2d.

Таким образом, ситуация выглядит следующим образом: игра порождает платформу каждые 0,2 секунды. IPhone / iPad находится в ландшафтном режиме. Платформа появляется в правой части экрана (ширина больше, чем ширина, чтобы платформа появлялась за пределами экрана) и начинает движение к левому краю экрана, используя CCMoveTo, Я выбираю случайный Y для каждой платформы. Проблема в том, что я не хочу порождать платформу поверх другой. Это означает, что мне нужно сделать ранди, который еще не "взят". Код, который я пробовал до сих пор:

//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. Я знаю, что в этих фигурных скобках нет необходимости, но я тестировал некоторые другие вещи, поэтому я их туда и положил.

Это не похоже на работу. Надеюсь, я ясно дал понять, чего хочу достичь. Любая помощь с вашей стороны будет высоко ценится. Надеюсь, я не пропустил что-то слишком новичок в стиле:)

Я пометил вопрос на других языках, потому что эта проблема может возникнуть "везде".

2 ответа

Решение

Теперь я обнаружил, что могу отвечать на свои вопросы:) (глупый я). Так что да, проблема была исправлена ​​давным-давно, но для любого, кто мог бы читать это, решение было изменить строку:

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

Для того, чтобы:

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

Предполагая, что все порожденные платформы имеют один и тот же тег, как вы упомянули, вы используете теги для разделения разных типов платформ.

Все предыдущие платформы не вернут true для этой линии

if (body.tag > platformBody)

поскольку все они имеют одинаковый тег, вы сравните (1 > 1), что неверно.

Поэтому ваш метод всегда будет возвращать YES (что является значением по умолчанию для ok) и никогда не будет проверять, сталкиваются ли платформы друг с другом.

Я рекомендую пройтись по методу, чтобы увидеть, так ли это.

Другие вопросы по тегам