Пятница, 29 Марта 2024, 15:08

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » тайловый редактор gtiled [в разработке]
тайловый редактор gtiled [в разработке]
afqДата: Понедельник, 21 Декабря 2020, 01:13 | Сообщение # 1
Разработчик
Сейчас нет на сайте


GTILED - тайловый редактор. Захотелось сделать такой редактор для своей игры. Tiled не устроил. В этой версии можно делать бесконечный мир и сохранять в обычный массив. Вот видео с демонстрацией.



вот ссылка на github


Сообщение отредактировал afq - Понедельник, 21 Декабря 2020, 03:25
afqДата: Понедельник, 21 Декабря 2020, 04:08 | Сообщение # 2
Разработчик
Сейчас нет на сайте
Пишите ваши пожелания по функционалу, если будет интересно сделать и смогу, то сделаю.
k0feДата: Понедельник, 21 Декабря 2020, 04:12 | Сообщение # 3
BRONX
Сейчас нет на сайте
Добавь опциональную функцию, которая при переключении слоёв будет рендерить элменты не текущего слоя полупрозрачными
Ты на видосе сам забыл, что на каком слое находится)


мой стрим, который я редко включаю, но зато на нём я делаю игры
afqДата: Понедельник, 21 Декабря 2020, 04:15 | Сообщение # 4
Разработчик
Сейчас нет на сайте
а ну да. такое можно попробовать сделать. но сделать вроде не просто. надо подумать как.
afqДата: Понедельник, 21 Декабря 2020, 04:33 | Сообщение # 5
Разработчик
Сейчас нет на сайте
всё, добавил. с прозрачностью там проблема почему то. не получается сделать прозрачный, только осветленный. теперь не видно всех слоев одновременно. надо ещё сделать опцию, чтобы смотреть все слои.
afqДата: Понедельник, 21 Декабря 2020, 04:41 | Сообщение # 6
Разработчик
Сейчас нет на сайте
Добавил прозрачность слоев.

Storm54Дата: Понедельник, 21 Декабря 2020, 11:17 | Сообщение # 7
постоянный участник
Сейчас нет на сайте
Чем Tiled не устроил?
afqДата: Понедельник, 21 Декабря 2020, 13:00 | Сообщение # 8
Разработчик
Сейчас нет на сайте
Storm54, tiled хорош конечно же, но да, есть то что не устроило. Во первых это то, что в tiled нужно создавать ограниченную сетку, например 100x100 тайлов. Я же не знаю сколько у меня уровень займет, как я буду указывать сколько тайлов уровень должен быть? Хранение данных, в этом случае есть несколько видов хранения данных. game maker вроде, xml и json. Это конечно же сделано, чтобы в любых движках подошло, но меня такое не устраивает. Мне надо, чтобы можно было в файле считать структуру, получить размеры и создать массив. и считать 10 слоев массивов. Это как мне кажется, намного удобней. А если в tiled делать бесконечную сетку, то данные, которые сохраняются, вообще не понятно как потом использовать. Ты видел как данные сохраняются в файл, если в tiled указать бесконечную сетку? Я вот не разобрался как ими пользоваться. А у меня сколько бы ты не делал карту в бесконечной сетке, карта будет отсчитываться от нуля.
Storm54Дата: Понедельник, 21 Декабря 2020, 14:01 | Сообщение # 9
постоянный участник
Сейчас нет на сайте
Попробовал создать бесконечную карту в Tiled. Сохраняет он довольно просто: XML с набором чанков. У каждого чанка есть расположение в глобальной системе координат и размер. Внутри чанка содержится массив в CSV формате из которого можно получить значения тайлов. Парсится это вручную на любом языке минут за 10.

Сообщение отредактировал Storm54 - Понедельник, 21 Декабря 2020, 14:02
afqДата: Понедельник, 21 Декабря 2020, 14:39 | Сообщение # 10
Разработчик
Сейчас нет на сайте
Storm54, а в моем случае парсить ничего не надо. Ну раз ты понял как там сделано, значит там всё нормально сделано, просто я не допонял. Ладно, уже сделаю свою реализацию.
Storm54Дата: Понедельник, 21 Декабря 2020, 15:57 | Сообщение # 11
постоянный участник
Сейчас нет на сайте
Если цель - набраться опыта, то можно свой велосипед написать. Если же целью является игра, то лучше потратить немного времени и разобраться в формате, который предоставляет Tiled. Это отличный инструмент. Свой редактор, с такими же возможностями пишется несколько месяцев и в итоге будет ничуть не лучше, чем уже созданный.

Сохранять сишные структуры напрямую в файл и считывать из файла - некорректно. Разные параметры компилятора при сборке проекта могут привести к различному расположению данных в памяти. Как минимум, включая/выключая выравнивание памяти, уже будет разный результат. На современных интеловских процессорах (если не ошибаюсь, то с поколения Haswell) доступ к не выровненной памяти уже не влияет так сильно на производительность, так что компиляторы, зная это, могут и вовсе выключить подобную оптимизацию. В итоге, при сборке проекта на разные CPU, будет разный результат работы программы.
Также не стоит забывать про архитектуры big-endian и little-endian, различия которых приведут к тому, что сохранив файл на одной архитектуре, невозможно будет работать с сохраненными данными на другой, без предварительной конвертации.
afqДата: Понедельник, 21 Декабря 2020, 18:30 | Сообщение # 12
Разработчик
Сейчас нет на сайте
Цитата
Сохранять сишные структуры напрямую в файл и считывать из файла - некорректно. Разные параметры компилятора при сборке проекта могут привести к различному расположению данных в памяти.

А зачем мне менять параметры компилятора? да и что там может с данными случиться. выравнивание идет только на начало массива. чтобы к нему можно было обращаться удобней из ассемблера и всего то. Для вас это не корректно, а для меня это удобный способ. если создавать двумерный массив в стеке, то он будет сплошным. Не рассказывайте мне сказки пожалуйста.
Storm54Дата: Вторник, 22 Декабря 2020, 10:52 | Сообщение # 13
постоянный участник
Сейчас нет на сайте
По поводу параметров компилятора: язык C в большинстве случаев подразмувает кроссплатформенность. Если я захочу собрать этот редактор на каком-нибудь PowerPC с Big-Endian архитектурой, я должен буду пройтись по всему исходному коду, чтобы поправить работу с файлами, а может и что-то еще?! Не думаю. Программа должна быть написана так, чтобы была возможность ее скомпилировать на разные платформы, особенно этот редактор, который может и на винде использоваться.
Что может случиться с данными: во первых, как я написал выше, различия архитектур little-endian и big-endian уже приведут к некорректному поведению программы. Во вторых, компилятор может изменять размеры структур в угоду оптимизации Struct Padding. Я уже увидел в проекте сохранение структуры level. Сейчас с ней проблем не будет, но, если бы она хранила в себе элементы char, то выравнивание памяти могло бы сыграть свою роль.
Про сказки вообще не в тему. Если я в чем-то не прав, то укажите - в чем именно. То же выравнивание данных с ассемблером и удобством вообще не связано, как вы указали, а служит лишь для того, чтобы сократить обращения к памяти.


Сообщение отредактировал Storm54 - Вторник, 22 Декабря 2020, 10:53
afqДата: Вторник, 22 Декабря 2020, 18:14 | Сообщение # 14
Разработчик
Сейчас нет на сайте
Цитата
То же выравнивание данных с ассемблером и удобством вообще не связано, как вы указали, а служит лишь для того, чтобы сократить обращения к памяти.

Storm54, как это сократить обращение к памяти? я же пишу что это удобство. адрес либо кратен 4 либо 8. но в 64 вроде 8 кратен, потому что регистр занимает 8 байт. из это следует, что размер всегда будет выделяться по такому адресу, который кратен 8. Единственное что в структуре можно сделать, чтобы адреса не были кратны внутри структуры, так это использовать атрибут у структуры под названием __packed.
а насчет порядка байт, так это можно создать еще в структуре int, и записать в него 1. сравнивать в движке, если равно единице, то преобразовывать массив не нужно. но это гораздо проще, чем цеплять с собой ещё библиотеку, для того, чтобы прочитать уровень. и вы вообще видели, чтобы в коммерческой игре были файлы с открытым файлом, где можно посмотреть как выглядит уровень? все в бинарный файл упаковывают. я ниразу не видел игру, чтобы там использовался формат от tiled. например в json. вы говорите не корректно, тогда как по вашему уровни упаковывают? приведите пример, если известно, что по вашему корректно использовать tiled, и пример игры, которая использовала tiled и оставила файлы уровня в таком же виде, каком tiled сохранил.
Storm54Дата: Вторник, 22 Декабря 2020, 19:25 | Сообщение # 15
постоянный участник
Сейчас нет на сайте
Адрес может быть не кратен машинному слову(Ссылка, если не знаете, что такое машинное слово). Минимальный размер данных, который запрашивает компьютер из памяти, равен машинному слову. Следовательно, если данные не выровнены, то потребуется два обращения к памяти. Обращение к памяти в десятки, а то и в сотни раз дольше, чем 1 такт CPU, поэтому компиляторы и выравнивают данные в структурах ради оптимизации.

Под некорректностью я подразумевал ошибки, которые возникнут при использовании программы на разных платформах. Все ошибки я подробно описал выше. Огромное количество коммерческих программ используют открытые форматы данных: Steam - файлы appmanifests, которые содержат информацию о каждой установленной игре, формат этих файлов - JSON и они спокойно открываются блокнотом. Тоже самое и с Epic Games Store. Большинство продуктов Microsoft (Office, PowerPointer, Excel и т.п.) хранят данные в XML, иногда XML сжимается с помощью GZIP, чтобы файл занимал меньше места.
В играх ситуация аналогичная. Данные могут быть в любом открытом формате, сжатом с помощью современных алгоритмов сжатия. Последней игрой, которую я анализировал, был Mount & Blade II: Bannerlord - все сцены в этой игре описаны в файлах с расширением xscene. Открывается обычным блокнотом, формат XML.

Кто-то и в бинарном формате сохраняет. Но, в бинарном формате сохранять можно по-разному. Я лишь указывал, что брать и сохранять напрямую содержимое памяти - некорректно, т.к. на разных платформах физическое представление одних и тех же логических данных будет различаться.


Сообщение отредактировал Storm54 - Вторник, 22 Декабря 2020, 19:27
XakepДата: Среда, 10 Февраля 2021, 21:23 | Сообщение # 16
めちゃくちゃちゃ
Сейчас нет на сайте
Компилятор не будет оптимизировать сишные структуры, это может сделать C++, но не C. У сишных структур layout всегда будет такой как ты описшешь и паддинги одинаковые и расположение полей не изменится, поэтому часто делают FFI через C, это очень удобно. Но вот с big endian и little endian это реальная проблема.

Цитата afq ()
все в бинарный файл упаковывают

Если все так делают, не значит что и тебе нужно, ты какую вообще пытаешь проблему этим решить? То что они упаковываются в бинарники не значит, что они используют сишные структуры, есть бинарные форматы сериализации такие как protobuf, flat buffers, capnproto, apache thrift итд. Если хочется писать свой бинарный формат, то это тоже делается по другому, если интересно как, можешь глянуть у мою утилиту для конвертации obj в stl, правда она на C++ написана. Смотри bytes_writer.cpp и stl.cpp

Добавлено (10 Февраля 2021, 21:26)
---------------------------------------------
Понимаю что тема древняя и автор возможно уже забросил проект, но вдруг мой совет будет полезен )

DmitriyFominДата: Пятница, 12 Февраля 2021, 15:53 | Сообщение # 17
уже был
Сейчас нет на сайте
Тема очень интересная, я в этом деле новичок и вот пару моментов для себя нашёл о которых даже и не знал.
Форум игроделов » Программирование » C/C++ » тайловый редактор gtiled [в разработке]
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг