По-перше, дозвольте мені сказати, що 2D RPG близькі і дорогі моєму серцю, і робота зі старими двигунами DX7 VB6 MORPG (не смійтесь, це було 8 років тому, зараз :-)) - це те, що вперше зацікавило мене розвитком гри. . Зовсім недавно я почав перетворювати гру, над якою працював в одному з цих двигунів для використання XNA.
Однак, моя рекомендація полягає в тому, що ви використовуєте структуру на основі плитки з шаруванням для своєї карти. З будь-яким графічним API, який ви використовуєте, у вас обмежиться розмір текстур, які ви можете завантажувати. Не кажучи вже про обмеження пам'яті текстури відеокарти. Отже, враховуючи це, якщо ви хочете максимально збільшити розмір ваших карт, при цьому не тільки мінімізуючи кількість і розмір текстур, які ви завантажуєте в пам'ять, але і зменшуєте розмір своїх активів на жорсткому диску користувача І час завантаження, ви напевно, захочеться піти з плиткою.
Що стосується впровадження, я детально розповів про те, як я вирішував це в кількох питаннях тут, на GameDev.SE та в своєму блозі (обидва зв'язані нижче), і це не зовсім те, що ви запитуєте, тому я просто перейдіть сюди до основ. Я також зазначу особливості плиток, які роблять їх корисними для завантаження декількох великих попередньо зображених зображень. Якщо щось не зрозуміло, дайте мені знати.
- Перше, що вам потрібно зробити - це створити плитковий аркуш. Це просто велике зображення, яке містить усі ваші плитки, вирівняні в сітці. Це (а може бути і додаткове, залежно від кількості плиток) буде єдиним, що потрібно завантажити. Всього 1 зображення! Ви можете завантажити 1 на карту або одну з кожною плиткою в грі; що б організація не працювала на вас.
- Далі потрібно зрозуміти, як можна взяти цей "аркуш" і перекласти кожну плитку в число. Це досить просто з деякою простою математикою. Зауважте, що поділ тут є цілим поділом , тому десяткові знаки випадають (або округляються вниз, якщо вам більше зручно).
Гаразд, тепер, коли ви розбили таблицю плиток на ряд комірок (цифр), ви можете взяти ці цифри та підключити їх до будь-якого контейнера. Для простоти можна просто використовувати 2D масив.
int[,] mapTiles = new int[100,100]; //Map is 100x100 tiles without much overhead
Далі ви хочете їх намалювати. Один із способів зробити це ЛОТИ більш ефективним (залежно від розміру карти) - це обчислити лише комірки, які камера переглядає, і провести цикли через них. Це можна зробити, отримавши координати масиву плитки для карти верхнього лівого ( tl
) та нижнього правого ( br
) кутів камери . Потім петлю з, tl.X to br.X
і, вкладеного циклу, з, tl.Y to br.Y
щоб намалювати їх. Приклад нижче:
for (int x = tl.X; x <= br.X;x++) {
for (int y = tl.Y; y <= br.Y;y++) {
//Assuming tileset setup from image
Vector2 tilesetCoordinate = new Vector2((mapTiles[x,y] % 8) * 32,(mapTiles[x,y] / 8) * 32);
//Draw 32x32 tile using tilesetCoordinate as the source x,y
}
}
- Джекпот! Ось основи плиточного двигуна. Ви можете бачити, що легко мати навіть карту 1000x1000 з не надто великими накладними витратами. Крім того, якщо у вас менше 255 плиток, ви можете використовувати байтовий масив, скорочуючи пам'ять на 3 байти на комірку. Якщо байт занадто малий, ушорт, ймовірно, вистачить для ваших потреб.
Примітка. Я покинув концепцію світових координат (на чому базуватиметься положення вашої камери), оскільки це, на мою думку, виходить за рамки цієї відповіді. Про це можна прочитати тут, на GameDev.SE.
Мої ресурси з плиткових двигунів
Примітка: Все це орієнтоване на XNA, але це в значній мірі стосується будь-чого - вам просто потрібно змінити розіграші дзвінків.
- У моїй відповіді на це запитання вказується, як я обробляю комірки карти та шари в своїй грі. (Див. Третє посилання.)
- Моя відповідь на це питання пояснює, як я зберігаю дані у двійковому форматі.
- Це перший (ну, технічно другий, але перший «технічний») пост в блозі про розвиток гри, над якою я працював. Вся серія містить інформацію про такі речі, як піксельні шейдери, освітлення, поведінка плиток, рух та все таке цікаве. Я фактично оновив публікацію, щоб включити зміст моєї відповіді до першого посилання, яке я розмістив вище, тому ви, можливо, захочете прочитати її замість (я, можливо, додав речі). Якщо у вас є якісь питання, ви можете залишити коментар там чи тут, і я з радістю допоможу.
Інші ресурси плиточного двигуна
- Навчальний посібник з роботи з плитками з цього сайту дав мені основу, яку я використав для створення своїх карт.
- Я ще не переглядав ці відеоуроки, тому що не мав часу, але вони, мабуть, корисні. :) Вони можуть бути застарілими, якщо ви використовуєте XNA.
- На цьому сайті є ще кілька навчальних посібників, які (я думаю) засновані на вищезазначених відео. Можливо, варто перевірити.