Случайно генерируемые стены туннеля, которые не прыгают от одного к другому

Я создаю своего рода туннель, через который вы можете пролететь, на 2D-экране. Я хочу, чтобы стены плавно перемещались слева направо в случайном порядке. Прямо сейчас я просто получаю "шипы".

Я хочу, чтобы это выглядело так

вместо этого

Я использую код для стен, который выглядит так, по сорок раз каждая влево и вправо.

if (Left1.center.y > 568) {
    RandomPosition = arc4random() %55;
    Left1.center = CGPointMake(RandomPosition, 0);
    RandomPosition = RandomPosition + 265;
    Right1.center = CGPointMake(RandomPosition, 0);
}

а потом это

RandomPosition = arc4random() %55;
Left1.center = CGPointMake(RandomPosition, 0);
RandomPosition = RandomPosition + 265;
Right1.center = CGPointMake(RandomPosition, 0);

но это на самом деле не двигает стены так, как я хочу.

1 ответ

То, что вы ищете, называется "коррелированным" генерацией случайных чисел.

Один из самых популярных способов генерации таких чисел называется шумом Перлина, который может быть слишком сложным для ваших нужд.

В вашем случае проще всего было бы отслеживать последнюю позицию стены и генерировать случайное смещение от нее вместо генератора чисел, используемого для чистого значения стены. Это известно как "случайная" или "пьяная" прогулка.

Чтобы сохранить одинаковую ширину туннеля, случайным образом выберите только конечную точку левой стены, а затем установите конец правой стены на правильном расстоянии.

CGFloat leftWallX = /* starting value */;
for( int i = 0; i < NUM_WALLS; i++ ){
    // Generate a number from -MAX_OFFSET to MAX_OFFSET
    CGFloat offset = (CGFloat)arc4random_uniform(2*MAX_OFFSET) - MAX_OFFSET;
    leftWallX += offset;
    rightWallX = leftWallX + tunnelWidth;
    //...
}
Другие вопросы по тегам