Блоки препроцессора
|
|
Saitei | Дата: Вторник, 28 Января 2014, 19:58 | Сообщение # 1 |
старожил
Сейчас нет на сайте
| Почему они оба активны? Я даже ставил #define ST 0 ... Никаких изменений
|
|
| |
OpenGOO | Дата: Вторник, 28 Января 2014, 20:47 | Сообщение # 2 |
почти ветеран
Сейчас нет на сайте
| Может лучше по старинке написать
Код #define OpenGL
#ifdef OpenGL .. #endif // OpenGL
#ifdef DirectX ... #endif // DirectX
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
BellPlayer | Дата: Вторник, 28 Января 2014, 20:51 | Сообщение # 3 |
был не раз
Сейчас нет на сайте
| Если пораскинуть и ничего дополнительного не инклудится, то в данном случае ST заменится на OpenGL, а OpenGL не определено. В первом блоке будет примерно так: <ничего> == <ничего>, да и во втором тоже самое будет. Истина тобиш.
|
|
| |
RUNGOGET2THECHOPAH | Дата: Вторник, 28 Января 2014, 21:03 | Сообщение # 4 |
участник
Сейчас нет на сайте
| OpenGL и DirectX в твоем коде - идентификаторы, не являющиеся макросами, поэтому препроцессор принимает их за нули (строки он сравнивать не умеет, выражение условной директивы может содержать лишь числовые константы и ссылки на макросы). Добавь #define OpenGL 1 и #define DirectX 2, и все будет, как надо.
|
|
| |
Saitei | Дата: Вторник, 28 Января 2014, 21:08 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| OpenGOO, спасибо, так даже элегантней получилось) Извините что так протупил, я за три года впервые к директивам препроцессора вернулся ))))) С помощью них же по сути делают кроссплатформенные приложения?Добавлено (28.01.2014, 21:08) --------------------------------------------- RUNGOGET2THECHOPAH, тогда всё становится на свои места... И Вам спасибо!
|
|
| |
vasua99 | Дата: Вторник, 28 Января 2014, 21:53 | Сообщение # 6 |
GNU follower
Сейчас нет на сайте
| По сути проще реализовать один общий интерфейс для каждого - для OpenGL, и для DirectX. А потом в коде выбирать какой использовать. Ну или с помощью конфигурационного файла. Ну такой интерфейс реализовать тяжелее. Зато потом на стороне клиента поддерживать проще(если например захочешь движок писать)
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
|
|
| |
Saitei | Дата: Вторник, 28 Января 2014, 22:54 | Сообщение # 7 |
старожил
Сейчас нет на сайте
| vasua99, извините пожалуйста, а что в данном случае вы называете интерфейсом?
|
|
| |
vasua99 | Дата: Вторник, 28 Января 2014, 23:42 | Сообщение # 8 |
GNU follower
Сейчас нет на сайте
| Ну если не разбирать подробности, то общая оговоренность(спецификация) относительно каких то функций(как я понял, вы на Си пишете). То есть мы можем например вызвать функцию drawPoint(), передать ей нужные координаты и все. А функция сделает все остальное, в зависимости от платформы, и настроек которые вы задали.
Ну допустим пример с "пустышкой"
Код typedef enum { OPENGL, DIRECTX } Render;
// читаем настройки. RenderInfo *renderInfo = (RenderInfo *)malloc(sizeof(RenderInfo) InitializeRender(renderInfo, Render.DIRECTX); // инициализируем нужный нам рендер, заполняем RenderInfo. // Который может выглядеть например так(упрощенно конечно): typedef struct { Render renderType; void *specificRenderInfo; } RenderInfo;
...
void drawPoint(RenderInfo *renderInfo, int x, int y, int z) { if(renderInfo->renderType == OPENGL) { // рисуем по своему, используя нужные нам свойства рендера, преобразовав его к нужному типу GLSpecificRenderInfo *render = (GLSpecificRenderInfo)(renderInfo->specificInfo); ... } else if(renderInfo->renderType == DIRECTX) { DXSpecificRenderInfo *render = (DXSpecificRenderInfo)(renderInfo->specificInfo); ... } }
...
//Рисуем точку) drawPoint(renderInfo, 10, 20, 30)
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
Сообщение отредактировал vasua99 - Вторник, 28 Января 2014, 23:43 |
|
| |
Saitei | Дата: Вторник, 28 Января 2014, 23:47 | Сообщение # 9 |
старожил
Сейчас нет на сайте
| vasua99, а, да, я это сразу же понял, как только наткнулся на эти директивы) Но всё равно спасибо P.S. нет, С++. К С я немного кошу из-за того что четыре месяца сидел на ассемблере
|
|
| |
vasua99 | Дата: Вторник, 28 Января 2014, 23:52 | Сообщение # 10 |
GNU follower
Сейчас нет на сайте
| Ну если вы немного имеете опыт с ООП, то проблем не должно быть.
Создаем общий интерфейс:
Код interface IRender { void drawPoint(int x, int y, int z); void initializeRender(*Params*); ... };
После создаем по классу для каждого рендера и реализуем этот интерфейс.
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
|
|
| |
maxxC | Дата: Среда, 29 Января 2014, 00:03 | Сообщение # 11 |
был не раз
Сейчас нет на сайте
| Цитата >interface С#\Java головного мозга. У себя мультирендер организовал именно на интерфейсах, разве что обернуть пришлось много чего.
|
|
| |
vasua99 | Дата: Среда, 29 Января 2014, 00:07 | Сообщение # 12 |
GNU follower
Сейчас нет на сайте
| Ну а есть лучше варианты?
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
|
|
| |