2D игра на вертолете, как создать стены коридора?

12

Я смотрю на адаптацию классической игры «вертолет» (то есть http://www.addictinggames.com/helicopter.html ), но я еще не выяснил, как создать движок генерации стен.

Какие-нибудь указатели на псевдокод? Меня не очень интересуют объекты посередине - только методология генерации сторон, которая увеличивается с трудом (закрывается больше, имеет более неожиданные изгибы) по ходу игры.

davidkomer
источник
1
Кроме того, чтобы уточнить, мне нужно, чтобы стены были более извилистыми, чем блочные, так как на самом деле они будут "водяными волнами" ...
Давидкомер
1
просто делайте как блоки, но затем плавно интерполируйте между ними.
Густаво Масиэль

Ответы:

17

Для этого вы можете использовать шум 1D Perlin . Вот изображение 2D шума. Я взял образцы, где красная линия, и умножил их на некоторую константу, чтобы получить зеленую линию.

2D шум с 1D сечением

Константа, на которую вы умножаете значения, будет определять высоту шума. Таким образом, вы можете легко увеличить сложность. Еще одним преимуществом шума Perlin является то, что он может генерировать мозаичный шум, так что вы можете создать, казалось бы, бесконечный уровень.

Если вы хотите создать дно и потолок, важно, чтобы вы не создавали непроходимых областей. Самым простым способом было бы просто использовать «верхнюю» часть шума (например, 1.0 - noiseValue) в качестве потолка, а нижнюю часть ( noiseValue) - для нижней (с некоторым смещением между ними, конечно). Если это выглядит слишком скучно, вы можете также рассмотреть два близких образца, например. представьте еще одну красную пробную линию на один или два пикселя вверх или вниз. Это даст похожую, но не идентичную волну.

bummzack
источник
Вау, это была такая помощь! Спасибо :) Я разрабатываю во Flash / Actionscript- и вижу, что есть встроенная функция perlinNoise ... поиграюсь с ней и посмотрю, как она идет :)
davidkomer
@ davidkomer Я рад, что это полезно. Во флэш-памяти вам нужно будет создать BitmapDataобъект и использовать его perlinNoiseфункцию. Растровое изображение может быть 800x3 пикселей или что-то экстремальное, тогда вы можете просто извлечь значения верхней и нижней строки (что-то вроде этого (bitmap.getPixel(x,y) & 0xff) / 255.0должно дать вам значения в 0..1диапазоне.
bummzack
Хм-м-м, я все заработал, но константа / множитель толкает значения в непроходимые области ... вот мой код, есть идеи? (vect - это вектор 32-битных значений, взятый из линии перлин-шума ... поэтому y_val - это просто синий канал, умноженный на масштабатор) для (idx = 0; idx <vect.length; idx ++) {y_val = (vect [idx] & 0xFF) * scaler; drawData.fillRect (новый прямоугольник (idx, drawData.height - y_val, 1, y_val), 0x0000ff); drawData.fillRect (новый прямоугольник (idx, 0, 1, y_val), 0x0000ff); }
Давидкомер
Сейчас мне нужно бежать, но что-то подсказывает мне, что мне просто нужно внимательнее прочитать ваши комментарии;) Вот где я сейчас нахожусь
davidkomer
Что это scaler? Значения, которые вы получите, будут в диапазоне 0..255вашего кода.
Bummzack