![]() |
Создание 2Д игр с условно бесконечным пространством
Под условно бесконечным подразумевается то что игровая карта будет большой, настолько большой что игрок в ходе игры не сможет осознать ее размеры !! Реалтаймовой или еще какой либо генерации пространства не будет !!
Вообще размеры карты это уже косвенный вопрос, а интересует в первую очередь слудующие: 1) Объекты на карте: Я так думаю нужно вводить какуето игровую единицу растояния и в файлах даных записывать позиции объектов в етих единицах: объект1, 100, 20; объект2,5000,450; и т. д. 2) Отображение карты на экране и навигация игрока: Ну а тут я вообще хз !! Вот допустим игрок види часть карты на экране по Х 100 - 200 игровых единиц, по У 250 - 300 игровых единиц !! Если у нас есть какие то игровые объекты то отображаем их !! При перемещении игрока все время пересчитываем !! Но как быть с ландшафтом ?? Вторая мысль типа создание какойто композитной картинки куда отрендерить кусок карты с ландшафтом объектами и прочим и двигать эту картинку по экране при перемещении !! Вообщем хотелось бы услышать толковые решения знающих !! Спасибо !! :) |
Ответ: Создание 2Д игр с условно бесконечным пространством
чо-чо ?? Никто не делал двухмерные игры ?? Или непонятны вопросы ??
Эх.. Ох.. Ах.. (( |
Ответ: Создание 2Д игр с условно бесконечным пространством
в 2д обычно расстояния меряют клетками из которых это 2д и состоит.
В СтарКрафт-1 например самая большая карта это 256*256, и это реально огромная карта. |
Ответ: Создание 2Д игр с условно бесконечным пространством
не ну я представляю что нужно какой то порог дискретности, но как определять что выводить на экран юзеру ?? Не всю же эту карту огромную карту держать в видеопамяти ??
|
Ответ: Создание 2Д игр с условно бесконечным пространством
1. У тебя есть объекты (тайлы, юниты и остальное), есть координаты экрана, строишь квадтри уровня, делаешь запрос объектов, рисуешь необходимые.
2. Если поле - двухмерный массив, то исходя из координат экрана рассчитываешь область подмассива которую надо рисовать - рисуешь... 3. Еще что-то подобное... что давно не рисовалось можно выгружать. Либо что далеко от координат экрана. |
Ответ: Создание 2Д игр с условно бесконечным пространством
объекты имеют X,Y, RenderSize.
Так же нужно иметь OFFX,OFFY - смещения, как бы 2Д координаты камеры. В цикле проверяешь (для каждого объекта), входит ли его XY координаты в прямоугольник экрана + RenderSize объекта. Усе! А если тебе не понятна единица измерения - делай, к примеру, по 10 пикселей на единицу. и выводи - x*10,y*10 . Хотя я так бы не стал. |
Ответ: Создание 2Д игр с условно бесконечным пространством
Всё правильно насоветовали!
Для Colominer'a делал тайловый движок - есть список зон, в каждой зоне 75*75 тайлов. У каждой зоны есть свои локальные координаты и у каждого тайла есть локальные координаты внутри зоны. Функции, которые конвертируют экранные координаты в локальные зоны (с учётом смещения камеры) и локальные тайла, возвращают сам тайл. И функции обратной конвертации для отрисовки тайла. |
Ответ: Создание 2Д игр с условно бесконечным пространством
всем спасибо !!
2Д игры это просто !!:crazy: |
Ответ: Создание 2Д игр с условно бесконечным пространством
имхо
Цитата:
Цитата:
|
Ответ: Создание 2Д игр с условно бесконечным пространством
не ну чо имеется в виду что мир будет очень большой, для юзера будет казатся бесконечным, но тем не мение ввесь мир будет сразу описан в файлах даных и не будет генерироватся в ходе игры еще что то !!
|
Ответ: Создание 2Д игр с условно бесконечным пространством
Вложений: 1
У меня вопрос не по теме, но тоже про создание пространства. Взгляните на пример во вложении. Структуру лабиринта из примера слева можно просто хранить в памяти, разбив на сектора, каждый сектор может иметь одно из двух значений: "стенка" или "пустота". Карту такого лабиринта можно хранить построчно в файле из 10 строк, по десять символов в каждой:
PHP код:
|
Ответ: Создание 2Д игр с условно бесконечным пространством
ну можно по аналогии - есть стенка/нету, но тут тебе нужно уже описывать не ячейку а ее 4 стенки !! Но поскольку одна стенка принадлежит сразу двум ячейкам то зачем описывать эту стенку два раза в двух ячейках !! Можно просто описать стенки по горизонтали и по вертикали !! В этом случаее будет 9 значений в ряд, или 11 если учитывать еще ограничивающие стенки !!
Первая строка по горизонтали будет - 10010010011, а по вертикали - 11010110101 !! |
Ответ: Создание 2Д игр с условно бесконечным пространством
А если усложнить задачу и учитывать, что у стенки с разных сторон должна быть разная текстура или просто я введу какое-то свойство стенки, которое может отличаться у неё с обоих сторон?
|
Ответ: Создание 2Д игр с условно бесконечным пространством
а кто ограничивает каким числом описывать ячейку? можно же отвести 1,2,4,8,16 для типа пола, 32, 64, 128 - для типа стенок.
Это если важно чтобы поле было описано имеено так как ты написал. и кстати, если всётаки только один символ на ячейку, то можно использывать же char*он там до 256 кажется же, |
Ответ: Создание 2Д игр с условно бесконечным пространством
Метод хранения роли не играет. Мне интересно, как правильнее разбивать лабиринт на сектора. По пустым пространствам может перемещаться персонаж, там могут находиться какие-либо предметы или ещё что-то. Пустые пространства в любом случае надо как-то хранить в памяти, всё равно разбивая на сектора, как и на рисунке. Но и информацию о стенках как-то надо хранить. А они, в отличие от первого рисунка, не лежат в зоне секторов, а лежат между секторами, как по вертикали, так и по горизонтали. Вот я и не знаю, как лучше хранить это всё вместе. Если хранить по методу, который описал IGR, то отдельно придётся информацию о секторах хранить. А при перемещении персонажа по лабиринту придётся учитывать информацию из двух разных источников. Как-то бы разбить по уму всё на сектора, чтобы получилась единая структура, по которой было бы несложно перемещаться в циклах, как по двумерному массиву.
|
Ответ: Создание 2Д игр с условно бесконечным пространством
Если хранить допустим в тойже xml, то можно держать описание сектора, а внутри его описания к его стенкам.
По типу такого( для первой ячейке твоего примера) Код:
<sector location="1;1" type="1" > |
Ответ: Создание 2Д игр с условно бесконечным пространством
Полегче, у меня игра будет для мобилы, всё будет проще. =) По сути ты предлагаешь делить на сектора, как на рисунке, и у каждого сектора хранить информацию об окружающих его стенках. Я так и думал делать, но меня просто смущает некоторая избыточность, как и сказал IGR, потому что о каждой стенке информация так или иначе будет содержаться в двух соседних секторах. Но я сейчас подумал, наверно это будет хороший вариант. Я буду хранить не информацию о стенках, а информацию о полустенках, пофиг на исбыточность, зато можно будет прикольные вещи делать, например сделать стенку однопроходной, чтобы через неё в одну сторону можно было пройти, а в другую нет. Или порталы. В общем, вопрос решён. Спасибо. =)
|
Ответ: Создание 2Д игр с условно бесконечным пространством
Цитата:
|
Ответ: Создание 2Д игр с условно бесконечным пространством
Да не, зачем усложнять. Я даже в памяти поле лабиринта наверно буду просто как массив чисел хранить. Если вдруг станет мало 4 байт, увеличу тип до Long.
|
Ответ: Создание 2Д игр с условно бесконечным пространством
Вложений: 2
Хм... не вижу разницы
Вложение 13613 блоки на уровне расставлять можно анализируя матрицы 3х3: Вложение 13614 |
Ответ: Создание 2Д игр с условно бесконечным пространством
pax, у меня и такая идея тоже была, но в таком случае нужно ещё хранить и углы секторов, информация о которых в коде вообще нафиг не нужна. Всё таки буду делать так, как решил. =)
|
Ответ: Создание 2Д игр с условно бесконечным пространством
Эм... мне казалось во втором варианте лабиринт больше в 4 раза... нет? Я что-от не понял про углы секторов...
|
Ответ: Создание 2Д игр с условно бесконечным пространством
Нее, лабиринт не больше. Поле по сути такое же. Он только кажется больше засчёт того, что стенки в нём находятся между секторами, а не являются секторами, как в первом.
|
Ответ: Создание 2Д игр с условно бесконечным пространством
не ну в первом случае стенки занимают (отнимают) место в лабиринте, а во втором нет так как стенки именно между ячейками !! По этому в первом лабиринте пространства меньше чем во втором !!
|
Ответ: Создание 2Д игр с условно бесконечным пространством
Вложений: 1
Во втором случае стенками являются все клетки, в отличии от первого, а ходить можно по ребрам. Это как раз увеличивает площадь лабиринта в 4 раза так как я расставил нолики и единички.
Собственно я хотел собрать первый лабиринт из блоков второго - у меня не получилось... наверное потому что принцип построения разный. Карту такую можно собрать из ~10 разновидностей блоков каждый поворачивая на 0/90/180/270 градусов, но сетка передвижения будет такой как я привел. Если хочешь, чтобы она была такого же разрешения, как и первый лабиринт, то второй надо инвертировать. Но опять же новый лабиринт будет больше, т.е. клеток, на которые можно наступить будет больше: Вложение 13616 Правда надо будет хранить информацию о гранях/углах для столкновений... Так что даже не знаю как ты собираешься с тем же разрешением сделать нормальную обработку... Потом поделись решением, если не секрет будет ;) |
Ответ: Создание 2Д игр с условно бесконечным пространством
Вложений: 1
Всё можно сделать чуточку проще. Представьте себе, что вам нужно сделать кольчугу из квадратиков. Причём базовый элемент кольчуги должен быть одинаковый. Что мы сделаем? Правильно, сделаем элемент, который имеет соединения типа "папа" с, допустим, нижней и правой стороны, и "мама" с верхней и левой. И тогда можно строить какие угодно кольчуги.
Тот же принцип и здесь: чтобы не было повторяющихся стенок, храним информацию только о 2х из 4х стенок - информацию о двух других стенках в любом случае содержат наши "соседи". С точки зрения хранения инфы это всего 2 бита инфы для ячейки, + если для хранения одной ячейки используется 1 байт, у тебя остаётся ещё 6 бит на описание того, что находится в ячейке. Из потенциальной проблемы только границы уровня, но тут либо делать их всегда закрытыми, либо добавлять ещё по ряду "лишних" клеток с незаписываемых сторон лабиринта. В аттаче помалевал поверх лабиринта его "схему" - зелёные линии получились там, где нижняя стенка, синие - где правая, белые уголки - где обе хранимые стенки. Думаю, понятно вышло... UPD. В принципе получается, что "стеночный" лабиринт вдвое больше по количеству информации, чем его "блочный" собрат. Что касается формы хранения и обработки - 2 бита на стенки, 6 на содержимое должно хватить (2^6 = 64 разных состояния клетки, или 63 айтема + пустая клетка), во время перемещения персонажа я бы держал в памяти для удобства массивчик Surround 3х3, в котором хранил бы возможность перейти в соседнюю клетку из текущей. ЧТобы просчитать Surround-карту достаточно точечно (считай - без вложенного цикла) взять 8 позиций из карты лабиринта (не нужно брать нижнюю правую клетку, т.к. её данные ни на что не повлияют) если персонаж может гулять по диагонали, или вообще 3, если не может (левее, выше, и прямо где персонаж). |
Ответ: Создание 2Д игр с условно бесконечным пространством
Цитата:
Taugeshtu, всё таки я думаю, что со способом, на котором я определился, будет проще работать в программе. |
Ответ: Создание 2Д игр с условно бесконечным пространством
"Я так думаю нужно вводить какуето игровую единицу растояния и в файлах даных записывать позиции объектов в етих единицах: объект1, 100, 20; объект2,5000,450; и т. д."
Эм... допустим у тебя 500 объектов (при такой большой карте вполне реальное число). итак, надо ввести условие, попадает ли объект на область экрана, и если да, то прорисовываем. А теперь подумайте. Допустим, тебя устравивает 10 фпс. Значит, нужно проводить 500*10*2 (сравнивается x и y)=10000 сравнений в секунду. Чисто для одного условия из кода. ИМХО, это не очень полезно для быстродействия. |
Ответ: Создание 2Д игр с условно бесконечным пространством
Цитата:
Для примера представь себе, как тяжело физиксу, когда у него в памяти сидит тримеш уровня о 100к вершин, и ещё 100 патиклов с физическим взаимодействием с миром на него сыпятся. Да-да, это 10М переборов, и ведь жуёт, зараза! Ну а для телефонных игр условно бесконечное пространство - ооооочень сомнительная фича. Даже на 5" экране. |
Ответ: Создание 2Д игр с условно бесконечным пространством
Я говорил про мобильный телефон =)
Простите, не читал тему полностью. Вообще вполне реально создать такую карту, чтобы была ну очень большого размера. Ведь по сути память занимает массив с индексами тайлов. И если взять размер тайла 30х30 пикс., а матрица будет 500х500, то это замет 25000*6 байт (вроде столько занимает интегер)=150Кб, а размер такого мира -15000 пикс (что примерно 50 мобильных экранов в ширину и около 38 экранов в высоту). Думаю, только профессиональные мазохисты решат обследовать весь такой мир =) |
Ответ: Создание 2Д игр с условно бесконечным пространством
Ты ошибся. 500*500*4= 1 000 000 байт = почти мегабайт.
Integer занимает 4 байта |
Ответ: Создание 2Д игр с условно бесконечным пространством
О точно... сорри
|
Ответ: Создание 2Д игр с условно бесконечным пространством
да какая разница мегабайт или два, не для микрокотроллера программу ж пишем ж !!
П.С.: хотел бы обратить внимание на старт пост !! Может еще кто то поделится своими идеями !! ;) |
Ответ: Создание 2Д игр с условно бесконечным пространством
Цитата:
|
Ответ: Создание 2Д игр с условно бесконечным пространством
А вообще для чего тебе надо? Для самой игры (чтобы там персонаж бегал) или типа ролик (камера летит из одного угла в другой, показывая красоту сдешней природы).
|
Ответ: Создание 2Д игр с условно бесконечным пространством
Цитата:
|
Часовой пояс GMT +4, время: 17:45. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot