2015-09-30 2 views
2

Я создаю игровой движок, у меня много разных классов. Мой двигатель и игра находятся в одном проекте.Скрытие класса видимости C++

Некоторые классы должны использоваться только для моего игрового движка, а не для игры.

Можно ли скрыть некоторые классы, чтобы сделать их доступными только для классов Engine?

@Edit

я в том числе engine.h в моей игровой класс, а engine.h в том числе и другие классы, которые я хочу, чтобы скрыть от игры.

+0

Что случилось с включением только заголовков, которые определяют классы только для ядра в файлах реализации Engine? – jaggedSpire

+1

Возможно, пространство имен? – Amadeus

ответ

4

Существует много разных подходов, поэтому здесь один из них, как решить это.

Частный конструктор

Делая конструктор Foo частного вы можете гарантировать, что только friend классы могут выделить экземпляры объекта. Этот подход жалуется уже во время компиляции. Один из недостатков заключается в том, что вам нужно перечислить все классы, которым разрешено создавать экземпляры Foo. Если мы говорим о нескольких классах, это будет подходящий способ.

class Foo 
{ 
private: 
    Foo() {} 
    friend class Engine; 
}; 

class Engine 
{ 
    Foo f; // OK 
}; 

class ForeignClass 
{ 
    Foo f; // FAILED to create 
}; 

void main() 
{ 
    Foo f; // FAILED to create 
} 
0

Если вы не включаете заголовки, они не будут «видимыми». Поэтому включите только заголовки класса, который хотите использовать.

+0

Я включил engine.h в свой класс игры, а engine.h включает в себя другие классы, которые я хочу скрыть от игры. –

+4

, поэтому используйте объявления вперед + включить эти классы только в соответствующие файлы CPP движка. –

+0

Я забыл о включении в файлы CPP. Благодаря! –

0

При разработке проекта Game Engine существует немало внимания его процессу проектирования. Одна из самых важных целей - сделать этот проект максимально возможным как модульным, так и многоразовым. Все компоненты вашего двигателя должны быть в собственном проекте, и все содержимое игры должно быть также в собственном проекте. Таким образом, вы можете повторно использовать проект Game Engine для создания нескольких игр только путем создания нового игрового проекта. Таким образом, вам не нужно выделять исходный код игры из самого двигателя и ломать двигатель. Это экономит много времени, работы и проблем в будущем. Рассмотрим этот шаблон дизайна. В потоке проекта, который я показываю ниже, используется API OpenGL.

Проект проекта: Статическая библиотека, содержащая все классы, необходимые для загрузки изображений, звуков, обработки шейдеров, рендеринга объектов на экране и обработки сетевых сообщений.

  • Двигатель: Этот класс будет абстрактным, и он создаст ваше окно, настроит разрешение игры и инициализирует DirectX или OpenGL или любой другой графический API. Класс Game, который находится в собственном проекте, наследует это.
  • AssetStorage: класс, который управляет памятью всех активов.
  • Пакет: класс, который создает типы партий треугольных полос, вентиляторов и т. Д., Которые будут использоваться для отправки вершин на видеокарту.
  • BatchManager: класс, который управляет партиями.
  • CommonStructs: только файл заголовка, содержащий структуры & перечисления, которые являются общими для нескольких классов внутри движка.
  • ExceptionHandler: класс, который обрабатывает все исключения.
  • FontManager: класс, который управляет шрифтами, которые загружаются из файлов текстур.
  • Logger: класс, который будет записываться в файл или в консоль, когда необходимо либо отобразить, либо зарегистрировать сообщение об ошибке, предупреждение или важное сообщение.
  • Настройки: класс, в котором хранятся пользовательские настройки, такие как разрешение, чувствительность мыши и т. Д.
  • Singleton: абстрактный базовый класс, который используется для обеспечения того, чтобы определенные классы могли существовать только один раз за запуск приложения. Примеры, любые типы классов Manger, Engine :: Game - это тип объекта Singleton.
  • Утилита: класс, который не является объектом, но содержит множество полезных функций, которые определяются как статические. Чтобы использовать один из таких, вы должны включить файл * .h и вызвать любой метод, как в Utility::convertToUnsigned(string);
  • Анимация: абстрактный класс, из которого будут образовываться все типы анимации.
  • AnimationGuiMover: тип анимации, ответственный за перемещение объектов Gui.
  • AnimationManager: класс менеджера, который управляет всеми анимациями.
  • AnimationTimer: Тип объекта анимации, основанный на заданном таймере.
  • FileHandler: базовый класс, который будет иметь определенные типы обработчиков файлов, будет получен из
  • MkoFileReader: чтение в пользовательском 2D или 3D объекте.
  • TextFileReader: чтение в текстовом файле.
  • TextFileWriter: Запись в текстовый файл.
  • TextureFileReader: чтение в файле текстуры: png, tga, bmp, jpeg и т. Д.
  • Array2d: Тип объекта Mko.
  • BaseMko: базовый класс для объектов Mko.
  • FontFile: файл 2D-изображения для создания шрифтов.
  • Image2D: Другой тип объекта Mko.
  • Surface3d: Другой тип объекта Mko
  • VisualMko: Любой объект Mko, который имеет ассоциированные визуальные эффекты, такие как спрайт или 3D-модель.
  • ShaderManager: класс менеджера, который обрабатывает все шейдеры.
  • ShaderProgramSettings: Используется для установки программ шейдера OpenGL в соответствии с атрибутами и униформами - в значительной степени зависит от шаблонов.
  • ShaderVariable: Это может быть либо атрибут, либо униформа и в значительной степени зависит от шаблонов.
  • BlockProcess: класс, используемый для блокировки процесса: так, что нам нужно только 1 экземпляр игры, поэтому в окнах он создаст мьютекс, основанный на дескрипторе окна и имени приложения, предотвращая несколько исполнений этого приложения.
  • BlockThread: Используется для создания и уничтожения критических разделов при работе с многопоточным процессом.
  • OpenglThread: определенный класс потоков, используемый для работы с OpenGL
  • VolatileLocker: аналогичен BlockThread, но используется с изменчивыми типами данных.
  • Gui Система:Это иерархия классов; некоторые из которых являются абстрактные базовые классы
  • GuiCompositeElement: абстрактный базовый класс
  • GuiElement: абстрактный базовый класс
  • GuiImage: наследуется от GuiRenderable
  • GuiImageElement: Не наследуют от любого другого класса.
  • GuiLabel: Наследуется от GuiText
  • GuiLayout: абстрактный базовый класс для всех типов компоновки - наследуется от GuiRenderable
  • GuiLayoutAbsolute: Наследуется от GuiLayout
  • GuiLayoutGrid: наследуется от GuiLayout
  • GuiLayoutSlices: Наследуется от GuiLayout
  • GuiLayoutStack: Inherits from GuiLayout
  • GuiLoader: класс, который читается в текстовом файле gui, анализирует данные и конструирует все объекты gui, чтобы уменьшить время сборки при изменении dat a в системе gui.
  • GuiRenderable: Наследуется от GuiCompositeElement но также абстрактный базовый класс
  • GuiScreen: Не может быть потомком другого типа Gui Но содержит Gui детей - наследует от GuiCompositeElement
  • GuiText: Наследуется от GuiRenderable
  • GuiTextArea: Наследуется от GuiText
  • Более Приехать:объектов, таких как обработка звука, сети и т.д.

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

  • main.cpp - Главная точка входа.
  • Игра: Game Class, который запускает игровой цикл, инициализирует все настройки, создает все необходимые объекты и т. Д., И обрабатывает ввод пользователя.
  • GameState: Переключение между воспроизведением, приостановкой и т. Д. Конечный автомат.
  • Недвижимость: Свойства, характерные для этой игры.
  • Более Приехать: Этот проект далек от завершения

Как вы можете видеть, это разработано с идеей игрового движка является также универсальным и модульным, как это возможно, чтобы отделить все игры Логика из Logic Engine. С таким типом процесса проектирования все, что нужно сделать, чтобы создать совершенно другую игру, используя тот же существующий движок, - это удалить проект игры и добавить новый, сохранить все активы в соответствующих каталогах и написать необходимый код для новая игра. Таким образом, вам не нужно беспокоиться о том, чтобы погрузиться в проект проекта Engine Engine через тысячи строк кода, пытаясь определить, что такое код двигателя и что такое код игры с высокой вероятностью взлома двигателя. Такой поток дизайна сэкономит много головных болей и драгоценного времени.

Как вы видите, класс Engine отвечает за создание окна, настройку графического API, создание объектов-менеджера и возможность загрузки и рендеринга ресурсов. С учетом того, что этот класс Engine является абстрактным, класс игры должен наследовать от него и иметь чистые виртуальные методы для управления клавиатурой & Мышь вводит уверенность в том, что каждая игра должна реализовывать способы управления пользователями. Этот проект находится в разработке на протяжении нескольких лет, и еще предстоит сделать еще большую работу. Это решение/игровой движок значительно облегчен по сравнению со всем, что связано с промышленным стандартным движком, и я уже расширяю более 100 000 строк кода, и я даже не упоминал ничего о логике игры, подсчете очков, развитии уровня, физике, ни ИИ.

Смежные вопросы