Кращий спосіб створити карту для 2D гри?


16

Прошу вибачення за суб'єктивне ключове слово "найкраще".

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

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

Я зіграв якусь Зельду з SNES і побачив, що під час зрушення карти вміст може бути завантажений саме тоді. Я маю на увазі, що замість того, щоб просто перевірити прямокутну область для завантаження даних, ми просто розділяємо карту на безліч крихітних шматочків, які завантажують та вивантажують дані, переходячи від частини карти до частини карти.

Сьогодні він сказав мені, що хоче створити просто 2D карту масиву [WIDTH] [HEIGHT], яка містить дані про кожну сітку в грі і є постійною операцією збереження на диску для даних, які нам не потрібні.

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


Яку машину ви використовуєте?
Давид Титаренко

Windows з C ++, що використовує SFML досі (SFML може змінюватися; C ++ - ні). Ми не прагнемо переносити атм.
IAE

2
Якщо ви збираєтеся для старої школи Zelda в NES, використовуйте лише карти на 1 екрані. Невеликі карти допомагають гравцям зосередити сферу своїх намірів (тобто в підземеллі ви маєте справу тільки зі своєю кімнатою. У діабло, монстри не рухалися вгору та вниз поверхами) і дозволяють їм відчути завершення, якщо вони обшукали всю область що ігри з відкритим космосом, такі як FAllout3 та Oblivion, не дають вам.
Стівен Фурлані

Відповіді:


27

Спочатку оцініть розмір карти. Не припускайте просто, що "великий світ" не впишеться в пам'ять. На сьогодні карта, яка займає 10 Мб пам'яті, є абсолютно прийнятною, і ви можете заповнити багато в 10 Мбіт у простому 2D світі на основі плиток.

Якщо у вас дійсно великий світ, найбільш надійним рішенням є дійсно використання шматок карт. Розділіть свій світ на шматки фіксованого розміру (скажімо, 64х64). Завантажуйте шматки під час руху, коли гравець рухається, зберігаючи принаймні один шматок, завантажений у всі боки (тобто завантажуйте шматок, на якому гравець, і всі його сусіди).

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


6
Деякі наочні математики: 10 Мб плитки * s отримує квадрат з 1619 плиток на сторону. Оригінальні карти Зельди складали 256 плиток на довгій стороні і менше половини, ніж на короткій стороні - так що ваша карта могла бути на 36 разів більша, ніж перша з Зельди з цим використанням пам'яті. Ви дійсно готові зробити так багато контенту ? (Ні)

@ user744 Цей коментар неймовірно оманливий. Для створення карти потрібно більше, ніж просто вказівники на плитки. Вам потрібно зберігати дані, які містять також плитки. Не кожна 2D гра має встановлену кількість заздалегідь визначених фіксованих плиток.
Jeroen

5

Особисто я буду будувати карту за допомогою призначеного редактора плиток, наприклад TileEd . Такий підхід дає ряд переваг:

  • Використовує менше ресурсів. Вам просто потрібно завантажити аркуш плитки та файл даних з індексами, щоб створити потенційно нескінченну карту.
  • Оскільки ваша карта розділена на дійсно невеликі шматки (залежно від розміру плитки), ви можете легко додавати / видаляти рядки / стовпці, поки персонаж рухається по світу.
  • Наявність файлу даних, який описує вашу карту, також дозволяє легко додавати інформацію про місцевість. Це дозволяє використовувати різні типи плитки, такі як стіни чи озера (тобто перешкоди) або болото, де рух персонажа може бути сповільнений ...
  • І останнє, але не менш важливе, карту на основі плиток також набагато простіше редагувати та налаштувати згодом, оскільки ви завжди можете запустити редактор, змінити деякі речі та зберегти новий файл даних.

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

Розмивання плиток на екрані - це, мабуть, найшвидший спосіб відображення вашої карти. Я не знаю SFML, але з документів на їхньому сайті ви повинні шукати в Spriteкласі або використовувати Copyфункцію Imageкласу.

Оновлення: я просто прочитав деякі документи SFML, і вам обов'язково слід використовувати Drawableабо Spriteзамість цього маніпулювати зображеннями задля продуктивності. Мабуть, там є кахельний навантажувач SFML . Це, мабуть, хороший спосіб швидко підняти щось і працювати.


1

Почніть із створення карти, необхідного розміру, щоб розповісти історію, яку ви хочете розповісти грі. Тестуйте на машині з мінімальними характеристиками, необхідними для людей, щоб грати у вашу гру. Якщо це занадто повільно, профіліруйте та оптимізуйте.


0

Використання 2D масиву окремих плиток найкраще, на мою думку. Ви можете мати всю велику карту як один двовимірний масив і лише намалювати ту частину, яку потрібно відобразити в будь-який момент часу. Далі наводиться приклад використання двовимірного масиву карт з бібліотекою ігор tabageos (tbgs.js) HTML5; http://actiontad.com/tabageosHTML5/Examples/BlitMathCameraAndTravelers/


-3

Якщо ви не плануєте перебудовувати ultima-online (Fallout 3 або Oblivion), немає жодної причини, щоб світ не мав бути безперебійним. Baldur's Gate і Icewind Dale - це дві гри, які приходять на розум, що реалізують ефективні карти, які не заважають геймплею.

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

Все, що я можу вам сказати, це те, що для мене я пишу невеличку вкладку Obj-C для iPhone, яка бере набір плиток 32х32 і втягує її в NSImage. Таким чином я отримую близько 10 кадрів в секунду, і, ймовірно, я повинен використовувати OpenGL, але мені потрібно повторно малювати, лише якщо персонаж рухається з прямої.

Ви повинні розділити карту на 9 розмірів екрана (для мене це 960x640 блоків), тому якщо персонаж переміститься з центрального блоку, я повторно намалюю 9-екрани у велике зображення (приблизно 1,2 МБ - дає багато номер під лімітом 20 Мб на iPhone 3G). Це відбувається досить повільно (набагато повільніше, ніж 10 кадрів в секунду), тому повторне малювання не помітно під час гри.

Я, швидше за все, перейду до OpenGL ES в якийсь момент, але поки це працює чудово.


[EDIT]

Дозвольте мені уточнити.

Алгоритм малювання для 9-екранного фону займає 0,1 секунди (10 кадрів в секунду). Якщо ваш програвач не зможе пройти весь екран менш ніж за десяту частину секунди, перемальовка повинна бути непомітною під час гри.


Тільки тому, що 10 кадрів в секунду є прийнятною для вашої гри, це не є гарною ідеєю, особливо на пристроях з обмеженими можливостями, як-от iPhone. Можливо, ви робите нульові перемальовки, дозвольте стороні GPU впоратися з растеризацією, а насправді дозвольте програмі провести деякий час у сплячому режимі, щоб телефон не нагрівався або не закінчився час автономної роботи.

@Joe Wreschnig ... ??? Я сказав, що це малює на вимогу, коли плеєр переміщує екран, інакше фонове зображення для UIImageView не перемальовується , тим самим економлячи технологічну потужність. Ваш коментар не має сенсу.
Стівен Фурлані

Я не претендую на fps, який вимагає ваша гра. Я кажу, OpenGL може забезпечити 60 кадрів в секунду для такої речі тривіально (насправді, ви навіть не говорите про "перемальовки" зі статичними сценами та OpenGL) - якщо вам потрібно лише 10 кадрів в секунду, то використання OpenGL дозволяє не витрачати енергію акумулятора на інші "50 кадрів". Ваш метод малювання марнотратний у світі з прискоренням GPU. Це напевно добре на ПК, але не тоді, коли ви розряджаєте акумулятор.

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