• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Union SDK - Инструменты разработчика

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
UnionProjectIcon.png


Union SDK

инструменты разработчика

Тема находится в состоянии наполнения



Короткие видеоролики, смысл которых максимально быстро погрузить смотрящего в устройство движка готики.

Рекомендуется смотреть на YouTube, поскольку там имеется сегментированный таймлайн.






Схемы классов движка
1600263933953.png
1600263981919.png
1600264017579.png
 

Вложения

  • sizeof.xlsx
    896,7 KB · Просмотры: 73
  • Union_SDK_1_0m.zip
    20,6 MB · Просмотры: 87
Последнее редактирование:

sam0delk1n

Участник форума
Регистрация
19 Апр 2020
Сообщения
24
Благодарности
1
Баллы
60
Вопросы и замечания по Видео 1.
  • Задание сделал.
  • Структура проекта изменилась. Видеоформат это круто, но его актуальность тяжело поддерживать. Я так понял теперь свой код в файле Application.cpp надо писать.
  • namespace версии игры по умолчанию не указан, нужно добавлять (типа Gothic_I_Classic::screen->Print()) или указать using namespace. Наверное явно указывать лучше, просто на видео этот момент пропущен.
  • Для функции std::time() нужно подключить ctime - это очевидно, но как-то умолчалось. И я так понимаю начало Application.cpp нормальное место для своих инклюдов.
  • Очень много разных строк: zSTRING, CString, string. zSTRING - вообще монстр. Потом переопределять string имхо не очень-то здорово для читабельности. Лучше явно указывать std::string или Common::CString и т. д. Те кто пишут код например в vim без IntelliSense далеко не сразу могут догадаться что "стандартный" string переопределён.
  • Первые два аргумента в screen:: Print(), вроде бы координаты, но на взгляд они равны 1/4 пикселя, зачем?
  • Из папки system/autorun (в Gothic I) плагин не запускается. Только из Union.ini получилось.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
Структура проекта изменилась. Видеоформат это круто, но его актуальность тяжело поддерживать. Я так понял теперь свой код в файле Application.cpp надо писать.
Это твоя неактуальная, потому что ролики должны были выйти в момент официального релиза)) Тестовая сборка 1.0h чуть ниже 1.0f

namespace версии игры по умолчанию не указан, нужно добавлять (типа Gothic_I_Classic::screen->Print()) или указать using namespace. Наверное явно указывать лучше, просто на видео этот момент пропущен.
Для функции std::time() нужно подключить ctime - это очевидно, но как-то умолчалось. И я так понимаю начало Application.cpp нормальное место для своих инклюдов.
Это тоже вытекает из предыдущего. За вас объявлено и заинклудено, не надо это менять.

Очень много разных строк: zSTRING, CString, string. zSTRING - вообще монстр. Потом переопределять string имхо не очень-то здорово для читабельности. Лучше явно указывать std::string или Common::CString и т. д. Те кто пишут код например в vim без IntelliSense далеко не сразу могут догадаться что "стандартный" string переопределён.
В Union не используется std::string. Если обратишь внимание, это синоним CString собственного класса юниона.
zSTRING - движковый тип строк, причесанный под формат строк Union string для обратной совместимости.

Первые два аргумента в screen:: Print(), вроде бы координаты, но на взгляд они равны 1/4 пикселя, зачем?
Это будет обсуждаться в разборе игрового интерфейса. Виртуальный размер zCView - 8192х8192.

Из папки system/autorun (в Gothic I) плагин не запускается. Только из Union.ini получилось.
Опять же. Сборка пакета должна быть 1.0h.

И да, забегу вперед чтобы ты не накосячил случайно. После установки SDK 1.0h для создания сорсов и хидеров используешь эти элементы, иначе сыщешь себе приключений.
1587335190432.png


Чтобы ты понимал для чего все это - последняя версия плагинов настроена на мультиплатформинг (далее MP интерфейс) и максимальное удобство использования. И чтобы не производить лишних манипуляций по добавлению новых файлов в MP, все автоматизировано.
Файл компилятора, то бишь реальный .cpp, в проекте будет ОДИН. Это Interface.cpp, все остальное - бутафория. Последующие добавления .cpp в проект будут переводить их в Заголовки, чтобы они беспрепятственно подрубались к интерфейсу, но при этом имели привычный прогеру формат.
 

sam0delk1n

Участник форума
Регистрация
19 Апр 2020
Сообщения
24
Благодарности
1
Баллы
60
В Union не используется std::string. Если обратишь внимание, это синоним CString собственного класса юниона.


Нельзя же запретить разработчику пользоваться std::string внутри его кода.
Вот такой фрагмент кода:
C++:
void Game_Loop() {
    using namespace std;
    string my_string;
}
сгенерирует ошибку неоднозначности символа. Глобально переопределять имена стандартной библиотеки плохая практика.

Написать программисту CString вместо string рука не отвалится, зато сразу видно с какими типами объекта работаешь и какими методами они обладают.
C++:
void Game_Loop() {
    using namespace std;
    string my_std_string;
    CString my_gothic_string;
}
Внутри Union можно переопределять как угодно, но не выносить наружу. Это моё мнение.

Ещё я заметил что происходит #include <time.h> вместо #include <ctime>. Интерфейсы схожи, но реализация в C++ иногда лучше. Вопрос планируется ли поддержка API для C?

Оба вышеописанных замечания не критичны, но я думаю полезно знать мнения пользователей.

Перепрошёл Видео 1 с новым SDK 1.0h:
  • Я вот использовал набор инструментов v141 за неимением v100 - вроде бы пока работает.
  • Также я использовал Win10 SDK вместо там кажется 8.1 по умолчанию стояла. Я так понимаю этим действием я ограничиваю работу своего кода только Win 10?
  • Ещё была проблема - не появлялся шаблон в Visual Studio. Это мой косяк. Нужно было установить компонент "Преобразование текстовых шаблонов". Я не постоянный пользователь студии - для меня это было неочевидно.
  • В Менеджере Ресурсов я так понимаю можно только обновлять SDK, а удалять нельзя? Можно ли как-то без прав админа обходиться?
Пойду пробовать Видео 2.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
Нельзя же запретить разработчику пользоваться std::string внутри его кода.
Написать программисту CString вместо string рука не отвалится, зато сразу видно с какими типами объекта работаешь и какими методами они обладают.
Давно у нас толковые разработчики разучились настраивать проекты под себя? :)
Вообще все подобные вопросы - это вопросы профессиональных привычек, присущие только разработчикам на Cи-подобных языках. За счет специфики самих языков и отсутствия нормальных фреймворков, код всегда получается инфо-перегруженным, и это становится частью программера. Отсюда и всплывает претензия: "но как же так! Я не могу использовать std::string???". С одной стороны справедливо, но это палка о двух концах. Изначально весь интерфейс построен так, чтобы, создав проект по шаблону, кодер сел кодить, а не заниматься абсурдной Сишной рутиной :)
С другой стороны, если ты программист с определенной моделью мышления, который в силу привычек кодить по дургому не умеет, настрой проект как тебе захочется. Union SDK лежит и ProgramData и на него ссылаются все плагины.

Подведем итог - шаблон проекта собран для конечного использования как для новичков, так и для профи. Все что в нем есть - сделано для удобства обычному пользователю. В Union SDK есть практически все, чтобы написать любой плагин без сторонних включений. Основной принцип Union SDK - простота и доступность его интерфейса.
C++:
    Array<string> commons;
    Array<string> tokens = line.Regex_Search( "\[\w+\]" );
    for each( string token in tokens )
      if( token.Upper().EndWith( "_COMMON" ) )
        commons += token;



Вопрос планируется ли поддержка API для C?
А для чего?

Я вот использовал набор инструментов v141 за неимением v100 - вроде бы пока работает.
Это не страшно :). В плагине определены глобальные операторы new/delete. Если не будешь их трогать, то абсолютно не важно какой тулсет будет выставлен.

Также я использовал Win10 SDK вместо там кажется 8.1 по умолчанию стояла. Я так понимаю этим действием я ограничиваю работу своего кода только Win 10?
Вряд ли, восьмерка слишком актуальна, чтобы просто так списать ее со счетов.

В Менеджере Ресурсов я так понимаю можно только обновлять SDK, а удалять нельзя? Можно ли как-то без прав админа обходиться?
Процесс удаления не писал, сделаю это если появятся подобные просьбы. Права админа нужны для того, чтобы без специальных установщиков накатить поверх студии визард, автоматизирующий добавление .h и .cpp в интерфейс плагина. (см скриншот из моего предыдущего сообщения)
 

sam0delk1n

Участник форума
Регистрация
19 Апр 2020
Сообщения
24
Благодарности
1
Баллы
60
Вообще все подобные вопросы - это вопросы профессиональных привычек
Выравнивать строки после "=" или ставить в таб два пробела - это привычки - они безобидны и неопасны.

Прошёл Видео 2. Вроде работает. Далее мне в этот раздел?
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
Выравнивать строки после "=" или ставить в таб два пробела - это привычки - они безобидны и неопасны.
А никто не говорит что они опасны :) Любая привычка приходит со временем. И зная, что использовать пакет могут не программисты, я делаю ставку на максимальную простоту интерфейса при максимально возможном функционале.

Прошёл Видео 2. Вроде работает. Далее мне в этот раздел?
Ну можешь глянуть пока я еще роликов не нарежу
 

sam0delk1n

Участник форума
Регистрация
19 Апр 2020
Сообщения
24
Благодарности
1
Баллы
60
На Видео 2 упоминалась схема с game loop. Но выглядела она не совсем однозначно. Для новичков будет полезно знать в какой именно последовательности происходит обработка основных компонентов игры в цикле (опрос ввода, логика, физика, рендер и т. д.).

Также я вижу только одну функцию в плагине - void Game_Loop(). Интересно где именно она вызывается в цикле.

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

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
На Видео 2 упоминалась схема с game loop. Но выглядела она не совсем однозначно.
Не-не-не. Я дня два сидел и думал как лучше нарисовать схему, фактически там все ветвится и переплетается. Возможно в другой раз, если получится собраться с мыслями.

Также я вижу только одну функцию в плагине - void Game_Loop(). Интересно где именно она вызывается в цикле.
Покадровый цикл. Является калбеком класса zCWorld. Все калбеки опрашиваются в конце рендера мира.
Рендер сцены:
- Начало записи буфера DX
- Обновление игрового времени
- Обновление параметров визуальных эфеектов
- Рендер мира
- Обновление системного таймера
- Обновление вставляемых в мир НПС
- Обновление AI таймера
- Обновление AI рутин
- Конец записи буфера DX

Игровой цикл:
- Системные события и проверки
- Опрос ввода zCView интерфейса
- Рендер сцены
- Вывод на экран DX буфера

Других подобных циклов нет. Компенсируется это тем, что можно потыкать хуки в любые места движка.
 

sam0delk1n

Участник форума
Регистрация
19 Апр 2020
Сообщения
24
Благодарности
1
Баллы
60
А вот например рендер инвентаря. Там же 3D объекты рисуются. Они всегда поверх остальной картинки. Это делается с помощью сброса Z-буфера или другими подходами? Где в вышеприведённом цикле происходит отрисовка интерфейса?

Вот ещё более практические вопросы. В Видео 1 показана функция zCView::Print(). Допустим меня заинтересовал этот объект и я хочу применять другие его возможности. Я открываю zView.h но определение класса не выглядит достаточно информативным для нормальной работы. Как организовать дальнейший процесс разработки?

Попробовал вызывать функции zCView::Dialog(); zCView::DialogMessage(); zCView::PrintTimed(); с разными аргументами, но никакого эффекта не происходило.

Какими классами и методами пользоваться чтобы рисовать окна или что-то типа оверлея для вывода отладочных данных и прочей информации?
 
Последнее редактирование:

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
А вот например рендер инвентаря. Там же 3D объекты рисуются. Они всегда поверх остальной картинки. Это делается с помощью сброса Z-буфера или другими подходами? Где в вышеприведённом цикле происходит отрисовка интерфейса?
Между Обновление AI таймера и Обновление AI рутин есть ветка со всяким интерфейсным хламом

Вот ещё более практические вопросы. В Видео 1 показана функция zCView::Print(). Допустим меня заинтересовал этот объект и я хочу применять другие его возможности. Я открываю zView.h но определение класса не выглядит достаточно информативным для нормальной работы. Как организовать дальнейший процесс разработки?
Я не готов одним сообщением изложить информацию по целому классу. Потом короче говоря
 

sam0delk1n

Участник форума
Регистрация
19 Апр 2020
Сообщения
24
Благодарности
1
Баллы
60
А я вот такую вещь нашёл. Правда документировано всего несколько классов.

Я правильно понимаю, что zCView это не класс который рисует интерфейс, а он сам является объектом интерфейса? screen это корень и рисуется первым. К нему можно прикрепить другие zCView и получить иерархию. Рендер будет обходить иерархию и рисовать в таком порядке. А другие классы которые наследуются от zCView могут расширять элементы до конкретных окон, баров, кнопок и т. д.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
sam0delk1n, да, самым главным узлом является viewport, на него ложится screen. И в сам screen уже вкладываются все остальные элементы интерфейса.
Вот конкретно класс zCView - это нейтральный класс интерфейса. Лучший вариант для вывода чего-либо на экран или наследования.
 

sam0delk1n

Участник форума
Регистрация
19 Апр 2020
Сообщения
24
Благодарности
1
Баллы
60
А вот тогда более конкретные вопросы:
zCView::SetFont() - можно менять шрифт. А есть обычные системные моноширинные шрифты в стандартных ресурсах игры?
zCView::Line() - рисует линию. А можно нарисовать (или очистить цветом) прямоугольник?
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
можно менять шрифт. А есть обычные системные моноширинные шрифты в стандартных ресурсах игры?
Неа, но можно порыться в dx sdk и генерировать их

рисует линию. А можно нарисовать (или очистить цветом) прямоугольник?
Не предполагается. Делаешь прямоугольную вьюшку, задаешь ей текстуру "white.tga" и меняешь свойство color. Вьюшка отфильтрует каналы цветов. Так получаешь прямоугольник любого цвета.
Произвольная форма - это уже расширения типа `Round minimap ast` в ютубе гугли.
 

sam0delk1n

Участник форума
Регистрация
19 Апр 2020
Сообщения
24
Благодарности
1
Баллы
60
Есть ещё два вопроса касательно GAPI:
Можно ли взять из класса движка или хуком подцепить устройство d3d и рисовать им? Скорее вопрос стабильности такого подхода.
Можно ли в плагине создать d3d11 устройство и дорисовывать в окно игры после неё?
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
sam0delk1n, плагины самый безболезненный способ написать свой рендер. zCRenderer базовый класс рендера, zCRnd_D3D - игровой. Делаешь производный на любую платформу, хоть dx11, хоть vulkan какой-нибудь
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.081
Благодарности
1.901
Баллы
320
Можно ли взять из класса движка или хуком подцепить устройство d3d и рисовать им? Скорее вопрос стабильности такого подхода.
Если игрок поставит рендер dx11, то такое решение не будет работать. Также, этот рендер не умеет линии рисовать.
 

sam0delk1n

Участник форума
Регистрация
19 Апр 2020
Сообщения
24
Благодарности
1
Баллы
60
Последнее редактирование:
Сверху Снизу