Да, это будет работать, , если и только если деструктор базового класса является виртуальным, который Вы сделали для Base
базовый класс, но не для IFoo
базовый класс. Если деструктор базового класса является виртуальным, то, когда Вы звоните operator delete
на указателе базового класса, он использует динамическую отправку, чтобы выяснить, как удалить объект путем поиска деструктора производного класса в таблице виртуальной функции.
В Вашем случае множественного наследования, это будет только работать, если базовый класс, Вы удаляете его через, будет иметь виртуальный деструктор; для других базовых классов нормально не иметь виртуальный деструктор, но только если Вы не пытаетесь удалить любые производные объекты через те другие указатели базового класса.
Не зная вашего начального уровня навыков, я предлагаю вам взглянуть на Ogre3D . Это полноценный движок 3D-рендеринга с действительно чистым интерфейсом для работы, легко расширяемый и, что самое главное, он достаточно многоплатформенный, работает в Windows, Linux и Mac OS X. Приведенные примеры и учебные пособия довольно понятны.
Если вы хотите написать свой собственный движок только для OpenGL полностью с нуля, Ogre3D может не подойти ...
Если вы хотите изучить OpenGL, я рекомендую начать с « OpenGL Red Book », а затем просмотреть образцы NeHe . Red Book бесплатен, по крайней мере, в онлайн-формате HTML, есть также загружаемые PDF-файлы.
Однако Red Book и NeHe научат вас в основном тому, как использовать OpenGL; Написание игр - это искусство, и здесь слишком много того, что нужно объяснять, слишком много, чтобы учиться, и слишком много, чтобы читать об этом. Вот только подсказка.
Это базовая структура большинства игр. Надеюсь, это поможет с основами. Конечно, это не полная игра, она не запускается и сильно зависит от того, как вы что-то делаете, но она должна дать вам общее представление.
void update(float k)
{
// k == time in seconds since last update; e.g. 0.02
ship.y += ship.speed_y*k;
}
int main()
{
while(1)
{
if(hasEvents())
{
event_t evt;
getEvent(&evt);
if (evt.type == keypress && evt.key==down)
{
ship.speed_y=1;
}
}
paint();
new_ticks = get_ticks();
update((new_ticks - old_ticks)/1000.);
old_ticks = new_ticks;
}
}
Пара замечаний, некоторые из которых уже были сделаны:
Разработка игр - это огромная многогранная дисциплина. Это сложно, даже если у вас очень хорошие математические навыки и навыки программирования.
Два совета:
Этот сайт помог мне больше всего, когда я изучал opengl.
Понятия не имею, сколько у вас опыта в программировании игр, но я бы начал с чего-то более ограниченного.
Начните с игры на основе 2-мерных плиток (Сокобан и т. Д.) - их относительно легко написать - что-то, где объекты всегда находятся точно на плитке, что делает вещи довольно тривиальными.
Как только вы усвоите принципы этого, игровой цикл, тайминги, обработка пользовательского ввода, модель данных , рендерер и т. д., тогда вы можете сделать что-то более сложное.
Затем вы можете попробовать что-то вроде "Asteroids", для которого потребуется некоторая векторная математика 2d, моделирующая интертия (т.е. интеграция), возможно, немного триггера. и система столкновений, не основанная на плитках.
После того, как вы закончите с этим, вы можете попробовать что-нибудь трехмерное, что снова усложняет математику.
Я бы посмотрел на www.gamedev.net , он содержит несколько отличных руководств для новичков, а на форумах вы найдете множество информация по любой теме, связанной с программированием игр.
Во-первых, вам следует подумать о структуре вашего кода. В каждой игре когда-либо были некоторые варианты следующего:
int main()
{
Screen::Init();
Game::Init();
while (Game::isrunning)
{
Game::Update();
Screen::Render();
}
Game::Shutdown();
return 0;
}
Остальное просто становится деталью реализации. Попробуйте взглянуть на SDL, он обрабатывает множество неприятных вещей программирования Windows (инициализация окна, загрузка OpenGL и т. Д.), Поэтому вы можете сосредоточиться на написании своей игры.
Да, поищите уроки в Интернете. Да, потусуйтесь на GameDev.net. Да, NeHe сбивает с толку и специализирован.
Для OpenGL я бы объединил способность OpenGL SuperBible , чтобы узнать о контексте и возможностях OpenGL, с добрым старомодным поиском Google.
Также полезно знать кого-то, кто может время от времени помогать вам. На GameDev.net есть чаты, и люди дружелюбны.
Во-первых, я не рекомендую использовать OpenGL для вашей первой игры, особенно если вы никогда раньше не программировали. Вам следует серьезно подумать о более новых и простых методах, таких как XNA с C #.
Во-вторых, как и OpenGL, XNA также имеет большое количество руководств в Интернете, которые, я думаю, вы найдете очень полезными.
Если у вас есть никогда раньше не занимался программированием, я рекомендую в качестве начального проекта попробовать создать очень простую игру, такую как Pong или Tic Tac Toe. Я думаю, вы получите хорошее представление о разработке игр в целом. Оттуда вы можете начать свой настоящий проект, основываясь на опыте, который вы приобрели при создании Pong.
Наконец, главный совет, который я могу дать вам, когда вы путешествуете по поиску, - никогда не сдаваться, несмотря на какие препятствия вы столкнетесь при создании своей игры.
Удачи!
Я должен предупредить об использовании nehe, потому что многие люди рекомендовали его. (У меня нет учетной записи, чтобы делать комментарии, извините)
В основном потому, что он только показывает, как что-то делать с фиксированным конвейером вместо шейдеров. Первые несколько руководств могут подойти, чтобы получить представление о том, как получить что-то на экране. Но не тратьте свое время, например, на изучение того, как активировать альфа-смешивание и настройку освещения для фиксированного конвейера, потому что, если вы хотите сделать что-то, что не похоже на игру 1999 года, вам придется заново учиться, как это сделать. все это снова, но с шейдерами. Лучше изучить новый путь с самого начала, имо.
Если вам нужен opengl, но с простотой Python - что было бы неплохо, чтобы сначала понять принцип API - посмотрите обертки: http://pyopengl.sourceforge.net/
Они совместимы с последней версией opengl, и их разработка ведется довольно активно.