Уважаемые гости и новички, приветствуем Вас на нашем форуме
Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».
Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
Удачи!
Друзья, доброго времени суток!
Стартовал новый литературный конкурс от "Ордена Хранителей" - "Пираты Миртанского моря". Каждый может принять в нём участие и снискать славу и уважение, а в случае занятия призового места ещё и получить награду. Дерзайте
Дорогие друзья, год подходит к концу, и пришло время подвести его итоги и наградить достойных
Не ленитесь, голосуйте в этой теме за тех форумчан, которые по вашему мнению больше всех проявили себя в этом году
По желанию, аргументировать свой выбор можете в теме обсуждения голосования.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Структура проекта изменилась. Видеоформат это круто, но его актуальность тяжело поддерживать. Я так понял теперь свой код в файле 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 получилось.
Структура проекта изменилась. Видеоформат это круто, но его актуальность тяжело поддерживать. Я так понял теперь свой код в файле 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 переопределён.
В Union не используется std::string. Если обратишь внимание, это синоним CString собственного класса юниона.
zSTRING - движковый тип строк, причесанный под формат строк Union string для обратной совместимости.
И да, забегу вперед чтобы ты не накосячил случайно. После установки SDK 1.0h для создания сорсов и хидеров используешь эти элементы, иначе сыщешь себе приключений.
Чтобы ты понимал для чего все это - последняя версия плагинов настроена на мультиплатформинг (далее MP интерфейс) и максимальное удобство использования. И чтобы не производить лишних манипуляций по добавлению новых файлов в MP, все автоматизировано.
Файл компилятора, то бишь реальный .cpp, в проекте будет ОДИН. Это Interface.cpp, все остальное - бутафория. Последующие добавления .cpp в проект будут переводить их в Заголовки, чтобы они беспрепятственно подрубались к интерфейсу, но при этом имели привычный прогеру формат.
Внутри Union можно переопределять как угодно, но не выносить наружу. Это моё мнение.
Ещё я заметил что происходит #include <time.h> вместо #include <ctime>. Интерфейсы схожи, но реализация в C++ иногда лучше. Вопрос планируется ли поддержка API для C?
Оба вышеописанных замечания не критичны, но я думаю полезно знать мнения пользователей.
Перепрошёл Видео 1 с новым SDK 1.0h:
Я вот использовал набор инструментов v141 за неимением v100 - вроде бы пока работает.
Также я использовал Win10 SDK вместо там кажется 8.1 по умолчанию стояла. Я так понимаю этим действием я ограничиваю работу своего кода только Win 10?
Ещё была проблема - не появлялся шаблон в Visual Studio. Это мой косяк. Нужно было установить компонент "Преобразование текстовых шаблонов". Я не постоянный пользователь студии - для меня это было неочевидно.
В Менеджере Ресурсов я так понимаю можно только обновлять SDK, а удалять нельзя? Можно ли как-то без прав админа обходиться?
Давно у нас толковые разработчики разучились настраивать проекты под себя?
Вообще все подобные вопросы - это вопросы профессиональных привычек, присущие только разработчикам на Cи-подобных языках. За счет специфики самих языков и отсутствия нормальных фреймворков, код всегда получается инфо-перегруженным, и это становится частью программера. Отсюда и всплывает претензия: "но как же так! Я не могу использовать std::string???". С одной стороны справедливо, но это палка о двух концах. Изначально весь интерфейс построен так, чтобы, создав проект по шаблону, кодер сел кодить, а не заниматься абсурдной Сишной рутиной
С другой стороны, если ты программист с определенной моделью мышления, который в силу привычек кодить по дургому не умеет, настрой проект как тебе захочется. Union SDK лежит и ProgramData и на него ссылаются все плагины.
Подведем итог - шаблон проекта собран для конечного использования как для новичков, так и для профи. Все что в нем есть - сделано для удобства обычному пользователю. В Union SDK есть практически все, чтобы написать любой плагин без сторонних включений. Основной принцип Union SDK - простота и доступность его интерфейса.
Процесс удаления не писал, сделаю это если появятся подобные просьбы. Права админа нужны для того, чтобы без специальных установщиков накатить поверх студии визард, автоматизирующий добавление .h и .cpp в интерфейс плагина. (см скриншот из моего предыдущего сообщения)
А никто не говорит что они опасны Любая привычка приходит со временем. И зная, что использовать пакет могут не программисты, я делаю ставку на максимальную простоту интерфейса при максимально возможном функционале.
На Видео 2 упоминалась схема с game loop. Но выглядела она не совсем однозначно. Для новичков будет полезно знать в какой именно последовательности происходит обработка основных компонентов игры в цикле (опрос ввода, логика, физика, рендер и т. д.).
Также я вижу только одну функцию в плагине - void Game_Loop(). Интересно где именно она вызывается в цикле.
К тому же в других движках обычно предоставляют несколько функций в разных местах цикла. Например пользователь может вставить код с логикой до физики, а код выставляющий камеру уже после физики но перед рендером.
Не-не-не. Я дня два сидел и думал как лучше нарисовать схему, фактически там все ветвится и переплетается. Возможно в другой раз, если получится собраться с мыслями.
Покадровый цикл. Является калбеком класса zCWorld. Все калбеки опрашиваются в конце рендера мира. Рендер сцены:
- Начало записи буфера DX
- Обновление игрового времени
- Обновление параметров визуальных эфеектов
- Рендер мира
- Обновление системного таймера
- Обновление вставляемых в мир НПС
- Обновление AI таймера
- Обновление AI рутин
- Конец записи буфера DX
Игровой цикл:
- Системные события и проверки
- Опрос ввода zCView интерфейса
- Рендер сцены
- Вывод на экран DX буфера
Других подобных циклов нет. Компенсируется это тем, что можно потыкать хуки в любые места движка.
А вот например рендер инвентаря. Там же 3D объекты рисуются. Они всегда поверх остальной картинки. Это делается с помощью сброса Z-буфера или другими подходами? Где в вышеприведённом цикле происходит отрисовка интерфейса?
Вот ещё более практические вопросы. В Видео 1 показана функция zCView::Print(). Допустим меня заинтересовал этот объект и я хочу применять другие его возможности. Я открываю zView.h но определение класса не выглядит достаточно информативным для нормальной работы. Как организовать дальнейший процесс разработки?
Попробовал вызывать функции zCView::Dialog(); zCView::DialogMessage(); zCView::PrintTimed(); с разными аргументами, но никакого эффекта не происходило.
Какими классами и методами пользоваться чтобы рисовать окна или что-то типа оверлея для вывода отладочных данных и прочей информации?
А вот например рендер инвентаря. Там же 3D объекты рисуются. Они всегда поверх остальной картинки. Это делается с помощью сброса Z-буфера или другими подходами? Где в вышеприведённом цикле происходит отрисовка интерфейса?
Вот ещё более практические вопросы. В Видео 1 показана функция zCView::Print(). Допустим меня заинтересовал этот объект и я хочу применять другие его возможности. Я открываю zView.h но определение класса не выглядит достаточно информативным для нормальной работы. Как организовать дальнейший процесс разработки?
А я вот такую вещь нашёл. Правда документировано всего несколько классов.
Я правильно понимаю, что zCView это не класс который рисует интерфейс, а он сам является объектом интерфейса? screen это корень и рисуется первым. К нему можно прикрепить другие zCView и получить иерархию. Рендер будет обходить иерархию и рисовать в таком порядке. А другие классы которые наследуются от zCView могут расширять элементы до конкретных окон, баров, кнопок и т. д.
sam0delk1n, да, самым главным узлом является viewport, на него ложится screen. И в сам screen уже вкладываются все остальные элементы интерфейса.
Вот конкретно класс zCView - это нейтральный класс интерфейса. Лучший вариант для вывода чего-либо на экран или наследования.
А вот тогда более конкретные вопросы: zCView::SetFont() - можно менять шрифт. А есть обычные системные моноширинные шрифты в стандартных ресурсах игры? zCView::Line() - рисует линию. А можно нарисовать (или очистить цветом) прямоугольник?
Не предполагается. Делаешь прямоугольную вьюшку, задаешь ей текстуру "white.tga" и меняешь свойство color. Вьюшка отфильтрует каналы цветов. Так получаешь прямоугольник любого цвета.
Произвольная форма - это уже расширения типа `Round minimap ast` в ютубе гугли.
Есть ещё два вопроса касательно GAPI:
Можно ли взять из класса движка или хуком подцепить устройство d3d и рисовать им? Скорее вопрос стабильности такого подхода.
Можно ли в плагине создать d3d11 устройство и дорисовывать в окно игры после неё?
sam0delk1n, плагины самый безболезненный способ написать свой рендер. zCRenderer базовый класс рендера, zCRnd_D3D - игровой. Делаешь производный на любую платформу, хоть dx11, хоть vulkan какой-нибудь
На данном сайте используются файлы cookie, чтобы персонализировать контент и сохранить Ваш вход в систему, если Вы зарегистрируетесь.
Продолжая использовать этот сайт, Вы соглашаетесь на использование наших файлов cookie.