Jump to content

Реализация интерфейса в проекте "oil_refinery_sample"


photo

Recommended Posts

Добрый день, сотрудники компании Unigine.
Разбираюсь в реализации функционала основного интерфейса проекта "oil_refinery_sample". Обнаружил в проекте 2 файла "oil_refinery.cpp":

  1. Первый расположен в ".\source\oil_refinery.cpp", содержит вызов основного метода "main" С++-проекта, в котором:
    • Инициализируется движок;
    • Объявляются ряд глобальных имён (ссылок на методы);
    • Запускается метод engine->main(...)  движка;
      Этот исходник добавлен в дерево проекта и вопросов не вызывает.
  2. Второй расположен в ".\data\oil_refinery\oil_refinery.cpp". В дерево проекта он не добавлен, но содержит объявление всех Widget-в использующихся в основном интерфейсе проекте, логику их инициализации и обработчики взаимодействия пользователя с этими Widget-ами. При этом, в методе "init()" инициализируется переменная "interface" типа "UserInterface" на основе файла ".\data\oil_refinery\oil_refinery.ui", но после этого нигде в этом исходнике не используется.

Вопросы:

  1. Я не нашёл места где в проекте добавляется исходник №2, т.е. в какой момент этот код компилируется и исполняется?
  2. Правильно-ли я понимаю, что наличие кода №2 является каким-то внутренним строгим правилом реализации механизма интерфейсов на движке? Т.е. движок запустит и исполнит его код (код исходника №2) в момент своей инициализации или вызова метода engine->main() вызываемых в основном методе main-проекта вызываемого в исходнике №1?
  3. Структура кода в исходнике №2 содержит методы init(), update(), render(), flush(), shutdown(), что наводит на мысль о некоторой системности структуры этого исходника. Скажите - это какой-то общий подход? Как можно понять его назначение, момент выполнения написанного в нём кода, его, возможно необходимой структуры (набор методов), возможно он требует обязательного наличия одноимённых файлов других типов (таких как *.ui и т.д.) и находится с ними в связке на уровне движка? Но, тогда,  где это задаётся или описывается?
    Относительно структуры я вижу, что при создании проекта типа UnigineScript, методика которого описана по этой ссылке в пунктах 5 и 6 создаются строго определённые файлы с похожей структурой, но с расширением *.usc соответственно, можно положить, что этот-же подход применим и для проектов другого типа. Но при создании C++-проекта подобные файлы (с расширением *.cpp) отсутствуют, что сбивает с толку. Вообщем я понимаю, что не знаю чего-то фундаментального связанного с движком, если есть место где это описано, покажите пожалуйста.
  4. Моя задача на данный момент сводится к добавлению на экране пары checkbox-ов с возможностью выбора режимов (обучение или тестирование). В зависимости от выбора планирую менять логику отображения и функционирования элементов на подобии как это реализовано в самом проекте oil_refinery_sample в интерактивном режиме. Что мне для этого понадобиться (файлы с логикой, ui-файл и т.д.)? Как мне это реализовать? Прошу описать, конечно в общих чертах, для лучшего понимания относительно того как это реализовано в проекте "oil_refinery_sample".
Edited by nikolaj.kormushkin
Link to comment

Николай, это код на UnigineScript. По сути, всё что там написано выполняется в AppWorldLogic (аналог в C++). Можно этот код удалить и перенести на C++ используя те же методы и подходы, но только с учетом особенностей C++ API и языка как такового.

Так получилось потому что раньше у демки был простой UI и для более быстрых итераций был выбран UnigineScript. Это ни в коем случае не значит что так нужно делать в своих проектах.

Чуть больше информации про порядок выполнения и про сам скрипт можно найти тут: https://developer.unigine.com/en/docs/2.10/code/fundamentals/execution_sequence/app_logic_system

How to submit a good bug report
---
FTP server for test scenes and user uploads:

Link to comment

Спасибо. Но исходник "oil_refinery.cpp" имеет расширение ".cpp", если в нём код на UnigineScript, то, разве исходникам на UnigineScript не обязательно иметь расширение "*.usc"?

Link to comment
×
×
  • Create New...