Генерация случайного 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) и никогда не будет проверять, сталкиваются ли платформы друг с другом.
Я рекомендую пройтись по методу, чтобы увидеть, так ли это.