Войти
ПрограммированиеФорумОбщее

Связь между разными механизмами/службами движка

#0
10:52, 13 сен. 2012

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

Вопрос вот в чем. Как теперь все это правильно связать, как это вообще делается, не в основном же цикле все перебирать?

основной цикл сейчас представляет из себя нечно типа:

while statemachine != shutdown
{
  пинаем класс ввода(он знает о statemachine)
  пинаем класс сети на получение
  чего-нибудь считаем для сети
  пинаем класс сети на отправку
  чего-нибудь считаем для графики/юнитов/etc
  рендерим один кадр
}


#1
13:59, 13 сен. 2012

Alex
Как вариант. Представим что у тебя сейчас реализованы модули:

- Graphics
- Input
- Network
- Audio

И для того чтобы все другие могли знать о них, сделай интерфейсы для каждого из них:

- IGraphics
- IInput
- INetwork
- IAudio

То есть внутреннюю организацию ты скроешь, предоставив только то, что действительно нужно будет. Далее придумываешь какую-нибудь структуру:

struct EngineObjects
{
    IGraphics* graphics;
    IInput* input;
    INetwork* network;
    IAudio* audio;
};

И данную структуру передаёшь в каждый свой модуль уже в момент когда они все будут созданы. Ну а дальше у тебя каждый модуль может связываться с другими посредством интерфейсов.

#2
14:42, 13 сен. 2012

я примерно в этом направлении и думал, создать некий промежуточный класс типа EventManager который будет разруливать все события между разными модулями.
Однако поскольку я новичек в с++ у меня проблема не столько на уровне логики работы, сколько с самими с++.
Что я имею ввиду:
EventManager инклюдит заголовки всех нужных классов типа network.h input.h ogre.h
остальные классы естественно инклюдят eventmanager.h что бы с ним работать
помимо этого main.cpp тоже инклюдит все что можно, и вот тут я от компилятора получаю массу неприятных сообщений )))

#3
14:49, 13 сен. 2012

Alex
На самом деле всё лучше писать на уровне модулей. Например модуль сети. Пишешь группу классов (для удобства заворачиваешь их в пространство имён network) и связь с этим модулем осуществляется по протоколу самого модуля. Так, чтобы при изменении чего-то в других модулях тебе не пришлось менять сетевой модуль. Всё это относится и к другим модулям. Ну и такие модули можно писать как библиотеки (статические или динамические).

#4
14:51, 13 сен. 2012

Alex
> помимо этого main.cpp тоже инклюдит все что можно, и вот тут я от компилятора получаю массу неприятных сообщений )))
Вот тебе статья, почитай.

P.S.: то что у тебя main.cpp главный файл, это никак не скажется на то, что он первым бы файлом попал в компилятор и его объектный файл первым в линковщик (он может быть любым по счёту).

#5
15:20, 13 сен. 2012

Ну бегло пробежал глазами, некогда, я сейчас на работе )
Я так понял что нужно использовать forward declaration что бы все это разрулить?

#6
15:21, 13 сен. 2012

Alex
> Я так понял что нужно использовать forward declaration что бы все это разрулить?
Да.

#7
15:24, 13 сен. 2012

Ок, спасибо большое что направили в нужном направлении, а то я что-то раньше в дельфи с такими проблемами не сталкивался )

ПрограммированиеФорумОбщее

Тема в архиве.