У грі на основі 2d плитки, який хороший метод прокрутки?


9

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

Сітка для плитки [256] [256];

Який був би кращий метод?

-Намалюйте плеєр в центрі екрана і змістіть місце, де намальована карта.

- Перемістіть плеєр із камерою наступним чином.

Я використовував перший метод, але його стає дуже складним, коли ви потрапляєте у верхній лівий край карти, і коли інші гравці / вороги на карті та рухаються одночасно

якщо я змушу камери слідкувати за програвачем, чи потрібно мені викликати spriteBatch-> Draw (...) для кожної однієї плитки сітки, хоча на екрані може розміститися лише декілька?

Відповіді:


4

Напевно, найкраще робити всі оновлення та обчислення в "реальних", світових одиницях та переміщувати камеру. Ваш spriteBatch може виконувати відсікання сам, але якщо це занадто повільно, ви можете спробувати визначити, які плитки потрібно відображати на екрані, і лише намалювати їх.


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

2

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

Оскільки ви працюєте в 2D, ще однією гарною порадою є зробити просторовий розподіл, найпростішим способом було б створити сітку віртуального світу, це дозволить вам керувати кожною плиткою окремо, об’єднуючи спрайти та інші ресурси на основі плитки, так по суті процес був би:

  • створити якийсь клас плитки, який може містити граничні координати для плитки та будь-які ресурси, які потрібні певній плитці (спрайти, вороги тощо).

  • визначтеся з розміром вашого світу та створіть 2D масив (ви можете використовувати один вимір та отримати доступ до нього як 2D) плиток, кожен з яких представляє частину вашого світу з усіма пов'язаними з ним ресурсами.

  • черпайте ресурси лише з плитки, на якій знаходиться плеєр, та його сусідів.

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

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


0

Я використовую поверхню. Я створюю весь світ на зовнішній поверхні і зберігаю координати x і y. Я змінюю їх, коли гравець рухається, і кожен кадр малює прямокутник 1028 x 768 від поверхні до резервного буфера, використовуючи x і y.

що стосується інших людей, я даю їм x і y і дозволяю їм рухатися по світу, як їм заманеться, під час малювання я перевіряю, чи є x і y в прямокутнику 1028 x 768, і якщо так малюю (я використовую текстури для людей) .

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

Я використовую 64 х 64 плитки, і найбільший світ, який я використовував до цих пір, - це 50 х 60 плиток.

Це все робиться у прямому x із c ++


1
Це здається ВЕЛИЧЕЗНОЮ свиней пам'яті. Якщо весь світ буде намальований на поверхневому екрані, це призведе до виникнення проблем із пам’яттю, як тільки ви захочете робити такі речі, як наявність декількох (анімованих) шарів для вашого світу та розширення його далі, ніж те, що у вас зараз. Було б набагато краще зберігати інформацію про світ і малювати лише ті частини / предмети, які потрібно намалювати, коли їх потрібно намалювати. Всього мої 2 копійки. :)
Річард Марскелл - Дракір

@Drackir Я думаю, що ти неправильно розумієш. тільки світ знімається з екрана, такі речі, як інші люди, відслідковуються та малюються на резервному буфері, коли вони знадобляться. також я не бачу себе робити більше, ніж 70 х 70 світу. коли я кажу, що я маю на увазі територію, це може бути місто, підземелля або внутрішня частина будинку, коли гравець рухається між ними, поверхня екрану відновлюється. Так, це займає пам’ять, але 2d плитка на сучасних терабітних накопичувачах робить її незначною, а завантаження за кілька секунд - це невелика ціна, яку потрібно платити за плавне прокручування та анімацію. але так, є кращі і важчі способи :)
Скайт

Поверхня повинна зберігатися в пам'яті картки GFX, а не на жорсткому диску. Однак я вважаю, що якщо пам'ять картки GFX занадто велика, вона перемістить поверхні на HD, що значно уповільнить ситуацію. Справді, минув час, коли я розбирався з цими речами, тому не пам’ятаю, як саме це працювало, але я гадаю, що поки ти не малюєш занадто великий світ, це було б нормально. :)
Річард Марскелл - Дракір

@Drackir Це цікаво знати, я ніколи про це не думав. Я виявив, що цей спосіб дає мені плавніше прокручування, що якщо я динамічно намалював нові плитки, то я думаю, що це добре, але мені доведеться розглянути це.
Скайт

Я працював над грою, де у мене були карти 31x31, але вони були приєднані разом. Я намагався працювати з чужим двигуном, і вони намалювали всі карти навколо тієї, на якій був гравець; тому загалом дев'ять карт. Кожна карта мала кілька (я думаю, 6) шарів. Так, як 31x31x9x6 = 51894 малюється плитка (макс. Звичайно; не всі плитки були заповнені) щоразу, коли користувач перемикає карти. Це було величезним уповільненням для мене, тому я переписав процедуру малювання, щоб намалювати лише плитки, що оточують програвач, на 1 плитку повз край екрана (для обробки часткової плитки під час руху).
Річард Марскелл - Дракір

0

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

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