Як я можу довільно генерувати 2D-лазерний бічний скроллер на місцевості?


11

Я хочу довільно генерувати карту для 2D гри в бічний прокрут, використовуючи такий набір плиток: введіть тут опис зображення

Я знайшов кілька чудових статей про процес бітмейкінгу, наприклад: http://www.angryfishstudios.com/2011/04/adventures-in-bitmasking/ http://www.saltgames.com/2010/a-bitwise -метод-для застосування -кафери /

Мені подобається ідея використовувати бітмаску / маску плитки замість того, щоб робити величезний, якщо заява або переключення.

Однак у мене виникають проблеми з візуалізацією всього процесу, і жодна з цих статей не говорить про рандомізацію.

Мої плитки поєднуються між собою декількома різними способами, а не лише одним способом, як здаються плитки у прикладах, з якими я пов'язаний.

Наприклад, ось лише кілька прикладів:

введіть тут опис зображення

введіть тут опис зображення

введіть тут опис зображення

введіть тут опис зображення

Оскільки мої плитки поєднуються між собою різними способами, я не думаю, що 8-бітна маска спрацює. Тому я думав про використання більшого бітмаска. Щось на зразок char [8] або char 4 .

Якби хтось міг показати будь-який псевдокод / ​​приклади того, як виглядатиме загальний алгоритм, я дуже вдячний.

Відповіді:


3

Так, розмір маски зростатиме зі збільшенням кількості варіантів - ваша власна посилання http://www.saltgames.com/2010/a-bitwise-method-for-applying-tilemaps/ друга частина пояснює основну ідею.

По суті, вам доведеться перерахувати X можливостей для кожної «межі» між плитками; у вашому конкретному прикладі схоже, що "плитка зверху / знизу" може бути (1) білою (2) покритою або (3) напівзакритою - що збігається з прикладом "тринадцятого", наведеним у статті.

Але маски допоможуть вам лише обмежити можливості плитки лише тими, які можна намалювати, сам по собі це не метод, який показує, як генерувати фактичні карти розумним чином.

Ваш конкретний набір плиток насправді є досить обмежуючим - він описує лише одну поверхню, що піднімається / падає, і на будь-якій «цілому рівні» початкової точки ви маєте лише кілька дійсних варіантів. Наприклад, після плитки №2 можливі лише плитки №1 або №8. Ви можете просто переміститися зліва направо, склавши список (кілька) плиток, який може вийти після попередньої плитки, і випадковим чином вибрати одну з них.


Я думаю, це відповідь, яку я шукаю, проте все ще трохи хмарно. Чи можете ви ознайомитись трохи детальніше з текстом чи псевдокодом про те, як би працювала остання частина вашого пояснення? "Ви можете просто переміститися зліва направо, склавши список (кілька) плиток, який може з'явитися після попередньої плитки, і випадковим чином вибрати одну з них."
erebel55

1
Для кожного типу плитки складіть список того, які плитки дозволяється після цього - плиток так мало, це можна швидко зробити вручну. 'Висота' зміниться, заповнить усе нижче нової плитки цифрами №10.
Петріс

Так, ви говорите, щоб використовувати цей метод замість бітмейкінгу?
erebel55

1
Так, бітмейкінг корисний, якщо весь вміст 2d має сенс, але ваші карти здаються однорівневими, горизонтальною поверхнею різної висоти.
Петріс

Це має сенс, що "гори" будуть різної висоти і перетікатимуть одна в одну. Таким чином, по суті це буде гірська зміна висоти, коли ви рухаєтесь уздовж. Начебто косинусна / синусова хвиля, яка має випадкові величини в різних точках. Чи слід рухатись зліва направо чи зверху вниз під час генерації карти?
erebel55

6

Чи обдумали ви використовувати функцію шуму 1D Perlin або симплекс? У цьому є ряд переваг, серед яких:

  1. Нескінченний (у царині точності з плаваючою комою) місцевість, що не повторюється

  2. Можна створювати в режимі реального часу (навіть у шейдері, який швидкий ), або достроково та зберігати в текстурах, як у вашому прикладі

  3. Межі автоматично узгоджуються, оскільки і Перлін, і симплекс безперервні.

  4. Хоча сама місцевість є псевдовипадковою, досить просто застосувати функцію конверта або просто зменшити кількість октав у районах, де вам потрібні рівні ділянки або інші особливості місцевості, які вам потрібні.

Дивіться це посилання для досить ґрунтовного пояснення реалізації 1D Perlin.

Конверт - це в основному скалярне поле або функція, що множиться за допомогою функції шуму перед збереженням або відображенням результату.

введіть тут опис зображення

(Початкове зображення, запозичене з вищезазначеної статті.)

У цьому прикладі червона лінія являє собою кускову функцію, визначену як

x < 0.3 : y = (0.3-x)/0.3)
x < 0.5 : 0
x < 0.7 : (x - 0.5) / 0.2
else    : 1

... що може бути краще визначено за допомогою плавної функції. У цьому випадку він просто зменшує значення до 0 перед плато, а потім повертається до 1.

Оновлення

Ось приклад 3D-простого "рельєфу" одного з моїх проектів із застосованим дифузним + дзеркальним освітленням, генерованим цілком у вершині + тесс + фрагмент шейдера. Для вашої ситуації я б взяв з цього вертикальний зріз, щоб отримати схил місцевості.

введіть тут опис зображення

Ортографічний вигляд зверху вниз:

введіть тут опис зображення


Це техніка створення самих власних зображень плитки?
erebel55

1
@ erebel55 Так. Ви можете використовувати 2D функцію, щоб визначити, куди (на основі вашого прикладу) розмістити різних малюків рослин у межах зображення, а також створити похилу місцевість. Я використовував це в 3D із прекрасними результатами.
3Dave

Це виглядає як цікавий метод, я просто не впевнений, що хочу піти цим маршрутом, оскільки вже створив свої зображення.
erebel55

@ erebel55 Так, немає причин кидати існуючі речі, якщо це працює для вас.
3Dave

Ну, у мене ще не працює випадкове покоління, але я сподіваюся;) Я дав вам голос за цей метод, подумавши, як це було цікаво, і я можу використовувати його деякий час у майбутньому. Дякую
erebel55
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.