2D-вертоліт, як створити коридорні стіни?


12

Я розглядаю можливість адаптувати класичну гру "вертоліт" (тобто http://www.addictinggames.com/helicopter.html ), але я ще не зрозумів, як створити двигун покоління стін.

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


1
Також - для уточнення, мені потрібно, щоб стіни були більш кривими, ніж блокуючими, оскільки вони насправді будуть "водяними хвилями" ...
davidkomer

1
просто робіть як блоки, але плавний інтерполятор між кожним тоді.
Густав Масіель

Відповіді:


17

Ви можете використовувати для цього 1D Perlin-шум . Ось зображення 2D-шуму. Я взяв зразки, де є червона лінія, і помножив їх на деяку константу, щоб отримати зелену лінію.

2D шум з 1D секцією

Постійна, на яку ви множите значення, буде визначати висоту шуму. Таким чином, ви могли легко збільшити труднощі. Ще одна перевага шуму Перліна полягає в тому, що він може генерувати плитковий шум, так що ви можете створити, здавалося б, нескінченний рівень.

Якщо ви хочете створити дно та стелю, важливо не створювати жодних непрохідних областей. Найпростішим способом було б просто використовувати «верхню» частину шуму (напр. 1.0 - noiseValue) Як стелю, а нижню частину ( noiseValue) для нижньої (з певним зміщенням між ними, звичайно). Якщо це виглядає занадто тьмяно, ви також можете розглянути два близьких зразки, наприклад. уявіть собі ще одну червону лінію зразка на один або два пікселі вгору або вниз. Це дасть схожу, але не однакову хвилю.


Ого, це була така допомога! Дякую :) Я розвиваюсь у 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) * скалер; drawData.fillRect (новий прямокутник (idx, drawData.height - y_val, 1, y_val), 0x0000ff); drawData.fillRect (новий прямокутник (idx, 0, 1, y_val), 0x0000ff); }
davidkomer

Я зараз повинен бігти, але щось підказує мені, що мені просто потрібно уважніше прочитати ваші коментарі;) Тут я зараз перебуваю
davidkomer

Що таке scaler? Отримані значення будуть знаходитися в діапазоні 0..255вашого коду.
bummzack
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.