+ Ответить в теме
Показано с 1 по 20 из 70

Тема: Уроки SDK. Поэтапно с начала.

Комбинированный просмотр

  1. #1
    Вот нашел еще один хороший урок. Я его, кстате, в своем моде применил.
    http://www.civfanatics.ru/threads/7826-SDK-технологии

    Для полного набора нехватает только отобразить новые свойства технологий в экране дерева технологий иконками, при наведении на которые будет всплывать нужная подсказка (у себя в моде я это сделал). Я в той же теме писал как это сделать, но мой урок почти полностью пропал при переезде форума на новый сервер.
    продвинь это сообщение в соцсеть:  
    Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
    Мой мод

  2. #2
    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
    Вот нашел еще один хороший урок. Я его, кстате, в своем моде применил.
    http://www.civfanatics.ru/threads/7826-SDK-технологии

    Для полного набора нехватает только отобразить новые свойства технологий в экране дерева технологий иконками, при наведении на которые будет всплывать нужная подсказка (у себя в моде я это сделал). Я в той же теме писал как это сделать, но мой урок почти полностью пропал при переезде форума на новый сервер.
    Спасибо большое, добавлю ссылку на него. Хороший урок однако, а как новые свойства отображать, там остались кое-где записи, понять можно.
    продвинь это сообщение в соцсеть:  

  3. #3
    Как добавить активный элемент на экран.
    Для начала надо открыть файл нужного нам экрана (он находятся в папке Assets\Python\Screens). Затем добавить объект с которым хотим взаимодействовать (addSlider - слайдер, setText - текст, setButtonGFC - кнопка плюс или минус, и т.д.).
    Нужно иметь ввиду что для взаимодействия с объектом у этого объекта есть три параметра идущие друг за другом в функции создания оъекта: WidgetTypes (тип реакции объекта при взаимодействии), iData1 (число), iData2 (число) (например setButtonGFC("имя объекта", u"", "", X координата, Y координата, длинна, высота, WidgetTypes.WIDGET_GENERAL, -1, -1, ButtonStyles.BUTTON_STYLE_CITY_MINUS)).
    Если хотим отделатся только питоном то достаточно указать WidgetTypes.WIDGET_GENERAL и написать алгоритм в функции def handleInput (self, inputClass) , которая находится в том же файле.
    Но если питона не достаточно (напрмер сделать всплывающую подсказку в питоне у меня не получилось), то прийдется использовать SDK.
    1) Открываем файлы CvEnums.h и CyEnumsInterface.cpp, ищем WidgetTypes и добавляем туда новый. Добавлять надо в конец списка перед , NUM_WIDGET_TYPES, .
    2) Открываем файл CvDLLWidgetData.cpp
    3) Ищем функцию void CvDLLWidgetData:: parseHelp(CvWStringBuffer &szBuffer, CvWidgetDataStruct &widgetDataStruct) - алгоритм подсказки при наведении курсора на объект. Добавляем туда наш widget и алгоритм подсказки (алгоритмы подсказок есть еще в файле CvGameTextMgr.cpp).
    4) Ищем функцию bool CvDLLWidgetData:: executeAction( CvWidgetDataStruct &widgetDataStruct ) - клик по объекту. Добавляем туда наш widget и алгоритм действий.

    Значения переменных widgetDataStruct.m_iData1 и widgetDataStruct.m_iData2 в функциях parseHelp и executeAction это наши iData1 и iData2 которые мы указывали при создании объектов.
    продвинь это сообщение в соцсеть:  
    Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
    Мой мод

  4. #4
    Спасибо, добавил в первый пост. Питоном займусь в ближайшее, относительно время. Так что пригодится весьма и весьма. Заодно хотел спросить.

    В SDK новый параметр будет вызыватся функцией GC.getDefineINT("NEW_PARAMETR"). Это очень медленная функция, поэтому если хотите чтоб с новым параметром расчеты происходили быстро, то надо сделать соответствующие изменения в файлах CvGlobals.cpp и CvGlobals.h на примере существующего параметра MOVE_DENOMINATOR. И уже заместь GC.getDefineINT("NEW_PARAMETR") использовать GC.getNEW_PARAMETR().
    А как удалось выяснить, что она очень медленная? Через установку таймера на выполнение функции? Я вчера CvPlot просматривал, так она там много где используется, например в расчете видимости тайлов. Если заменить её на GC.getNEW_PARAMETR() то это должно по идее ускорить игру, хоть и не намного.

    Вообще, какие основные тормоза в SDK? Я знаю некоторые.
    Callback'и в Питон, их и так большей частью ещё в RevDCM заблокировали, а я оставшиеся заблокировал, теперь даже расчет опыта юнита до следующего уровня у меня идет через SDK.
    Pathfinding - в Caveman2Cosmos они свой сделали, с поддержкой многопоточности и без использования exe-файла, как я понял. Надо будет сделать по аналогии, но мне до это уровня ещё расти и учить.
    Циклы через весь массив, для обнаружения нужной связи. Например через весь набор прокачек, имеется ли такая у юнита. Как бы ещё научить сохранять связи между ними, и автоматически пересчитывать при изменении XML. Эту проблему устранили в Realism Invictus.

    Из мелочей я изменил систему выбора тайла при генерации варваров, теперь тайл для варваров выбирается из одного массива доступных для них. Я кажется у тебя прочитал про это.
    продвинь это сообщение в соцсеть:  

  5. #5
    1) Потому что GC.getNEW_PARAMETR() возвращает число, хранящееся в переменной. А GC.getDefineINT("NEW_PARAMETR") сначала ищет по названию нужную переменную, а только потом возвращает число.
    Когда я начинал осваивать SDK, то сделал чтоб юниты по диагоналям передвигались не так далеко как по вертикалям и горизонталям, и сделал я это через GC.getDefineINT("NEW_PARAMETR"). Игроки, которые играли в мой мод, сразу стали жаловатся что ИИ стал дольше думать. Когда я сделал все через GC.getNEW_PARAMETR(), жалобы исчезли.

    2) Расчет лучшего тайла для города делается в конце каждого хода игроков. Я сделал так чтоб этот алгоритм выполнялся перед ходом поселенца. ИИ запоминает что выбрал лучший тайл, и если не произошли события, которые могут повлиять на выбор, то алгоритм не выполняется.
    Возмжность апгредить юнита в другого проверяется через рекурсивную функцию для каждого юнита каждый ход. Я этот алгоритм вызываю при запуске мода для каждого юнита и сохраняю результат в единственный битовый масив. Этат алгоритм настолько медленный, что мой мод стал долго запускаться. Поэтому я этот алгоритм сделал многопоточным. При запуске моего мода можно посмотреть загрузку процессора, если загрузились все ядра - значит выполняется этот алгоритм.
    Многие расчеты я тоже делаю при запуске мода или игры, и уже в самой игре использую заместь алгоритмов заранее вычесленый результат.
    Есть еще метод замены ветвлений (if else) на математические выражения (современные процессоры не любят ветвления).
    Например
    if (x > 0) {y += x;}
    заменяется на
    y += x * (x > 0);.
    Правда, код после этого делается плохо читаемым, поэтому оптимизацию ветвлений я всегда сопровождаю коментариями оригинального кода
    y += x * (x > 0);//if (x > 0) {y += x;}.

    А в каком файле (и название функции) находится альтернатива Pathfinding в моде Caveman2Cosmos? Хочу себе такое зделать.
    продвинь это сообщение в соцсеть:  
    Последний раз редактировалось NeseryozniyVET; 31.08.2013 в 20:31.
    Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
    Мой мод

  6. #6
    Спасибо, заменю ради интереса GC.getDefineINT("PLOT_VISIBILITY_RANGE") на GC.getPLOT_VISIBILITY_RANGE().


    Расчет лучшего тайла для города делается в конце каждого хода игроков.
    Понятно, тоже займусь этим, нечего каждый ход проверять, где построить новый город.

    Возмжность апгредить юнита в другого проверяется через рекурсивную функцию для каждого юнита каждый ход.
    А это кажется в RevDCM побеждено, туда ведь был включен Sanguo Mod Performance в котором с этой проблемой боролись.

    Есть еще метод замены ветвлений (if else) на математические выражения (современные процессоры не любят ветвления).
    Про такое даже не слышал, запомню на будущее, ещё пригодится.

    А в каком файле (и название функции) находится альтернатива Pathfinding в моде Caveman2Cosmos? Хочу себе такое зделать.
    CvPathGenerator.cpp и CvPathGenerator.h если правильно помню.
    продвинь это сообщение в соцсеть:  

  7. #7
    Ах, да, оставлю ссылку здесь, чтобы не забылась. Как раз в тему. А пока попробую разобраться, что такое профайлер и как им пользоваться на примере Civ4.

    http://forums.civfanatics.com/showthread.php?t=487573
    продвинь это сообщение в соцсеть:  

+ Ответить в теме

Похожие темы

  1. Тайлы с ресами позначены с начала игры?
    от Taras_UA в разделе Civ5 - Игровые вопросы
    Ответов: 1
    Новое: 05.10.2010, 18:18
  2. Тактические уроки двух последних войн Ирака для общевойскового командира
    от Гость в разделе Разговоры обо всём, кроме Цивилизации
    Ответов: 2
    Новое: 18.03.2009, 16:57
  3. Уроки французского
    от BuDDaH в разделе Палаты команды Монархия MTDG2
    Ответов: 5
    Новое: 01.02.2007, 14:21
  4. Уроки C++
    от vpadlo в разделе Civ4 - Модная Цивилизация
    Ответов: 13
    Новое: 21.01.2007, 00:58
  5. Глючит 1.61 рус: с начала игры остается 10 ходов!
    от Mityay в разделе Civ4 - Технические вопросы
    Ответов: 1
    Новое: 17.07.2006, 13:51

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
Рейтинг@Mail.ru

free counters